使用VS2010压缩JavaScript并添加版本号

13

我有几个目标想要实现,但我不确定如何实现:

  1. 创建一个单击即可部署我的web项目的方式,其中包括一个压缩的javascript文件。
  2. 对我的压缩后的JavaScript文件进行版本控制,以防止当新的构建版本推出时浏览器缓存静态内容。
  3. 在发布版本中引用已经版本化的JavaScript文件,在调试版本中引用未经压缩的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"

调试模式下我将在我的网页中添加此功能以保留非minified文件:

    <% 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被更新时,我需要找出如何防止Web浏览器将其视为静态内容。如果我的目标不是单击部署,我可以手动添加版本号,但这似乎不是一个可靠的方法。有什么想法吗?


你可以添加一个查询参数来进行版本控制:scripts/myfile.min.js?v=1.0 最好使用插值法将 src 字符串与版本号相结合。 - Joseph Yaduvanshi
这不是一个坏的方法。你如何推荐在每次部署时自动更新?v=1.0,而不必手动执行呢? - Blake Blackwell
使用语义化版本控制。每当您进行主要、次要或补丁更新时,请在程序本身中递增相应的版本号。 - Aadit M Shah
2
我对语义化版本控制和app.config方法的问题在于,这是有可能被某些人遗忘的另一件事情。据我所知,一键部署的理念是不需要让某个人了解所有正确部署应用程序的“技巧”。 - Blake Blackwell
每次执行页面时都会生成当前时间。这意味着每当用户加载页面时都要检索静态内容,而不是在内容更改时检索。 - Blake Blackwell
显示剩余3条评论
3个回答

6

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

<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
我认为我有一个比较合适的答案,但是非常感谢您的反馈:
  1. 在程序集信息中自动更新版本号
  2. 在包含JavaScript文件时反映程序集版本号。由于我使用的是MVC,我必须使用这个SO帖子中的建议,因此可以像这样做:

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

对这种方法有什么想法吗?


4
不要在源代码中到处添加if/else,而是考虑实现一个IHttpFilter,在运行时进行缩小。类似于本文所做的这样的东西应该可以很好地工作。
你的JavaScript应该是可缓存的,在Web服务器上进行缩小的开销将是最小的。将其实现为IHttpFilter也意味着您不必添加路由或更改现有的URL,并且您可以仅在发布配置中有条件地添加IHttpFilter,以便在开发期间仍然可以调试您的JavaScript。
至于版本控制,HTML帮助程序(这里有更多信息的链接)可以通过将版本号作为查询字符串参数附加解决问题。您甚至可以让IHttpFilter的调试版本在不存在版本参数时抛出异常,以便在添加新的JavaScript文件时提醒您使用HTTP助手。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接