web-dev-qa-db-ja.com

.minファイルを含まないバンドラー

拡張子が.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'ファイルを無視するようになっている設定がありますか?

260
Fatal

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

System.Web.Optimization.BundleCollectionのソースを参照してください(たとえば、 dotPeek を使用できます)。 Max Shmelev's answer も読んでください。

元の答え

.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
     }
255
Pavel

Microsoftは次のような振る舞いをしています(そして私のプロジェクトではそれに従うことを望みます)。

短縮版

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

その結果、自動的にscript.jsDEBUGモードおよびscript.min.jsに含まれるようになります。 = in RELEASEモード。

ロングバージョン

。debug.js versionも使えます。その場合、ファイルはDEBUGの次の優先順位に含まれます。

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

リリース中:

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

注意

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

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

他のすべての場合では、あなたはあなたのスクリプトのただデバッグ版で行くことができます。

176
Max Shmelev

ファイルの縮小バージョンだけであれば、私が見つけた最も簡単な解決策は、縮小ファイルをコピーし、コピーしたファイルの名前から.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ファイルをバンドルに含める必要があります。

5
joelfp

私は少なくともMVC5でうまくいく良い解決策を見つけました、あなたはBundleの代わりにScriptBundleを使うことができます。この場合、ScriptBundleのような賢い動作(.minなどは無視されます)が嫌いです。私のソリューションでは、.minファイルと.mapファイルを含む3dパーティスクリプトにBundleを使用し、コードにはScriptBundleを使用します。私はそれをすることのどんな欠点にも気付いていません。このように機能させるには、オリジナルファイルを追加する必要があります。 angular.js、そしてそれはデバッグ時にangular.jsをロードし、releaseモードでangular.min.jsをバンドルします。

4

*.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.*"));
3
Steven Liekens

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

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

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

2
AcidPAT

簡単な方法は、.minファイルの名前を変更することです。例えば、このファイルの名前をabc_min.cssに変更してバンドルに追加するよりも、abc.min.cssがあります。それが正しい方法ではなく、一時的な解決策であることを私は知っています。ありがとう、そして幸せなコーディング。

1
R K Sharma

Bundlerにはたくさんの利点があります このページをチェックしてくださいしかし

Microsoft MVC4プラットフォーム各スクリプトまたはスタイルバンドルごとに、少なくとも縮小版と非縮小版の両方があることを考慮してください(Debugやvsdocなどの他のファイルも利用可能です)。そのため、これらのファイルが1つしかないという状況では問題が発生します。

Web.configファイルのデバッグ状態を永続的に変更して出力を処理できます。

<compilation debug="false" targetFramework="4.0" />

出力の変化を見てください。ファイルフィルタリングが変更されました。この目的を達成するためには、アプリケーションロジックを変更するケースフィルタを無視するように変更する必要があります。