对 Durandal js 和 html 文件进行版本控制的好策略是什么?
我注意到,在开发过程中,您的浏览器缓存必须禁用,以便您在每次刷新时接收最新文件。这是开发过程中必须的。
但是,我担心的是,当我使用持续部署策略(每天部署多次)进入生产环境时,用户的浏览器将缓存我的应用程序的旧版本,这可能会导致不可预知的行为。
想到的方法是以某种方式对 js 和 html url 进行版本控制,以便在每个请求中嵌入一个版本号。但我不确定如何在 Durandal 框架内实现这一点。
对 Durandal js 和 html 文件进行版本控制的好策略是什么?
我注意到,在开发过程中,您的浏览器缓存必须禁用,以便您在每次刷新时接收最新文件。这是开发过程中必须的。
但是,我担心的是,当我使用持续部署策略(每天部署多次)进入生产环境时,用户的浏览器将缓存我的应用程序的旧版本,这可能会导致不可预知的行为。
想到的方法是以某种方式对 js 和 html url 进行版本控制,以便在每个请求中嵌入一个版本号。但我不确定如何在 Durandal 框架内实现这一点。
好的,这是我前进的方向。基本上,requirejs 中内置了一些东西来处理这个问题。
在 main.js 的顶部,在对 requirejs.config 的调用中,我可以设置一个 urlArgs 属性,该属性将附加到 requirejs 对模块的每个调用。
requirejs.config({
paths: {
'text': 'durandal/amd/text'
},
urlArgs: 'v=1.0.0.0'
});
当我想强制生产用户获取新版本的 requirejs 模块时,我可以增加版本号,这将使浏览器缓存无效。
(在我的项目中,我有一种方法可以将包含我的主 ASP.NET MVC 程序集的程序集的版本号注入到此属性中,但其代码会分散上述示例的简单性)。
希望这对某人有帮助!
对于 .NET,将 main-built.js 文件添加为 App_Start/BundleConfig 中的脚本包:
public static void RegisterBundles(BundleCollection bundles)
{
//...
bundles.Add(new ScriptBundle("~/Scripts/main-built").Include(
"~/App/main-built.js"));
//...
}
引用索引页面上的脚本包:
@if (HttpContext.Current.IsDebuggingEnabled)
{
<script type="text/javascript" src="~/Scripts/require.js" data-main="App/main"></script>
}
else
{
<!-- Remember to run the weyland optimizer to create the main-built.js -->
@Scripts.Render("~/Scripts/main-built")
}
只要您拥有默认的 Web.Release.Config 文件,Visual Studio 就会自动删除调试属性,同时在发布时对您的包进行最小化和版本控制。