在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来将buildNumber
replace为某种types的版本号,而这些版本号随每个版本而变化。
这是我的解决scheme(紧急情况):
- 在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");
-
并在
.js
之后添加?v=x.0
url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js?v=1.0'));
要么
(/^data\:|\?/.test(d)||c?"":".js?v=1.0");