1. ホーム
  2. asp.net-mvc

[解決済み] ScriptBundleのインクルード順序を明示的に指定するには?

2023-03-03 19:59:10

質問

私は今 MVC4 System.Web.Optimization 1.0 ScriptBundle 機能を試しています。 .

私は以下のような構成にしています。

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        // shared scripts
        Bundle canvasScripts =
            new ScriptBundle(BundlePaths.CanvasScripts)
                .Include("~/Scripts/modernizr-*")
                .Include("~/Scripts/json2.js")
                .Include("~/Scripts/columnizer.js")
                .Include("~/Scripts/jquery.ui.message.min.js")
                .Include("~/Scripts/Shared/achievements.js")
                .Include("~/Scripts/Shared/canvas.js");
        bundles.Add(canvasScripts);
    }
}

で、以下のように表示します。

<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>

ここで BundlePaths.CanvasScripts"~/bundles/scripts/canvas" . これをレンダリングします。

<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>

ここまでは良いのですが ~/Scripts/Shared/achievements.js はバンドルされているソースの最初のスクリプトです。これは、その前に含まれるすべてのスクリプトに依存し ScriptBundle . バンドルにインクルードステートメントを追加する順序を尊重するようにするにはどうすればよいですか?

更新

これは比較的新しい ASP.NET MVC 4 アプリケーションでしたが、最適化フレームワークのプレ リリース パッケージを参照していました。私はそれを削除し、RTM パッケージを以下の場所から追加しました。 http://nuget.org/packages/Microsoft.AspNet.Web.Optimization . RTM版でweb.configにdebug=trueを指定した場合。 @Scripts.Render("~/bundles/scripts/canvas") は個々のスクリプトタグを正しい順序でレンダリングします。

web.config で debug=false を指定すると、結合されたスクリプトは achievements.js スクリプトを最初に持ちますが、その関数定義 (オブジェクト コンストラクタ) は後で呼び出されるため、エラーなしで実行されます。おそらく、minifier は依存関係を把握するのに十分賢いのでしょうか?

また、試しに IBundleOrderer の実装を RTM で試してみましたが、両方のデバッグ オプションで同じ動作になりました。

つまり、minifiedバージョンは私が期待する順序ではありませんが、それは動作します。

どのように解決するのですか?

RTM ビットではこの動作は見られません。Microsoft ASP.NET Web Optimization Framework 1.0.0 ビットを使用していますか? http://nuget.org/packages/Microsoft.AspNet.Web.Optimization ?

私は新しいMVC4インターネットアプリケーションのウェブサイトをベースに、あなたのサンプルと同様の再現を使用しました。

BundleConfig.RegisterBundlesに追加しました。

        Bundle canvasScripts =
            new ScriptBundle("~/bundles/scripts/canvas")
                .Include("~/Scripts/modernizr-*")
                .Include("~/Scripts/Shared/achievements.js")
                .Include("~/Scripts/Shared/canvas.js");
        bundles.Add(canvasScripts); 

そして、デフォルトのインデックスページに、追加しました。

<script src="@Scripts.Url("~/bundles/scripts/canvas")"></script>

そして、バンドル用のminified javascriptの中で、achievement.jsの中身がmodernizrの後にあることを確認しました...。