Сократите код JavaScript и добавьте номер версии, используя VS2010 - PullRequest
13 голосов
/ 07 октября 2011

У меня есть несколько целей, которых я хотел бы достичь, но я не уверен, как туда добраться:

  1. Создание развертывания одним щелчком для моего веб-проекта, включающего минимизированный файл JavaScript
  2. Версия моего уменьшенного файла JavaScript для предотвращения кэширования статического содержимого в браузере при каждом запуске новой сборки
  3. Ссылка на версионный файл JavaScript в сборках RELEASE и неминифицированную версию файлов JavaScript в сборках DEBUG

Из этой статьи:

http://encosia.com/automatically-minify-and-combine-javascript-in-visual-studio/

Я добавил JSMin для минимизации моих файлов с помощью команды, подобной этой:

"$(SolutionDir)Tools\jsmin.exe" < "$(ProjectDir)Scripts\myfile.js" > "$(ProjectDir)Scripts\myfile.min.js"

Я также добавлю это на свои веб-страницы для сохранения неминифицированных файлов в режиме отладки:

    <% if (HttpContext.Current.IsDebuggingEnabled) { %>
             <script type="text/javascript" src="scripts\myfile.js"></script>
    <% } else { %>
             <script type="text/javascript" src="scripts/myfile.min.js"></script>
    <% } %>

Так что на самом деле у меня остается попытка выяснить, как не допустить, чтобы myfile.min.js воспринимался веб-браузером как статический контент при его обновлении. Если бы моей целью не было развертывание одним щелчком, я мог бы просто добавить номер версии вручную, но это не похоже на надежный подход. Мысли?

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Этот ответ немного запоздал, но я думаю, что это достаточно надежный подход к тому, чтобы убедиться, что поведение кэширования синхронизировано с файлом на основе контрольной суммы самого файла.

<script type="text/javascript" src="/Scripts/Scripts.min.js?v=<%= Utils.GetFileHash("/Scripts/Scripts.min.js") %>"></script>

И в вашем классе Utils у вас есть метод, который генерирует контрольную сумму файла

public static string GetFileHash(string path)
    {
        string hash = (string)HttpContext.Current.Cache["_hash_" + path];

        if (hash == null)
        {
            // Get the physical path of the file
            string file = HttpContext.Current.Server.MapPath(path);

            // Code for MD5 hashing omitted for brevity
            hash = Utils.GetMD5(file); 

            // Insert the hash into the Cache, with a dependency on the underlying file
            HttpContext.Current.Cache.Insert("_hash_" + path, hash, new System.Web.Caching.CacheDependency(file));
        }

        return hash;
    }

Это кэширует хеш файла, поэтому его нужно вычислять только при каждом изменении файла.

Кроме того, CacheDependency гарантирует, что если вы измените свой файл .js, он будет гарантировать, что хэш будет восстановлен.

Надеюсь, это поможет, это то, что я использую на одном из моих производственных сайтов.

4 голосов
/ 07 октября 2011

Вместо того, чтобы засорять ваш исходный код символом if/else повсюду, вы можете рассмотреть вариант реализации IHttpFilter, который выполняет минимизацию на лету. Что-то вроде , что делает эта статья , должно работать хорошо.

Ваш javascript должен быть кэшируемым, а накладные расходы на минификацию на веб-сервере будут минимальными. Реализация его как IHttpFilter также означает, что вам не нужно добавлять маршруты или изменять существующие URL-адреса, и вы можете условно добавить IHttpFilter только в конфигурацию вашего релиза, чтобы вы могли отлаживать свой javascript во время разработки.

Что касается управления версиями, то вспомогательный HTML-код ( здесь есть ссылка с дополнительной информацией ) мог бы решить эту проблему, добавив номер версии в качестве параметра строки запроса. Вы могли бы даже пойти так далеко, что ваша отладочная версия IHttpFilter выдает исключение, если параметр версии не существует, поэтому у вас есть что-то, что напоминает вам использовать HTTP-помощник всякий раз, когда вы добавляете новый файл javascript.

4 голосов
/ 07 октября 2011

Я думаю, что у меня есть относительно подходящий ответ, но обратная связь будет принята с благодарностью:

  1. Автоматически обновлять номер версии в информации о сборке.
  2. Отражать номер версии сборки при включении файла JavaScript. Так как я использую MVC, мне пришлось воспользоваться советом из этого ТАКОГО сообщения и так что-то вроде этого:

script type = "text / javascript" src = '@ Url.Content ("~ / Scripts / myfile.min.js? v =" + TypeOf (MyProject.Web.Controllers.MyController) .Assembly.GetName (). Version.ToString ())

Мысли об этом подходе?

...