需要js缓存设置urlArgs胸围的设置文件

时间:2015-02-12 09:43:03

标签: javascript caching requirejs

我有一个淘汰/需要的应用程序,我正在努力缓存一个特定的文件。可悲的是,这个文件破坏了所有其他javascript文件的缓存。设置可能有点奇怪:

每个视图只是绑定一个淘汰视图模型。它需要require库和系统特定区域的主脚本:

<script data-main="scripts/user" src="~/Scripts/lib/require.js"></script>

上面要求的scripts / user.js文件需要公共文件(包含require设置)和主viewmodel脚本:

require(['./Common'], function (common) {
    require(['userMain']);
})   

scripts / user / userMain.js文件绑定viewmodel并需要视图级别所需的任何内容(例如自定义绑定处理程序)。

define(function (require) {
    require(['ko', 'userViewModel'], function (ko, userViewModel) {
        var userVm = new userViewModel(false);
        userVm.initialise();

        // bound to the wrapper to stop jquery dialog bindings being applied twice
        ko.applyBindings(userVm, document.getElementById('pageWrapper'));
    });
});

然后我们有common.js:

require.config({
    baseUrl: './',
    paths: {
        'userMain': './Scripts/user/Main',
        'userAjax': './Scripts/user/userAjax',
        'userBasicDetails': './Scripts/user/userBasicDetails',
        'userExchangesModel': './Scripts/user/userExchangesModel',
        'userModel': './Scripts/user/userModel',
        'userReportAccessModel': './Scripts/user/userReportAccessModel',
        'usersModel': './Scripts/user/usersModel',
        'userViewModel': './scripts/user/userViewModel',
    ... etc
    ,
    urlArgs: "bust=" + (new Date()).getTime()

文件夹中的每个脚本都需要在其自己的模型中需要的任何内容。

然后设置脚本结构:

scripts\common.js
scripts\user.js
scripts\user\main.js
scripts\user\userAjax
scripts\user\etc...

此设置允许我从其他文件夹引用脚本,而不指定文件在common.js以外的任何位置。缺点是所有js文件都有一个共同的参考,但我可以忍受。 作为一个例子,在'user'('scripts \ report \','scripts \ client'等)的同一级别有4或5个文件夹,如果我想创建 来自这些文件夹中的任何脚本的用户模型我可以简单地“定义(['userModel'],function(userModel)”并且常见将告诉需要去哪里找到该文件。这个系统工作正常,允许我移动随意的文件只会在一个地方改变它们的路径。

当我在common.js中添加新脚本或更改路径时,问题就出现了。由于设置原因,所有其他人都要求破产 通常,公共文件本身会被缓存,所以我必须在新的common.js文件被拾取之前破坏用户的chrome缓存。这显然是交付时的一个大问题 - 页面失败,因为它们找不到新脚本,因为它不存在于同一文件夹中,并且公共已缓存。

任何人都可以建议一种自动破坏common.js或将路径配置移动到单独的必需文件中的方法,以便urlArgs胸围会为我做这件事吗?

非常感谢。

1 个答案:

答案 0 :(得分:4)

在加载RequireJS的script元素之前,添加以下代码:

<script>
  require = {
      urlArgs: "bust=" + (new Date()).getTime()
  };
</script>

RequireJS将选择此作为其初始配置,并通过data-main或任何其他方式加载任何模块,bust参数。

最好从随后的urlArgs来电中删除require.config。它将覆盖之前的选项,因此bust的值将发生变化。通常,模块由RequireJS加载一次且仅加载一次,因此 不会发生同一模块由具有两个不同bust值的同一页面加载。但有些情况我不确定(例如,使用require.undef取消定义模块)。删除后来的urlArgs可以避免出现意外情况。