9

ASP.Nets BundleTableを使用していくつかのjavascriptファイルを最適化しようとしていますが、コードが縮小されたときに特定のアドオン(jQuery-Timepicker)が機能しないという問題が発生しました。ここを参照してください。

バンドルコードは現在、次のようになっています。

// Add our commonBundle
var commonBundle= new Bundle("~/CommonJS" + culture.ToString());

// JQuery and related entries.
commonBundle.Include("~/Scripts/jquery-1.7.2.js");
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js");
commonBundle.Include("~/Scripts/jquery.cookie.js");
commonBundle.Include("~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"); // This is the one that does not work when bundled

// JS Transformer
commonBundle.Transforms.Add(new JsMinify());

BundleTable.Bundles.Add(commonBundle);

ファイルを削除してjquery-ui-timepicker-addon.jsから、Webページに個別に含めると、正しく機能します。(それ以外の場合はUncaught TypeError: undefined is not a functionエラーが発生します)。

この1つのファイルの縮小をスキップするようにバンドルコードを設定できるかどうか疑問に思っています(ただし、バンドルにはまだ含まれています)?私は周りを見回してきましたが、そうするための解決策を思いつきませんでした。

4

4 に答える 4

3

したがって、問題は、すべてのファイルが一緒にバンドルされ、バンドル全体が最小化されることです。その結果、1つのファイルの縮小を簡単にスキップすることはできません。おそらくこれを行うための最良の方法は、縮小したくないこのファイルの内容を追加した新しいトランスフォームを作成することです。次に、このTransformを登録済みのScriptBundleに追加します。

commonBundle.Transforms.Add(new AppendFileTransform(""~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js""));

AppendFileTransformは、ファイルの内容をバンドルされた応答に追加するだけです。タイムピッカーをバンドルに明示的に含めることはなくなりますが、代わりにこのトランスフォームにタイムピッカーが含まれるようになります。これにより、JsMinifyトランスフォームが最初に実行されてバンドルが縮小され、次に追加するため、探している動作が効果的に得られます。最後に縮小せずに必要なファイル。

于 2013-03-04T05:26:52.093 に答える
3

これは、他の方向からより適切に解決できます。単一のファイルを縮小しないようにする代わりに、代わりに個々のアイテムの変換を追加します。

最初に-IItemTransform同じコードを実装および使用して、指定された入力を縮小するクラスを作成します。

public class JsItemMinify : System.Web.Optimization.IItemTransform
{
    public string Process(string includedVirtualPath, string input)
    {
        var min = new Microsoft.Ajax.Utilities.Minifier();
        var result = min.MinifyJavaScript(input);
        if (min.ErrorList.Count > 0)
            return "/*minification failed*/" + input;

        return result;
    }
}

2番目-このアイテムトランスフォームを個々のファイルに追加し、バンドルトランスフォームを削除します。

var commonBundle= new Bundle("~/CommonJS");
// the first two includes will be minified
commonBundle.Include("~/Scripts/jquery-1.7.2.js", new JsItemMinify());
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js", new JsItemMinify());

// this one will not
commonBundle.Include("~/Scripts/jquery.cookie.js");

// Remove the default JsMinify bundle transform
commonBundle.Transforms.Clear();

BundleTable.Bundles.Add(commonBundle);
于 2017-03-02T10:38:58.233 に答える
1

特定のファイルの縮小をスキップして残りのファイルを縮小するようにバンドルを設定することはできません。

独自に実装することも、オーバーライドまたはメソッドによってBundle実装することもできますが、ファイルの変更追跡、キー生成、キャッシュの無効化などを壊さないように注意する必要があります...(または醜いハックを行う)。努力する価値はありません。TransformBundle.ApplyTransformJsMinify.Process

すでに述べたように、私は別のjsファイルを保持します。

于 2013-03-01T22:19:28.790 に答える
0

これは、HaoKungの回答に基づく完全な例です。

var myBundle = new ScriptBundle("~/bundles/myBundle").Include(
    "~/Scripts/script1.js",
    "~/Scripts/script2.js",
);
myBundle.Transforms.Add(new AppendFileTransform("~/Scripts/excludedFile.min.js"));
bundles.Add(myBundle);

そして、これがAppendFileTransformの実装例です。

public class AppendFileTransform : IBundleTransform
{
    private readonly string _filePath;

    public AppendFileTransform(string filePath)
    {
        _filePath = filePath;
    }

    public void Process(BundleContext context, BundleResponse response)
    {
        response.Content += File.ReadAllText(context.HttpContext.Server.MapPath(_filePath));
    }
}
于 2019-07-29T09:42:00.763 に答える