Подтвердить что ты не робот

Минимизировать JavaScript и прикрепить номер версии с помощью VS2010

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

  • Создайте развертывание с одним кликом для моего веб-проекта, который включает в себя миниатюрный файл javascript
  • Версия моего миниатюрного файла JavaScript, чтобы предотвратить кеширование браузера статического содержимого при каждом нажатии новой сборки.
  • Ссылка на файл с версией 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 рассматриваться как статический контент веб-браузером при его обновлении. Если бы моя цель заключалась не в развертывании с одним щелчком мыши, я мог бы просто добавить номер версии вручную, но это не похоже на прочный подход. Мысли?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

<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 файл, он удостоверился, что хеш будет восстановлен.

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

Ответ 3

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

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

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