2013-07-24 62 views
0

我正在尋找工具(和技術)來幫助版本控制我的HandlebarsJS模板中的靜態資源(CSS,JS,圖像等)URL。這是用於使用express的Node.js網絡應用程序,並在Windows中運行在iisnode下。出於性能原因,我希望IIS直接提供靜態資產 - 而不是使用Node或其他連接中間件來實現此管道。版本控制HandlebarsJS模板中的靜態資源

基於我如何在過去做到了這一點(與傳統的ASP),我現在的想法是如下:

  • 寫HandlebarsJS幫手需要,作爲輸入,資產名稱。然後,助手會獲得該資產的適當版本(時間戳,校驗和等)(可能通過查看預先生成的JSON對象),然後將正確版本化的路徑返回到要渲染到模板輸出中的資產。
    • 例如爲:{{asset 'images/button.png'}} - >//sc.domain.com/images/<version#>/button.png
  • 使用咕嚕建立包含JSON對象映射資產名稱版本的文件。然後這將由HandlebarsJS助手用來構建URL。
  • 讓IIS重寫傳入的URL以刪除版本#,從而消除了在磁盤上實際複製/版本文件名的需要(我們的站點不需要多個版本的資產同時在相同的文件名下生存)。

從理論上講,這應該完全符合我的目的。但是,在我深入挖掘並編寫所有這些基礎架構之前,我想看看是否有人知道a)這些項目是否已經存在某處,以及b)是否有替代方法可以更好地適用於HandlebarsJS?

回答

0

嗯,我沒有找到更好的選擇,所以我最終提出了我上面提出的方法。

對於咕task的任務,我碰到了grunt-hashmap,它似乎做我想要的一切(以及更多!)。因爲我不希望它實際上是重命名這些文件,所有我曾在我的咕嚕配置指定爲以下幾點:

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

下一條,車把幫手,看起來是這樣的(假設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/[散列值。 ] /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> 

而這基本上它!只是想發佈這個以防其他人有類似的問題。我很高興聽到您可以提供的任何改進或建議。