- PVSM.RU - https://www.pvsm.ru -

HTML-минимизация в Web Essentials 2013

Логотипы Web Essentials и WebMarkupMin
Одним из наиболее существенных нововведений для веб-разработчиков в Visual Studio 2013 стал новый HTML-редактор. В отличие от старого редактора, который представлял из себя смесь из управляемого и неуправляемого кода (и даже использовал некоторые компоненты FrontPage), новый редактор был полностью переписан на управляемом коде (в качестве основы использовался HTML-редактор из WebMatrix).

Стоит отметить, что для ASP.NET Web Forms (файлы с расширениями .aspx, .ascx и .master) по-прежнему используется старый редактор.

Помимо улучшенных средств для работы с HTML-кодом, в новом редакторе также реализована поддержка синтаксиса представлений KnockoutJS [1], AngularJS [2] и Handlebars [3], и IntelliSense для специальных префиксов и META-тегов (Facebook, Twitter, Open Graph, Windows Phone, iOS и др.).

К сожалению, не каждая новинка из мира веб-разработки может попасть в Visual Studio в силу следующих причин:

  1. Многие современные веб-технологии и библиотеки являются Open Source-проектами (например, компиляторы LESS [4] и CoffeeScript [5], верификатор JSHint [6] и т.д.), и некоторые из этих проектов имеют лицензии, которые не позволяют включать их в состав коммерческих продуктов.
  2. Сейчас веб-технологии развиваются настолько быстро, что их поддержка средствами разработки может стать неактуальной в течение одной недели. Поэтому ни частые релизы Visual Studio (сейчас период между релизами сократился с двух лет до одного года), ни периодические обновления не позволяют поддерживать Visual Studio в полностью актуальном состоянии.

Для того, чтобы решить перечисленные выше проблемы сотрудником компании Microsoft Мэдсом Кристенсеном было создано VS-расширение Web Essentials [7]. Исходный код Web Essentials опубликован на GitHub (доступны 2 версии: 2012 [8] и 2013 [9]).

