【问题标题】:How to exclude urlArgs from build using r.js如何使用 r.js 从构建中排除 urlArgs
【发布时间】:2013-08-25 06:33:45
【问题描述】:

我使用 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"
})

您可以看到它基于 ma​​in.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() {

});

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

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

【问题讨论】:

    标签: javascript requirejs r.js


    【解决方案1】:

    在这方面迟到了,但在这里我使用了解决方案:将 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 仍然成功地应用于浏览器中的模块。希望对您有所帮助。

    【讨论】:

    • 什么是REQUIRE_NOCACHE
    • REQUIRE_NOCACHE 只是我在开发环境中声明的全局布尔变量。当它存在时,它确保在刷新页面时缓存被破坏。
    • 你如何组织你的开发和生产环境?
    • 这是一个宽泛的问题……您具体要问什么?
    • 好吧,你的例子对我不起作用,因为r.js 生成像window &amp;&amp; urlArgs: bust... 这样的结果配置,然后浏览器完全理解它,从而将 bust 添加到每个加载的文件中.所以有点没用。可行的是参数REQUIRE_NOCACHE,在r.js工作期间应该是false,在开发环境中应该是true
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      2.2.0 版本开始,urlArgs 现在接受函数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        相关资源
        最近更新 更多