7

いくつかのJavaScriptファイルを最適化するためにASP.Nets BundleTableを使用しようとしていますが、特定のアドオン(jQuery-Timepicker)がコードが縮小されたときに動作しないという問題が発生しました。 hereを参照してください。私はそれが正常に動作しますが、それは私のWebページに分けるなどが、jquery-ui-timepicker-addon.jsファイルを削除した場合Minifyingから1つのファイルをスキップしますか?

// 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); 

バンドルコードは、現在と同様です。 (そうでなければUncaught TypeError: undefined is not a functionエラーが発生します)。

バンドルコードを設定して、この1つのファイルをマイナーにすることをスキップすることができますか(まだそれはバンドルに含まれていますか?)私は周りを見回してきましたが、そうするための解決策は考え出されていません。

+0

変換後にtimepickerの 'commonBundle.Include'行を移動できませんか? – Toby

答えて

2

したがって、すべてのファイルがバンドルされ、バンドル全体が最小化されるという問題があります。その結果、1つのファイルの縮小を簡単にスキップすることはできません。おそらく、これを行う最善の方法は、変換したくないこのファイルの内容を追加する新しいTransformを作成することです。そして、あなたはこれがあなたの登録ScriptBundleに変換追加します:

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

AppendFileTransformは、単純にバンドルされたレスポンスにファイルの内容を追加します。タイムピッカをバンドルに明示的に含めるのではなく、このトランスフォームにも含まれています.JsMinifyトランスフォームが最初に実行されてバンドルを縮小してから、実際に見ている動作が効果的になります。あなたが最後に望みません。

+0

はい、そうですが、ファイルが変更されてもバンドルは再作成されません。この場合はおそらく許容されるが、一般的な解決策のようではない。 – Nenad

+0

AppendFileTransformコードのヒント? – Spikolynn

1

Bundleを設定して、特定のファイルを縮小したり、残りのファイルを縮小したりすることはできません。

あなたはBundle.ApplyTransformまたはJsMinify.Processメソッドをオーバーライドすることで、独自のBundleTransformを実装することができますが、あなたはetcファイルの変更追跡、鍵生成、キャッシュの無効化を、壊さないように世話をする必要があるだろう...(またはいくつかの醜いをやってハック)。努力する価値はありません。

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

2

これは、1つのファイルを小さくしないで、個々のアイテムに変換を追加するのではなく、他の方向からも優れています。

ファースト - 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; 
    } 
} 

セカンド - 変換このアイテムは、バンドルを個々のファイルに変換し、削除、追加:

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); 
関連する問題