在HandlebarsJS模板中对静态资源进行版本控制

时间:2013-07-24 21:32:18

标签: handlebars.js gruntjs iisnode

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

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

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

从理论上讲,这一切都应该完全符合我的目的。但是,在我深入研究并编写所有这些基础设施之前,我想知道是否有人知道a)这些项目是否已存在于某处,以及b)是否有其他方法可以更好地用于HandlebarsJS?

1 个答案:

答案 0 :(得分:0)

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

对于咕噜咕噜的任务,我遇到了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' - &gt; 'JS / [散列值] /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>

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