【问题标题】:Best way to serve static files using versioning with nginx / node使用 nginx / node 版本控制提供静态文件的最佳方式
【发布时间】:2013-12-06 15:53:44
【问题描述】:

其实我有:

  1. Nginx 运行以提供静态文件(css、js 等)
  2. 带有 express.js 的节点,模板引擎:ECT(我可能会更改为 Swig)

我目前正在尝试找到使用带有版本控制的自定义前缀分发静态文件的最佳方法:

为此,我只设置了一个包含前缀的变量(取决于环境)。 然后对于每个请求,我设置在快速中间件中为 locals 添加前缀,以便在任何 html 模板中访问此变量:

this.use(function(req, res, next) {
    res.locals.staticPrefix = staticPrefix;
    next();
});

但由于我还希望这些静态文件也被客户端的浏览器缓存,因此 Nginx 为这些文件提供 expire = 30d。

现在要强制客户端检索静态文件(例如,如果它已更改),我需要提供带有动态 url 参数的静态 url。

我的第一个想法是在启动 nodejs 应用程序时设置一个版本变量以将其附加到最终 url:

var staticVersion = new Date().getTime();

所以在 html 模板中,“myFile.css”的最终 url 应该是这样的:staticPrefix + 'myFile.css?' + staticVersion

在这种情况下,我只需要在其中一个静态文件更新后重新启动 nodejs 应用程序。它会使 url 改变(根据新的日期)和客户端做一个新的文件请求。

有没有更好的方法来用 node 处理这种情况?

【问题讨论】:

    标签: javascript css node.js nginx static


    【解决方案1】:

    处理静态资源(如 css/js 文件)的最佳方式是在生产环境中缩小它们。根据文件内容使用文件名。这样,每次您更改 js/css 文件中的任何内容时,缩小代码都会在需要时负责生成新文件。您可以挂钩缩小脚本以运行后期部署。

    我写了一个包smush 来帮助完成缩小任务。前往其github page 了解用法和示例代码。

    如果更适合您的用例,您可以使用其他工具/包进行缩小。

    回到您的问题,您可以将 nginx 的根目录设置为您的节点服务器的静态目录(/path/to/node/server/public?)。这样 nginx 将缓存并提供您的静态文件。之后节点服务器将不再为静态资产提供服务。

    让我知道这是否有意义或者您是否需要进一步澄清。

    【讨论】:

    • 嗨,听起来很有趣。我已经有一个通过调用less/闭包编译器的Makefile系统来缩小文件的钩子。基本上,运行make frontend 以缩小所有已更改的内容。但是我没有考虑使用缩小文件的名称来编译模板本身。对于 nginx,是的,这就是我已经在做的事情。您的解决方案/模块看起来更舒服!所以,是的,这完全有道理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2014-01-12
    • 2018-10-23
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多