你是如何定义 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'的对象。
更新
正如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",
注意baseUrl结尾没有'/'。
你需要使用修改过的require.js来使用后缀解决方案。你可以在这里阅读更多信息:https://dev59.com/rGsy5IYBdhLWcg3wyxCi#21619359
显然,无论哪种情况,你都需要使用某种解决方案来用某种随每次发布而变化的版本号替换 buildNumber
。
data-main="/static/code/main.js?git_sha=ae9f10b520"
对我有效。 - Bob Stein