13

我有一些我想实现的目标,但我不确定如何实现:

  1. 为我的 Web 项目创建一个单击部署,其中包含一个缩小的 javascript 文件
  2. 对我的缩小 JavaScript 文件进行版本控制,以防止在推送新版本时浏览器缓存静态内容
  3. 在 RELEASE 构建中引用版本化的 JavaScript 文件,以及在 DEBUG 构建中引用 JavaScript 文件的非缩小版本

从这篇文章:

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 在更新时被网络浏览器视为静态内容。如果我的目标不是单击部署,我可以手动添加版本号,但这似乎不是一个可靠的方法。想法?

4

3 回答 3

5

这个答案有点晚了,但我认为这是一种相当可靠的方法,可以根据文件本身的校验和确保缓存行为与文件同步。

<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 文件,它将确保重新生成哈希。

希望这会有所帮助,这是我在我的一个生产网站中使用的。

于 2012-02-19T05:56:28.283 回答
4

我想我有一个相对合适的答案,但非常感谢您的反馈:

  1. 自动更新程序集信息中的版本号。
  2. 包含 JavaScript 文件时反映程序集版本号。因为我使用的是 MVC,所以我不得不使用这个SO post中的建议,所以像这样:

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

对这种方法的想法?

于 2011-10-07T15:19:33.517 回答
4

与其把你的源代码到处乱扔if/else,你可以考虑实现一个IHttpFilter即时缩小的方法。像本文所做的那样应该可以很好地工作。

您的 javascript 应该是可缓存的,并且网络服务器上的缩小开销将是最小的。实现它还IHttpFilter意味着您不必添加路由或更改现有 URL,并且您可以IHttpFilter仅在发布配置中有条件地添加,因此您仍然可以在开发期间调试您的 javascript。

至于版本控制,HTML 帮助程序(这里有一个包含更多信息的链接)可以通过将版本号作为查询字符串参数很好地解决问题。IHttpFilter如果版本参数不存在,您甚至可以让您的调试版本抛出异常,因此您可以在添加新的 javascript 文件时提醒您使用 HTTP 帮助程序。

于 2011-10-07T18:10:05.510 回答