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 オブジェクトを含むファイルを作成します。これは、URL を構築するために HandlebarsJS ヘルパーによって使用されます。
  • 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/[ハッシュ値]/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 に答える