在require.js data-main上过期caching

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

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

这一切都很好的前后包装,但我遇到了很多问题,铬和移动Safari浏览器持有的caching版本的client.js。 我想添加一个cachebuster client.js,但我似乎无法弄清楚如何使用上述语法。

我尝试了一些变化:

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

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

我也尝试添加

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

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

我也尝试给app.build.js添加相同的值,但是当它在那里时,r.js不再连接我的js文件,只是丑化它们。

什么是正确的语法来破坏一个require.js数据主脚本caching?

你如何定义你的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> 

具体来说,在导入require.js之前,必须构造一个名为'require'的对象。

UPDATE

正如Jesse在下面的评论中指出的那样,您应该将一些增强function应用于您的要求生产使用的对象。 上面的例子是从RequireJS文档中分离出来的,并且尽可能less的修改来回答这个问题。

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

  • 您应该使用开发环境中的内部版本号,而不是将当前的date时间用作caching清除variables。 这允许您的客户端在发行版之间cachingJavascript,但是每当您进行软件更新时,都会导致它们刷新caching。
  • 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

urlArgscaching萧条解决scheme有问题。 不幸的是,你不能控制可能在你和用户的networking浏览器之间的所有代理服务器。 其中一些代理服务器可能会被configuration为在caching文件时忽略URL参数。 如果发生这种情况,您的JS文件的错误版本将被传递给您的用户。

我build议您的Javascript文件名请求中使用buildNumber ,如buildNumber.myModule.js (前缀)或myModule.buildNumber.js(后缀)。 你可以通过修改baseUrl来使用前缀风格:

 baseUrl: "/scripts/buildNumber", 

请注意,在baseUrl末尾缺less“/”。

您将需要使用require.js的修改版本来使用后缀解决scheme。 你可以阅读更多关于这里: https : //stackoverflow.com/a/21619359/1017787

很显然,在任何一种情况下,您都希望使用某种解决scheme来将buildNumberreplace为某种types的版本号,而这些版本号随每个版本而变化。

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

  1. 在require.js中find以下代码:

开发版本

 //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; 

要么

生产版本

 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. 并在.js之后添加?v=x.0

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

    要么

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