在require.js data-main上过期缓存

时间:2012-06-18 18:34:26

标签: javascript caching requirejs browser-cache amd

我正在使用require.js和r.js打包我的AMD模块。我正在使用jquery& requirejs通过以下语法:

<script data-main="/js/client" src="/js/external/require-jquery.js"></script>

这一切都很有效。邮政包装,但我遇到了很多问题,铬和&amp;移动safari持有client.js的缓存版本。我想向client.js添加一个缓存器,但我似乎无法弄清楚如何使用上面的语法来实现它。

我尝试了一些变体:

<script data-main="js/client.js?b=busted" src="/js/external/require-jquery.js"></script>

但现在需要尝试从/获取client.js,而不是/js,所以它是404s。

我也尝试添加

urlArgs : "bust="+new Date().getTime()

require.config,但似乎没有效果。

我也尝试将相同的值添加到app.build.js,但是当它在那里时,r.js不再连接我的js文件,只是对它们进行了解释。

破坏require.js数据主脚本缓存的正确语法是什么?

2 个答案:

答案 0 :(得分:74)

您如何定义require.config?我认为在导入require.js之前它要生效,你需要像这样编码:

<script type="text/javascript">
    var require = {
        baseUrl: "/scripts/",
        waitSeconds: 15,
        urlArgs : "bust="+new Date().getTime()
    };
</script>
<script data-main="app/main" src="/scripts/require.js"></script>

具体来说,一个名为&#39;的对象需要&#39;必须在导入require.js之前构造。

<强>更新

正如Jesse在下面的评论中指出的那样,您应该将一些增强功能应用于您的require {}对象以供生产使用。以上示例来自RequireJS文档,并尽可能少地修改以回答此问题。

以下是生产用途需要考虑的一些事项:

  • 您应该使用开发环境中的内部版本号,而不是使用当前日期时间作为缓存清除变量。这允许您的客户端在版本之间缓存Javascript,但会在您进行软件更新时刷新其缓存。
  • Jesse还使用require {}的功能来指定依赖项,而不是使用脚本的data-main属性。我不知道这是否严格更好,但我认为它看起来更干净。
  • 根据您的需要调整waitSeconds。我使用了RequireJS文档中的示例值,但您应该根据需要调整值或省略它。

因此,如果您应用这些技术,您的代码可能如下所示:

<script type="text/javascript">
    var require = {
        baseUrl: "/scripts/",
        waitSeconds: 15,
        urlArgs : "bust="+{{buildNumber}},
        deps : ['app/main']
    };
</script>
<script src="/scripts/require.js?bust={{buildNumber}}"></script>

注意,在这种情况下,{{buildNumber}}是服务器提供的值。

更新2

urlArgs缓存清除解决方案存在问题。遗憾的是,您无法控制可能位于您与用户的Web浏览器之间的所有代理服务器。遗憾的是,其中一些代理服务器配置为在缓存文件时忽略URL参数。如果发生这种情况,您的JS文件的错误版本将传递给您的用户。

我建议您在的Javascript文件名请求中使用buildNumber ,例如buildNumber.myModule.js(前缀)或myModule.buildNumber.js(后缀)。您可以通过修改baseUrl来使用前缀样式:

baseUrl: "/scripts/buildNumber",

请注意缺少&#39; /&#39;在baseUrl的末尾。

您需要使用require.js的修改版本才能使用后缀解决方案。您可以在此处详细了解:https://stackoverflow.com/a/21619359/1017787

显然,在任何一种情况下,您都希望使用某种解决方案将buildNumber替换为随每个版本更改的某种类型的版本号。

答案 1 :(得分:-2)

这是我的解决方案(紧急情况):

  1. 在require.js中找到以下代码:
  2. 开发版

    //Join the path parts together, then figure out if baseUrl is needed.
    url = syms.join('/');
    url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js'));
    url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
    

    OR

    制作版

    e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");
    
    1. 并在?v=x.0

      之后添加.js

      url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js?v=1.0'));

      OR

      (/^data\:|\?/.test(d)||c?"":".js?v=1.0");