【问题标题】:Cache-busting scheme incompatible with r.js (require.js)?缓存清除方案与 r.js (require.js) 不兼容?
【发布时间】:2014-12-09 21:07:06
【问题描述】:

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

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

如果我删除允许我设置环境/配置依赖项的第一个 require.config,我的 r.js 构建文件似乎很好,但是当我重新添加它时,我正在使用的基础设施 JS 模块对第三方脚本进行分组,说它找不到我的下划线库(或我在其中包含的任何库)。请注意,即使我不包括 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:"
    }
})

这里是基础设施.js

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

配置文件(将有更多的键,如谷歌分析帐号和其他环境特定信息。)

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

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

【问题讨论】:

  • @Louis,我按要求添加了配置文件。还有什么不清楚的地方吗?
  • 我将错误复制到问题文本中,包含了基础设施.js,并删除了代码中所有多余的引用,以获得观察问题的最小案例。基本上,“infrastructure.js”中包含的任何内容都无法识别,因此会引发错误。如果我消除了对环境/配置文件的依赖来设置代码,那么基础设施 JS 就不会抱怨找不到库。
  • 请注意,即使我不包含 environment/config 并且只进行两次 require.config 调用,也会产生相同的错误,这意味着我实际上尝试过: require.config({//first config object });其次是 require.config({//second config object});在同一范围级别内,并导致错误。

标签: requirejs browser-cache requirejs-optimizer


【解决方案1】:

好的,是的,这是两个require.config 调用的问题。 在运行时,多次调用配置绝对没有问题。但是,在构建时r.js 无法跟踪调用。所以 if 你的 build 依赖于以后对require.config 的任何调用,你会遇到问题。

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

【讨论】:

  • 是的,我确实最终重组了调用,但这意味着我的 CDN 包含必须是内联的,而不是来自配置文件,除非我有其他构建魔法来替换它们。我想随着我深入编写部署脚本的过程,我可能会在 r.js 外部找到一些解决方案,但目前我还没有找到解决这个限制的方法。感谢您的帮助!
  • 在大型应用程序中,我发现自己使用脚本来生成配置或在构建期间修改它们。随着应用程序变得越来越复杂,这似乎是不可避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2017-01-30
  • 2014-02-04
  • 2023-04-04
相关资源
最近更新 更多