【问题标题】:require.js - How can I set a version on required modules as part of the URL?require.js - 如何将所需模块的版本设置为 URL 的一部分?
【发布时间】:2012-12-12 05:01:11
【问题描述】:

我正在使用 require.js 在我的应用程序中要求 JS 模块。

我需要一种方法来通过不同的请求 URL 来破坏新 JS 模块上的客户端缓存。

即,如果文件hello/there.js已经缓存在客户端,我可以更改文件名强制浏览器获取新文件。

换句话说,对于模块hello/there,我希望require.js根据可访问的版本字符串请求url hello/there___v1234___.js(文件名可能看起来不同,这只是一个示例)在客户端上。

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 那么你在服务器上有一个名为“there___v1234___.js”的文件?
  • 我使用了重写子句,以便服务器提供正确的文件。

标签: javascript requirejs browser-cache


【解决方案1】:

我对 urlArgs 解决方案感到非常沮丧,最后放弃了 implemented my own fix 直接进入 require.js。如果您愿意修改您的库版本,此修复将实现您的理想解决方案。

你可以在这里看到补丁:

https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67

添加后,您可以在需要配置中执行以下操作:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

使用您的构建系统或服务器环境将 buildNumber 替换为修订 ID 或软件版本。

像这样使用要求:

require(["myModule"], function() {
    // no-op;
});

将导致需要请求此文件:

http://yourserver.com/scripts/myModule.buildNumber.js

补丁将忽略任何指定协议的脚本,并且不会影响任何非 JS 文件。

在我们的服务器环境中,我们使用 url 重写规则去除 buildNumber,并提供正确的 JS 文件。这样我们就不必担心重命名所有的 JS 文件了。

这适用于我的环境,但我意识到有些用户更喜欢前缀而不是后缀,应该很容易修改我的提交以满足您的需求。

这里有一些可能重复的问题:

RequireJS and proxy caching

Prevent RequireJS from Caching Required Scripts

【讨论】:

    【解决方案2】:

    好的,我为您搜索了“requirejs cache bust”并找到了this existing SO answer,它说您可以使用urlArgs 参数配置requireJS,这只是部分解决方案,但它可能足以满足您的即时需求.

    也就是说,cachebusting 问题充满挑战,许多“解决方案”实际上并不能完全解决问题。唯一可维护的方法(恕我直言,到目前为止)是使用完整的资产管理系统,如 Ruby on Rails 资产管道或连接资产或您选择的服务器端框架的等价物。这些可以正确计算每个文件内容的校验和(通常是 MD5 或 SHA1),并为您提供需要作为 URL 放入 HTML script 标记中的文件名。因此,不必费心根据版本号手动更改文件名,只需使用校验和,因为它们很容易自动化且万无一失。

    据我所知,开箱即用的 requirejs 无法为您完成缓存破坏方面的工作。您可能想阅读this google groups thread。否则,您可能需要将 requirejs 与其他工具/脚本配对,以获得良好的 cachebuster 校验和。

    【讨论】:

    • 仅供参考,我不会手动重命名文件。我在服务器上进行了重写,以便它只提供没有版本字符串的文件。我们只是说文件命名不是这里的问题,而是如何让 require.js 为我正确处理它。我会看看你链接到的那个论坛帖子。
    • 哦,常规的 requirejs 缓存清除解决方案对我不利,因为添加参数意味着文件从不缓存。我只希望浏览器在有新版本时获取文件,而不是每次请求。
    • 你真的读过我链接的答案吗?如果你使用像 ?v=2 这样的静态参数,它会被很好地缓存。
    • 你确定吗?据我记得,参数总是禁用缓存。我错了吗?
    • 我认为这里没有硬性规定或标准中包含的行为,但是对于 apache,例如,文档状态“通常,带有查询字符串参数的请求会为每个请求单独缓存唯一的查询字符串”。并不是说查询字符串的存在会禁用缓存,只是 ?v=24 和 ?v=25 被认为是 2 个不同的资源。 httpd.apache.org/docs/2.2/mod/mod_cache.html
    【解决方案3】:

    就像 requirejs 的创建者建议的那样做:

    var load = requirejs.load;
    requirejs.load = function (context, moduleId, url) {
      // modify url here
      url = url.substring(0, url.lastIndexOf('.')) + '.' + VERSION + url.substring(url.lastIndexOf('.'));
      return load(context, moduleId, url);
    };
    

    https://github.com/jrburke/requirejs/wiki/Fine-grained-URL-control

    【讨论】:

      【解决方案4】:

      HTML5 Boilerplate 有 ant-build-script 重命名您的文件以及出于这个确切原因对它们的任何引用和 can do alot more。如果您还没有,值得一试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多