缓存破坏方案与r.js(require.js)不兼容?

时间:2014-10-14 22:34:26

标签: requirejs browser-cache requirejs-optimizer

在我的应用程序中,我希望有一个环境配置,为每个部署使用不同的版本名称,以便应用程序正确缓存已被破坏,并且用户的浏览器缓存中没有过时的代码版本。注意我一直关注此guide

因此,在main.js中,在我做任何事情之前,我使用通用配置调用require.config,该配置使用当前日期/时间来破坏环境配置文件中的缓存,然后 之后加载环境配置,我使用环境“config.version”作为urlArgs的一部分,以保证包含新部署的代码而不是陈旧版本。请注意,配置文件中的对象还具有将在整个应用程序中使用的其他属性(例如,Google Analytics分析帐号)。

似乎我的r.js构建文件很好,如果我删除第一个允许我设置环境/配置依赖的require.config,但是当我重新添加它时,我正在使用的基础结构JS模块分组第三方脚本chokes说它找不到我的下划线lib(或者我在那里包含的任何lib)。请注意,即使我不包含environment / config并且只进行两次require.config调用,也会产生相同的错误。有两个require.config调用会导致此错误吗?谢谢你的帮助。

//Error:
Error: ENOENT, no such file or directory '<%root_folder%>\dist\js\underscore.js'
    In module tree:
        infrastructure

我的主要JS文件

//main.js
require.config({
  baseUrl: "js",
  waitSeconds: 0,
  urlArgs: "bustCache=" + (new Date).getTime()
});
require(["environment/config"], function(config) {
  "use strict";
  require.config({
    urlArgs: "bustCache=" + config.version,
    baseUrl: "js",
    waitSeconds: 0,
    paths: {
      underscore: "lib/lodash.underscore-2.4.1-min",
    },
    shim: {
      "underscore":{
        exports : "_"
      }
    }
  });
  //commented out, b/c not needed to produce the error
  //require(["jquery", "infrastructure"], function($) {
    //$(function() {
      //require(["app/main"], function(app) {
        //app.initialize();
      //})
    //});
  //});
});

这是构建文件......

//build file
({
    mainConfigFile : "js/main.js",
    appDir: "./",
    baseUrl: "js",
    removeCombined: true,
    findNestedDependencies: true,
    dir: "dist",
    optimizeCss: "standard",
    modules: [
        {
            name: "main",
            exclude: [
                "infrastructure"
            ]
        },
        {
            name: "infrastructure"
        }
    ],
    paths: {
        "cdn-jquery": "empty:",
        "jquery":"empty:",
        "bootstrap.min": "empty:"
    }
})

这里是infrastructure.js

 define(["underscore"], function(){});

配置文件(将包含更多密钥,例如Google Analytics分析帐号和其他特定于环境的信息。)

//config.js
define({version:"VERSION-XXXX", cdn: { jquery: "//path-to-jquery-1.11.0.min" }});

命令我正在运行:“r.js -o build.js”

1 个答案:

答案 0 :(得分:1)

好的,是的,两个require.config来电是个问题。 在运行时,多次调用config绝对没问题。但是,在构建时r.js无法跟踪调用。所以如果你的 build 取决于以后对require.config的调用,那么你将遇到问题。

我看到您对require.config的第二次调用不包含根据第一次调用后加载的内容计算的任何值,urlArgs除外,因此您可以从第二次调用中移动所有内容调用第一个,urlArgs除外。