- PVSM.RU - https://www.pvsm.ru -
Одним из наиболее существенных нововведений для веб-разработчиков в 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 в силу следующих причин:
Для того, чтобы решить перечисленные выше проблемы сотрудником компании Microsoft Мэдсом Кристенсеном было создано VS-расширение Web Essentials [7]. Исходный код Web Essentials опубликован на GitHub (доступны 2 версии: 2012 [8] и 2013 [9]).
Ниже перечислены дополнительные возможности HTML-редактора из Visual Studio 2013, которые становятся доступными после установки Web Essentials 2013:
lorem10
и нажать клавишу TAB, то в код будут вставлены 10 слов из трактата Цицерона «О пределах добра и зла»).<a>
, <style>
и <script>
.<!--#region main--> Какой-то код… <!--#endregion-->
).
Поскольку HTML-минимизация в Web Essentials 2013 была реализована средствами библиотеки WebMarkupMin [13], автором которой я являюсь, то в этой статье мы рассмотрим данную возможность более подробно.
[14]
Рис. 1. Список NuGet-пакетов, которые используются в Web Essentials 2013.
Минимизация фрагмента HTML-кода во многом похожа на аналогичный функционал для JavaScript и CSS: сначала выделяем необходимый фрагмент кода (или все содержимое файла), а затем щелкаем правой кнопкой мыши и в появившемся контекстном меню выбираем команду Web Essentials ► Minify selection (рис. 2).
Рис 2. Фрагмент HTML-кода до минимизации.
Если минимизация прошла успешно, то на месте выделенного фрагмента будет виден минимизированный код, а в строке состояния Visual Studio будет выведена информация о том сколько нам удалось сэкономить за счет минимизации (рис. 3).
Рис. 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:
{{…}}
, которые обычно используются в представлениях Handlebars, Mustache [19], JsRender [20] и Hogan.js [21]. Поэтому рекомендуется использовать HTML-минимизацию, только для обычных HTML-файлов и представлений KnockoutJS.Более подробную информацию о библиотеке WebMarkupMin вы можете прочитать в моей статье «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/
Нажмите здесь для печати.