使用 VS2010 缩小 JavaScript 并附加版本号

Posted

技术标签:

【中文标题】使用 VS2010 缩小 JavaScript 并附加版本号【英文标题】:Minify JavaScript and Attach Version Number using VS2010 【发布时间】:2011-12-03 00:59:28 【问题描述】:

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

    为我的 Web 项目创建一个单击部署,其中包含一个缩小的 javascript 文件 版本我缩小的 JavaScript 文件,以防止在推送新版本时浏览器缓存静态内容 在 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 在更新时被 Web 浏览器视为静态内容。如果我的目标不是单击部署,我可以手动添加版本号,但这似乎不是一个可靠的方法。想法?

【问题讨论】:

您可以添加查询参数进行版本控制:scripts/myfile.min.js?v=1.0 最好在 src 字符串中插入版本号。 这不是一个坏方法。您如何建议在每次部署时更新 ?v=1.0 而无需手动执行? 使用语义版本控制。每当您有主要、次要或补丁更新时,请在程序本身中增加相应的版本号。 我的团队通过 app.config 手动进行版本控制。我不同意这种方法 100%,因为你也有AssemblyInfo,你可以get version info。但是,对于每个人来说,更新 app.config 显然比 AssemblyInfo 更容易记住。 嗯,我在语义版本控制和 app.config 方法方面遇到的问题是,它是人们可能会忘记的另一件事。根据我的理解,一键部署背后的想法是,它不应该要求有人知道正确部署应用程序的所有“技巧”。 【参考方案1】:

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

<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;
    

这会缓存文件的hash,所以只需要在文件发生变化时计算它。

此外,CacheDependency 确保如果您要更改 .js 文件,它会确保重新生成哈希。

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

【讨论】:

【参考方案2】:

与其在源代码中到处乱扔if/else,不如考虑实现一个IHttpFilter,它可以即时进行缩小。像what this article does 这样的东西应该可以很好地工作。

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

至于版本控制,html 助手 (here's a link with some more info) 可以通过将版本号作为查询字符串参数很好地解决问题。如果版本参数不存在,您甚至可以让您的IHttpFilter 的调试版本抛出异常,因此您可以在添加新的 javascript 文件时提醒您使用 HTTP 帮助程序。

【讨论】:

【参考方案3】:

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

    Automatically update version number 在装配信息中。 在包含 JavaScript 文件时反映程序集版本号。因为我使用的是 MVC,所以我不得不使用来自 SO post 的建议,所以像这样:

脚本类型="文本/javascript" src='@Url.Content("~/Scripts/myfile.min.js?v=" + typeof(MyProject.Web.Controllers.MyController).Assembly.GetName().Version.ToString())'

对这种方法的想法?

【讨论】:

以上是关于使用 VS2010 缩小 JavaScript 并附加版本号的主要内容,如果未能解决你的问题,请参考以下文章

打开 bootstrap.min.css 崩溃 VS2010

如何在VS2010中更好的编写JavaScript代码

使用 javascript 键入时缩小项目列表

解压缩/解压缩 JavaScript 的工具 [关闭]

压缩/缩小javascript文件的方法[重复]

2010vs ajax怎么使用啊