13

達成したい目標がいくつかありますが、そこに到達する方法がわかりません。

  1. 縮小された JavaScript ファイルを含む Web プロジェクトのシングルクリック デプロイを作成する
  2. 新しいビルドがプッシュされるたびにブラウザが静的コンテンツをキャッシュしないように、縮小した JavaScript ファイルをバージョン管理する
  3. RELEASE ビルドではバージョン管理された JavaScript ファイルを参照し、DEBUG ビルドでは縮小されていないバージョンの JavaScript ファイルを参照します。

この記事から:

http://encosia.com/automatically-minify-and-combine-javascript-in-visual-studio/

次のようなコマンドを使用してファイルを縮小するために JSMin を追加しました。

"$(SolutionDir)Tools\jsmin.exe" < "$(ProjectDir)Scripts\myfile.js" > "$(ProjectDir)Scripts\myfile.min.js"

また、デバッグ モード中に圧縮されていないファイルを保持するために、これを Web ページに追加します。

    <% if (HttpContext.Current.IsDebuggingEnabled) { %>
             <script type="text/javascript" src="scripts\myfile.js"></script>
    <% } else { %>
             <script type="text/javascript" src="scripts/myfile.min.js"></script>
    <% } %>

したがって、実際には、更新時に myfile.min.js が Web ブラウザーによって静的コンテンツとして表示されるのを防ぐ方法を見つけようとしています。私の目標がワンクリックでの展開ではなかった場合は、バージョン番号を手動で追加することもできますが、それは堅実なアプローチとは思えません。考え?

4

3 に答える 3

5

この回答は少し遅れていますが、ファイル自体のチェックサムに基づいて、キャッシュ動作がファイルと同期していることを確認するためのかなり堅実なアプローチだと思います。

<script type="text/javascript" src="/Scripts/Scripts.min.js?v=<%= Utils.GetFileHash("/Scripts/Scripts.min.js") %>"></script>

Utils クラスには、ファイルのチェックサムを生成するメソッドがあります。

public static string GetFileHash(string path)
    {
        string hash = (string)HttpContext.Current.Cache["_hash_" + path];

        if (hash == null)
        {
            // Get the physical path of the file
            string file = HttpContext.Current.Server.MapPath(path);

            // Code for MD5 hashing omitted for brevity
            hash = Utils.GetMD5(file); 

            // Insert the hash into the Cache, with a dependency on the underlying file
            HttpContext.Current.Cache.Insert("_hash_" + path, hash, new System.Web.Caching.CacheDependency(file));
        }

        return hash;
    }

これにより、ファイルのハッシュがキャッシュされるため、ファイルが変更されるたびにハッシュを計算するだけで済みます。

また、CacheDependency は、.js ファイルを変更した場合に、ハッシュが確実に再生成されるようにします。

これがお役に立てば幸いです。これは、私が制作用 Web サイトの 1 つで使用しているものです。

于 2012-02-19T05:56:28.283 に答える
4

ソースコードをif/elseいたるところにIHttpFilter散らかすのではなく、オンザフライで縮小を行う を実装することを検討してください。この記事のようなことはうまくいくはずです。

JavaScript はキャッシュ可能である必要があり、Web サーバーでの圧縮のオーバーヘッドは最小限に抑えられます。これを として実装すると、IHttpFilterルートを追加したり、既存の URL を変更したりする必要がなくなります。またIHttpFilter、リリース構成に条件付きでのみ追加できるため、開発中に JavaScript をデバッグすることもできます。

バージョン管理に関しては、HTML ヘルパー (詳細情報へのリンクはこちら) は、バージョン番号をクエリ文字列パラメーターとして追加することで問題をうまく解決します。IHttpFilterバージョン パラメータが存在しない場合、デバッグ バージョンで例外をスローするように設定することもできます。そのため、新しい JavaScript ファイルを追加するたびに HTTP ヘルパーを使用するように注意する必要があります。

于 2011-10-07T18:10:05.510 に答える
4

比較的適切な答えがあると思いますが、フィードバックをいただければ幸いです。

  1. アセンブリ情報の バージョン番号を自動的に更新します。
  2. JavaScript ファイルを含めるときに、アセンブリのバージョン番号を反映します。私は MVC を使用しているので、このSO 投稿のアドバイスを使用する必要がありました。

script type="text/javascript" src='@Url.Content("~/Scripts/myfile.min.js?v=" + typeof(MyProject.Web.Controllers.MyController).Assembly.GetName().Version. ToString())'

このアプローチについての考えは?

于 2011-10-07T15:19:33.517 に答える