使用nginx / node进行版本控制来提供静态文件的最佳方法

时间:2013-12-06 15:53:44

标签: javascript css node.js nginx static

我实际上有:

  1. Nginx正在运行以提供静态文件(css,js等)
  2. 带有express.js的节点,模板引擎:ECT(我可能会为Swig更改)
  3. 我目前正在尝试找到使用带版本控制的自定义前缀分发静态文件的最佳方法:

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

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

    但是由于我也想让这些静态文件也被客户端的浏览器缓存,所以Nginx使用expire = 30d来提供这些文件。

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

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

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

    所以在html模板中,'myFile.css'的最终网址是这样的:staticPrefix + 'myFile.css?' + staticVersion

    在这种情况下,我只需要在更新其中一个静态文件时重新启动nodejs应用程序。它将使URL更改(根据新日期)和客户端对文件执行新请求。

    有没有更好的方法来处理节点的这种情况?

1 个答案:

答案 0 :(得分:1)

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

我编写了一个包smush来帮助完成缩小任务。前往github page,例如使用和示例代码。

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

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

请告诉我这是否有意义,或者您是否需要进一步澄清。