Ниже перечислены дополнительные возможности HTML-редактора из Visual Studio 2013, которые становятся доступными после установки Web Essentials 2013:

  1. Поддержка Zen Coding [10] (более подробную информацию об использовании Zen Coding в Web Essentials можно прочитать в статье Джона Папа «Zen Coding in Visual Studio 2012» [11]) и генератор текста-«рыбы» Lorem Ipsum [12] (например, если ввести lorem10 и нажать клавишу TAB, то в код будут вставлены 10 слов из трактата Цицерона «О пределах добра и зла»).
  2. Команда Go To Definition для тегов <a>, <style> и <script>.
  3. HTML-минимизация выделенного фрагмента кода.
  4. Поддержка HTML-регионов (например, <!--#region main--> Какой-то код… <!--#endregion-->).

Поскольку HTML-минимизация в Web Essentials 2013 была реализована средствами библиотеки WebMarkupMin [13], автором которой я являюсь, то в этой статье мы рассмотрим данную возможность более подробно.

HTML минимизация в Web Essentials 2013 [14]

Рис. 1. Список NuGet-пакетов, которые используются в Web Essentials 2013.

Минимизация фрагмента HTML-кода во многом похожа на аналогичный функционал для JavaScript и CSS: сначала выделяем необходимый фрагмент кода (или все содержимое файла), а затем щелкаем правой кнопкой мыши и в появившемся контекстном меню выбираем команду Web Essentials ► Minify selection (рис. 2).

HTML минимизация в Web Essentials 2013 [15]

Рис 2. Фрагмент HTML-кода до минимизации.

Если минимизация прошла успешно, то на месте выделенного фрагмента будет виден минимизированный код, а в строке состояния Visual Studio будет выведена информация о том сколько нам удалось сэкономить за счет минимизации (рис. 3).

HTML минимизация в Web Essentials 2013 [16]

Рис. 3 Фрагмент HTML-кода после минимизации.

Если во время минимизации произошли ошибки, то выделенный фрагмент кода останется не минимизированным, а в строке состояния будет отображаться сообщение об ошибке.

Теперь посмотрим, что у нас находится «под капотом»:

Листинг 1. Файл MenuItems/MinifyFile.cs.

using EnvDTE;
using EnvDTE80;
using Microsoft.Ajax.Utilities;
using Microsoft.VisualStudio.Shell;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.IO;
using System.Linq;
using System.Windows;
using WebMarkupMin.Core;
using WebMarkupMin.Core.Minifiers;
using WebMarkupMin.Core.Settings;

namespace MadsKristensen.EditorExtensions
{
    internal class MinifyFileMenu
    {
        …
        private static List<string> _htmlExt = new List<string>() { ".html", ".htm", ".aspx", ".ascx", ".master", ".cshtml", ".vbhtml" };
        …

        public static string MinifyString(string extension, string content)
        {
            if (extension == ".css")
            {
                …
            }
            else if (extension == ".js")
            {
                …
            }
            else if (_htmlExt.Contains(extension.ToLowerInvariant())){
                var settings = new HtmlMinificationSettings
                {
                    RemoveOptionalEndTags = false,
                    AttributeQuotesRemovalMode = HtmlAttributeQuotesRemovalMode.KeepQuotes
                };

                var minifier = new HtmlMinifier(settings);
                MarkupMinificationResult result = minifier.Minify(content, generateStatistics: true);
                
                if (result.Errors.Count == 0)
                {
                    EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%";
                    return result.MinifiedContent;
                }
                else
                {
                    EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection";
                    return content;
                }
            }

            return null;
        }
        …
    }
}

Из приведенного выше кода видно, что HTML-минимизация производится с помощью экземпляра класса HtmlMinifier, который был создан с безопасными настройками (запрещено удаление кавычек из атрибутов и удаление необязательных конечных тегов). Поскольку через конструктор класса HtmlMinifier явно не передаются экземпляры JS- и CSS-минимизаторов, то для минимизации встроенного JS-кода будет использоваться минимизатор на базе JSMin [17] Дугласа Крокфорда, а для встроенного CSS-кода – минимизатор на базе Efficient stylesheet minifier [18] Мэдса Кристенсена.

И в завершении статьи постараюсь прояснить некоторые неочевидные моменты, связанные с HTML-минимизацией в Web Essentials:

  1. В отличие, от JavaScript и CSS пока нет возможности минимизировать HTML-файлы прямо из Solution Explorer (доступна только минимизация через HTML-редактор).
  2. Текущая версия WebMarkupMin не может корректно обрабатывать конструкции вида {{…}}, которые обычно используются в представлениях Handlebars, Mustache [19], JsRender [20] и Hogan.js [21]. Поэтому рекомендуется использовать HTML-минимизацию, только для обычных HTML-файлов и представлений KnockoutJS.
  3. При минимизации содержимого тегов <script> и <style>, нужно выделять не только содержимое, но и сами теги.

Более подробную информацию о библиотеке WebMarkupMin вы можете прочитать в моей статье «WebMarkupMin HTML Minifier – современный HTML-минимизатор для платформы .NET» [22].

Ссылки

  1. Официальный сайт VS-расширения Web Essentials [7]
  2. Видео-доклад Мэдса Кристенсена «Visual Studio 2013 for Web Developers: Deep Dive» [23] с конференции //build/ 2013 (проходила с 26 по 28 июня 2013 года)
  3. Видео-доклад Мэдса Кристенсена «Visual Studio 2013 Web Editor Features — HTML Editor» [24]
  4. Статья Мэдса Кристенсена «My road to Visual Studio 2013» [25]
  5. Статья Мэдса Кристенсена «Open static HTML files in the Visual Studio 2013 designer» [26]
  6. Заявка «Add option to minify static HTML and XML files by the WebMarkupMin» [27] на сайте UserVoice
  7. Страница проекта WebMarkupMin [13] на CodePlex
  8. Моя статья «WebMarkupMin HTML Minifier – современный HTML-минимизатор для платформы .NET» [22]

Автор: Taritsyn

Источник [28]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/html/46748

Ссылки в тексте:

[1] KnockoutJS: http://knockoutjs.com/

[2] AngularJS: http://angularjs.org/

[3] Handlebars: http://handlebarsjs.com/

[4] LESS: http://lesscss.org/

[5] CoffeeScript: http://coffeescript.org/

[6] JSHint: http://www.jshint.com/

[7] Web Essentials: http://vswebessentials.com/

[8] 2012: http://github.com/madskristensen/WebEssentials2012

[9] 2013: http://github.com/madskristensen/WebEssentials2013

[10] Zen Coding: http://code.google.com/p/zen-coding/

[11] «Zen Coding in Visual Studio 2012»: http://www.johnpapa.net/zen-coding-in-visual-studio-2012/

[12] Lorem Ipsum: http://ru.wikipedia.org/wiki/Lorem_ipsum

[13] WebMarkupMin: http://webmarkupmin.codeplex.com/

[14] Image: http://taritsyn.files.wordpress.com/2013/10/vs_web_essentials_2013_on_github.png

[15] Image: http://taritsyn.files.wordpress.com/2013/10/html_minification_in_vs_web_essentials_2013_01.png

[16] Image: http://taritsyn.files.wordpress.com/2013/10/html_minification_in_vs_web_essentials_2013_02.png

[17] JSMin: http://www.crockford.com/javascript/jsmin.html

[18] Efficient stylesheet minifier: http://madskristensen.net/post/Efficient-stylesheet-minification-in-C.aspx

[19] Mustache: http://mustache.github.io/

[20] JsRender: http://github.com/BorisMoore/jsrender

[21] Hogan.js: http://twitter.github.io/hogan.js/

[22] «WebMarkupMin HTML Minifier – современный HTML-минимизатор для платформы .NET»: http://taritsyn.wordpress.com/2013/04/26/webmarkupmin-html-minifier-sovremennyj-html-minimizator-dlja-platformy-net/

[23] «Visual Studio 2013 for Web Developers: Deep Dive»: http://channel9.msdn.com/Events/Build/2013/3-503

[24] «Visual Studio 2013 Web Editor Features — HTML Editor»: http://www.asp.net/visual-studio/overview/2013/visual-studio-2013-web-editor-features-html-editor

[25] «My road to Visual Studio 2013»: http://madskristensen.net/post/my-road-to-visual-studio-2013

[26] «Open static HTML files in the Visual Studio 2013 designer»: http://madskristensen.net/post/open-static-html-files-in-the-visual-studio-2013-designer

[27] «Add option to minify static HTML and XML files by the WebMarkupMin»: http://webessentials.uservoice.com/forums/140520-general/suggestions/4148941-add-option-to-minify-static-html-and-xml-files-by-

[28] Источник: http://habrahabr.ru/post/199206/