有点晚了,但我只是在这里分享我自己的问题的经验。
正如问题评论中所讨论的,捆绑包被定义为cs文件的一部分(通常是App_Start中的BundleConfig.cs)。因此,捆绑包是在编译时定义的,在应用程序启动时,它们将被添加到集合中并变得可用。
现在,有趣的一点。在运行时,优化框架查看包含的文件并创建内容的哈希,并将其作为版本查询字符串附加到捆绑请求中。因此,当调用捆绑包时,生成的 uri 如下所示。
http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81
这个版本号 v=... 是完全动态的。如果捆绑包中的任何文件内容发生更改,则将重新生成此版本,否则将保持不变。
现在来回答问题,
[1] 这是由框架自动完成的,无需为此做任何额外的事情。每次更改文件内容时,都会生成新的版本号,客户端将获得更新的脚本。
[2] 不可能。如果捆绑包中包含的文件发生更改,则必须重新编译。
[3] 是的,可以使用。自定义版本号可以添加如下。
@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])
但是小心!这将删除基于文件内容的自动版本控制。
此外,如果同一文件有多个版本可用,并且我们总是希望包含可用的最新版本,则可以通过在捆绑配置中包含 {version} 通配符来轻松实现,如下所示。
bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts")
.Include(
"~/Scripts/Vendor/someScript-{version}.js"
));
/Scripts/Vendor
因此,如果文件夹 someScript-2.3.js someScript-3.4.js中有 2 个脚本
然后文件someScript-3.4.js
(更高版本)将自动包含在内。当一个新文件someScript-4.0.js
被添加到文件夹中时,它将被提供给客户端,而无需重新编译/重新启动。