6

按照文档中的建议,我使用r.js优化器根据构建配置文件组合 js 文件。这是我的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() {

});

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

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

4

3 回答 3

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仍然成功应用于浏览器中的模块。希望有帮助。

于 2015-04-10T18:40:21.890 回答
1

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

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

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

我已经在开发和生产版本中进行了测试,并且可以正常工作!:-)

在 require.specified() 函数上: 使用 requirejs 是否可以在不尝试加载的情况下检查模块是否已定义?

于 2015-10-19T17:24:42.510 回答
0

从 version开始2.2.0urlArgs现在接受函数。

它发送moduleIdurl,因此如果它应该有额外的参数,你可以根据路径进行分段。请参阅https://requirejs.org/docs/api.html#config-urlArgs

于 2021-12-01T02:42:40.593 回答