如何使用r.js从构建中排除urlArgs

时间:2013-08-25 06:33:45

标签: javascript requirejs r.js

我使用 r.js 优化器根据构建配置文件组合js文件,如documentation中所建议的那样。这是我的 build-config.js

({
    baseUrl: ".",
    paths: {
        jquery: '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min',
    },
    name: "main",
    out: "main-built.2013-07-30.js"
})

正如您所看到的,它基于 main.js 文件,以下是它的代码:

requirejs.config({
    baseUrl: 'scripts',
    urlArgs: "bust=" + (new Date()).getTime(),
    paths: {
        jquery: [
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min',
            'lib/jquery-1.9.1.min',
        ],
    },
});

require([
    'layout',
    'cue',
], function() {

});

如果我在 main.js 中保留urlArgs: "bust=" + (new Date()).getTime()所有外部文件(此处是从CDN加载的jquery)看起来像.../jquery.js?bust=1377412213

因此,每当我进行构建时,PITA都会注释掉这一行。我已经阅读了所有文档并搜索了解决方案,但一切都是徒劳的。也许我做错了?

2 个答案:

答案 0 :(得分:2)

这方面迟到了,但这里我使用的解决方案:将urlArgs参数附加到配置中并进行后续调用。

HTML:

<script src="js/libs/require.js"></script>
<script src="js/config.js"></script>
<script>require(['main-app']);</script>

配置文件:

requirejs.config({
  paths: {...},
  shim: {...}
}); 

// Apply the cache bust only for the browser. 
if (window) {
  requirejs.config({
    urlArgs: REQUIRE_NOCACHE ? "bust="+(new Date()).getTime() : null
  });
}

优化器仅接受第一个requirejs.config声明,并忽略后续代码。第二个requirejs.config声明扩展而不是覆盖第一个声明,因此urlArgs仍然成功应用于浏览器中的模块。希望有所帮助。

答案 1 :(得分:1)

以下解决方案适用于您的情况,您将在r.js构建中重命名main.js文件:

urlArgs: require.specified('main') ? "bust="+(new Date()).getTime() : null

上面的代码片段将检查名为&#39; main&#39;的模块,该模块将在开发中匹配,但不会在生产中检查,其中模块名为&#39; main-built.2013-07-30& #39;

我已经在开发和生产版本中进行了测试,它的工作原理! : - )

在require.specified()函数上: With requirejs is it possible to check if a module is defined without attempting to load it?