1

我正在寻找工具(和技术)来帮助对我的 HandlebarsJS 模板中的静态资产(CSS、JS、图像等)URL 进行版本控制。这适用于使用 并在 Windowsexpress下运行的 Node.js Web 应用程序。iisnode出于性能原因,我希望 IIS 直接提供静态资产——而不是为这个管道使用 Node 或其他连接中间件。

根据我过去的做法(使用经典 ASP),我目前的想法如下:

  • 编写一个将资产名称作为输入的 HandlebarsJS 助手。然后,帮助程序将获取该资产的正确版本(时间戳、校验和等)(可能通过查看预先生成的 JSON 对象),并返回要呈现到模板输出中的资产的正确版本化路径。
    • 例如:{{asset 'images/button.png'}}-->//sc.domain.com/images/<version#>/button.png
  • 使用 Grunt 构建一个文件,其中包含将资产名称映射到版本的 JSON 对象。然后 HandlebarsJS 助手将使用它来构建 URL。
  • 让 IIS 重写传入的 URL 以删除版本#,这样就无需在磁盘上实际复制/版本文件名(我们的站点不需要同时在同一文件名下存在多个版本的资产)。

从理论上讲,这对我的目的来说应该是完美的。但是,在我深入研究并编写所有这些基础架构之前,我想看看是否有人知道 a) 这些项目是否已经存在于某个地方,以及 b) 是否有其他方法更适合 HandlebarsJS?

4

1 回答 1

1

好吧,我没有找到更好的选择,所以我最终采用了我上面提出的方法。

对于 grunt 任务,我遇到了grunt-hashmap,它似乎可以完成我想要的一切(还有更多!)。因为我不希望它实际重命名文件,所以我必须在我的 grunt 配置中指定以下内容:

    hashmap: {
        options: {
            output: 'assethash.json'
        },
        all: {
            cwd: 'public/',
            src: ['**/*']
        }
    }

下一部分,Handlebars 助手,看起来像这样(假设params.hashes基本上是require('./assethash.json')

    hbs.registerHelper('versionedUrl', function(file, opts) {
        var hash = (params.hashes && params.hashes[file]) || '';
        if (hash) file = file.replace(/(.*)\/(.*)/, '$1/' + hash + '/$2');
        return (params.appRoot || '') + file;
    });

这会拆分资源的路径,并将哈希作为最后一个路径组件插入。例如:

'js/myscript.js' --> 'js/[hashvalue]/myscript.js'

最后,为了将它们结合在一起,IIS 重写规则如下所示:

           <rule name="Remove Static Content Version">
                <match url="^(m\/js|m\/css|m\/images)/\w+/(.+)$" />
                <conditions />
                <serverVariables />
                <action type="Rewrite" url="{R:1}/{R:2}" appendQueryString="true" />
            </rule>

基本上就是这样!只是想发布这个以防其他人有类似的问题。我也很高兴听到您可以提供的任何改进或建议。

于 2013-07-27T01:39:39.173 回答