261

拡張子が.min.jsのファイルが含まれていないmvc4バンドラーに奇妙な問題があります

BundleConfigクラスで、次のように宣言します

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/Scripts/jquery")
        .Include("~/Scripts/jquery-1.8.0.js")
        .Include("~/Scripts/jquery.tmpl.min.js"));            
}

私の見解では、私は宣言します

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>

そしてそれがレンダリングするとき、それはレンダリングするだけです

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>

jquery.tmpl.min.jsの名前をjquery.tmpl.jsに変更すると(それに応じてバンドル内のパスを更新すると)、両方のスクリプトが正しくレンダリングされます。

'.min.js'ファイルを無視する原因となっている構成設定はありますか?

4

9 に答える 9

257

私が最初に投稿した解決策は疑わしいです (汚いハックです)。多くのコメンターが指摘したように、微調整された動作は Microsoft.AspNet.Web.Optimization パッケージで変更され、微調整は機能しなくなりました。現在、パッケージのバージョン 1.1.3 では問題をまったく再現できません。

これから何をしようとしているのかをよりよく理解するには、System.Web.Optimization.BundleCollection のソース (たとえば、 dotPeekを使用できます) を参照してください。Max Shmelevの答えも読んでください。

元の答え:

.min.js の名前を .js に変更するか、次のようにします。

    public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
    {
        if (ignoreList == null)
            throw new ArgumentNullException("ignoreList");
        ignoreList.Ignore("*.intellisense.js");
        ignoreList.Ignore("*-vsdoc.js");
        ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
        //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
        ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
    }

    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.IgnoreList.Clear();
        AddDefaultIgnorePatterns(bundles.IgnoreList);
        //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }
于 2012-08-17T11:53:38.987 に答える
180

Microsoft は次の動作を暗示しています (そして、私は自分のプロジェクトでそれに従うことを好みます):

短縮版

  1. プロジェクトの同じフォルダーの下に、スクリプトのデバッグ バージョンと縮小バージョンの両方があります。
    • script.js
    • script.min.js
  2. コード内のバンドルにscript.jsのみを追加します。

その結果、自動的script.jsがDEBUGモードに含まれ、 script.min.jsRELEASEモードに含まれるようになります。

ロングバージョン

.debug.jsバージョンも使用できます。その場合、ファイルは DEBUG で次の優先度に含まれます。

  1. script.debug.js
  2. script.js

リリース中:

  1. script.min.js
  2. script.js

ノート

ちなみに、MVC4 でスクリプトの.minバージョンを使用する唯一の理由は、縮小されたバージョンを自動的に処理できない場合です。たとえば、次のコードは自動的に難読化できません。

if (DEBUG) console.log("Debug message");

他のすべてのケースでは、スクリプトのデバッグ バージョンだけを使用できます。

于 2012-10-15T17:39:36.430 に答える
5

ファイルの縮小バージョンしかない場合、私が見つけた最も簡単な解決策は、縮小ファイルをコピーし、コピーしたファイルの名前から .min を削除してから、バンドル内の縮小されていないファイル名を参照することです。

たとえば、js コンポーネントを購入し、some-lib-3.2.1.min.js というファイルが提供されたとします。このファイルをバンドルで使用するには、次の手順を実行します。

  1. some-lib-3.2.1.min.js をコピーし、コピーしたファイルの名前を some-lib-3.2.1.js に変更します。プロジェクトに両方のファイルを含めます。

  2. 次のように、バンドル内の縮小されていないファイルを参照します。

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
        "~/Scripts/some-lib-{version}.js"
    ));
    

名前に「min」のないファイルが実際に縮小されているという理由だけで、問題が発生することはありません (本質的に読み取り不能であるという事実を除いて)。これはデバッグ モードでのみ使用され、別のスクリプトとして書き出されます。デバッグ モードでない場合は、コンパイル済みの min ファイルをバンドルに含める必要があります。

于 2013-12-10T16:20:58.217 に答える
4

少なくとも MVC5 で機能する優れたソリューションを見つけましBundleScriptBundle。この場合、私たちが好まないスマートな動作ScriptBundle(.min を無視するなど) はありません。私のソリューションではBundle、.min および .map ファイルを含む 3d パーティ スクリプトに使用ScriptBundleし、コードに使用します。私はそれを行うことの欠点に気づいていません。このように動作させるには、angular.js などの元のファイルを追加する必要があります。これにより、デバッグで angular.js がロードされ、リリース モードで angular.min.js がバンドルされます。

于 2015-07-15T11:16:50.473 に答える
3

ファイルをレンダリングするには、すべてのバンドルに適用されるグローバル設定である を*.min.js無効にする必要があります。BundleTable.EnableOptimizations

特定のバンドルに対してのみ最適化を有効にする場合ScriptBundleは、バンドル内のファイルを列挙するときに最適化を一時的に有効にする独自のタイプを作成できます。

public class OptimizedScriptBundle : ScriptBundle
{
    public OptimizedScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public OptimizedScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
    {
        if (context.EnableOptimizations)
            return base.EnumerateFiles(context);
        try
        {
            context.EnableOptimizations = true;
            return base.EnumerateFiles(context);
        }
        finally
        {
            context.EnableOptimizations = false;
        }
    }
}

縮小されていないファイルが存在するかどうかに関係なく、縮小されたファイルが常に使用されるバンドルのOptimizedScriptBundle代わりに使用します。ScriptBundle

縮小されたファイルのみのコレクションとして配布される ASP.NET MVC の Kendo UI の例。

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
        .Include(
            "~/Scripts/kendo/kendo.all.*",
            "~/Scripts/kendo/kendo.aspnetmvc.*",
            "~/Scripts/kendo/cultures/kendo.*",
            "~/Scripts/kendo/messages/kendo.*"));
于 2016-04-20T11:54:39.650 に答える
2

私の場合、デバッグ/非バージョンとして提供される (素晴らしい!) Knockout.js ライブラリを使用していました。

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

これを機能させるために、バンドルに「Knockout-{Version}.js」(非デバッグ) を含め、.debug を取得しました。js ファイルをデバッグモードにします。

于 2012-11-15T06:04:54.537 に答える
-21

皆さん、マイクロソフトが一緒に行動するまで、私はそれを単純に保ちます

これを試して

RegisterBundles で、剣道用のこのバンドルを作成します

bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
                    "~/Content/kendo/2012.3.1121/kendo.common.min.css",
                     "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
                      "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
 ));

_Layout.cshtml に次のように記述します。

@if (HttpContext.Current.IsDebuggingEnabled)
 { 
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"      
rel="stylesheet"  type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" 
rel="stylesheet" type="text/css" />   
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"    
rel="stylesheet" type="text/css" />
 }
 else
 {
     @Styles.Render("~/Content/kendo/css")   
 }

このようにして、本番環境でバンドルを最大限に活用し、デバッグ環境で参照を取得します

Microsoft が MVC 4 コードを修正したら修正してください

于 2012-12-11T05:29:42.163 に答える