14

快速说明 - 我的版本控制是为了缓存破坏。将查询参数添加到脚本请求末尾的常见做法不适用于所有浏览器。迄今为止我发现的最简单和最混乱的方法是对我的整个部署文件夹名称进行版本控制。

-- scripts.v1
-- scripts.v2

但这非常混乱,并且也增加了部署时间(我使用 S3 作为我的 CDN)。有谁知道这个的替代方法?

编辑

看来,我也不是很清楚。让我更明确一点。

我在我的网站上使用 requirejs。这是一个非常繁重的 JavaScript 应用程序,具有频繁的更新和迭代。现在有了 requirejs,我可以可靠地确保浏览器提供最新版本的唯一方法是对我的整个部署文件夹名称 (javascript) 进行版本控制,并将所有文件再次上传到 S3。然后我使用该data-main方法设置项目的基本路径。

由于许多原因,这非常麻烦。即使代码更改只是几行代码,也必须重复整个过程。还有其他一些不错的方法可以让 requirejs 知道文件有版本吗?就像,如果我打电话

require(["superImportantJSFile"], function(){})

它会知道当前版本是superImportantJSFile.v4.js或类似的东西。

我希望我现在更清楚了。关于社区一般如何做到这一点的任何建议?我很确定这一定是一个常见的场景,但我还没有找到一个好的解决方案

4

3 回答 3

3

我喜欢使用构建后步骤,将静态资源放入包含版本控制版本号的路径的文件夹中。例如,源代码控制修订号 1234 将导致创建路径:/1234/scripts/*。这些目录也在 CDN 中创建,其中包含正确版本的资产。

在模板中的 require.js 配置中,我们将 baseURL 替换为适当的修订版,该修订版通过配置文件控制,例如:

var require = {
    baseUrl: "%%resDir%%",
    ...
};

这使得在几个不同版本之间更改资产版本变得很容易,这些版本都可以保留在 CDN 上而不会引起任何冲突。它还解决了浏览器缓存破坏问题。

于 2013-11-04T20:08:31.527 回答
3

HTML5 Boilerplate提供了我见过的最优雅的解决方案之一。他们有可用于Apachenginx的配置。从那里您可以在script标签内的文件名中添加时间戳,如下所示:

<script src="scripts/app.20130728.js"></script>

Web 服务器将重写为scripts/app.js.

于 2013-07-28T18:15:06.733 回答
2

您可以使用map(请参阅http://requirejs.org/docs/api.html#config-map)为您的 RequireJS 配置添加别名,例如:

require.config({ /* ... other config.... */
     map: { '*': {'superImportantJSFile': 'superImportantJSFile.v4'} }
})

所以你只有一个地方可以更新:)

您提到了使用 CDN,这是一个很好的用例,可以不将这些文件放在最小化的r.js捆绑包中(如果您正在使用该工具)。但是如果这些文件经常更新,那么打包你的模块r.js并更新整个代码可能是有意义的。

于 2013-09-14T05:43:28.227 回答