Нам нравиться jQuery — многие вещи становиться понятнее, проще, более проверяемы (тестируемы) используя JavaScript, взамен ASP.NET. По этой причине у наших проектах содержится много JavaScript кода. В идеале, мы хотим писать читабельный код (даже 3rd Party файлах) и при развертывании выполнять обфускацию и компрессию нашего кода. Для этого мы добавим еще один этап в процесс билда нашего проекта, который и будет выполнять оговоренные задачи.Что мы и сделали.
Во-первых, мы используем перенесенный на .NET компрессор Yahoo YUI, который доступен в сводном доступе на CodePlex. (Обратите внимание, YUICompressor поставляется с MSBuild Task, которую можно использовать в дополнение (или в качестве альтернативы) к моему подходу).
Мы взяли библиотеку и завернули ее в простое консольное приложение, которое принимает на вход первым параметром — путь к отладочным файлам JavaScript, вторым — целевой каталог, в который будут помещены уже сжатые файлы.
Во-первых, мы используем перенесенный на .NET компрессор Yahoo YUI, который доступен в сводном доступе на CodePlex. (Обратите внимание, YUICompressor поставляется с MSBuild Task, которую можно использовать в дополнение (или в качестве альтернативы) к моему подходу).
Мы взяли библиотеку и завернули ее в простое консольное приложение, которое принимает на вход первым параметром — путь к отладочным файлам JavaScript, вторым — целевой каталог, в который будут помещены уже сжатые файлы.
using System;
using System.IO;
using Yahoo.Yui.Compressor;
public class Program
{
public static void Main(string[] args)
{
var input = args[0];
var output = args[1];
if (!Directory.Exists(output))
{
throw new ArgumentException(string.Format("The output directory '{0}' doesn't exist", output));
}
if (Directory.Exists(input))
{
CompressDirectory(input, output);
}
else if (File.Exists(input))
{
CompressFile(input, output);
}
else
{
throw new ArgumentException(string.Format("{0} isn't a known directory or file", input));
}
}
public static void CompressDirectory(string root, string outputDirectory)
{
Console.WriteLine("Compressing all .js files within: " + root);
foreach (var file in Directory.GetFiles(root, "*.js"))
{
CompressFile(file, outputDirectory);
}
foreach (var directory in Directory.GetDirectories(root))
{
//skip .svn folders and what not
if ((new DirectoryInfo(directory).Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
{
var newOuputDirectory = outputDirectory + directory.Substring(root.Length) + "\\";
CompressDirectory(directory, newOuputDirectory);
}
}
}
public static void CompressFile(string file, string outputDirectory)
{
var name = Path.GetFileName(file);
Console.WriteLine("Compressing file: " + name);
using (var sw = new StreamWriter(outputDirectory + name))
using (var sr = new StreamReader(file))
{
var compressed = JavaScriptCompressor.Compress(sr.ReadToEnd(), false);
sw.Write(compressed);
}
}
}
* This source code was highlighted with Source Code Highlighter.
Скомпилированное консольное приложение мы поместили в директорию с нашим решением. Дальше, открываем свойства нашего проекта, переходим на вкладу Build Events и вводим следующее в поле "Post-build event command line":
$(SolutionDir)..\Tools\YUICompressor\YUICompressor.exe $(ProjectDir)\content\js\debug\ $(ProjectDir)\content\js\release\
Теперь, всякий раз, когда мы будем выполнять билд, все наши .js файлы лежащие в content/js/debug/ будут сжаты и помещены в content/js/release/.
Последний шаг заключается в использовании метода HtmlHelper выражения для добавления javascript файла:
public static string IncludeJs(this HtmlHelper helper, string javascriptFile)
{
#if DEBUG
var subfolder = "debug";
#else
var subfolder = "release";
#endif
var path = string.Format("{0}/Content/js/{1}/{2}.js", _applicationPath, subfolder, javascriptFile);
return string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>", path);
}
* This source code was highlighted with Source Code Highlighter.
Использование которого выглядит:
<%= Html.IncludeJs("jquery") %>
<%= Html.IncludeJs("main") %>
<%= Html.IncludeJs("jquery_validate") %>
* This source code was highlighted with Source Code Highlighter.
Перевод статьи Compressing JS files as part of your build process