ASP.NET MVC 4 を試しているところですが、Javascript/CSS 縮小機能を無効にする方法がわかりません。特に開発環境の場合、これはデバッグに大いに役立ちます。web.config のスイッチになると思いますが、現時点では ASP.NET MVC 4 はまだベータ段階であるため、実際にはあまり情報がありません。誰かが助けたり、適切なブログ投稿などを指摘したりしていただければ幸いです。
10 に答える
Global.asax.cs 内
#if DEBUG
foreach (var bundle in BundleTable.Bundles)
{
bundle.Transform = new NoTransform();
}
#endif
コンテンツを縮小したくない場合は、 Global.asaxに独自のバンドルを登録し、クラスを使用できます。NoTransform
個人的には、スクリプトをまったく変換したくありません。2つのスクリプトディレクトリを作成するだけです。1つはデバッグスクリプトバージョンを使用し、もう1つは最初にダウンロードされた縮小バージョンを使用します。
MVC 4のすぐに使えるミニファイア(JsMinify)は、OperaのjQuery 1.7.1を壊すので、私はそれを使いたくありません。Global.asaxに次の行を追加しました:Application_Start()
メソッド:
Bundle debugScripts = new Bundle("~/DebugScripts",
new NoTransform("text/javascript"));
debugScripts.AddDirectory("~/Scripts/Debug", "*.js");
BundleTable.Bundles.Add(debugScripts);
Bundle productionScripts = new Bundle("~/ProductionScripts",
new NoTransform("text/javascript"));
productionScripts.AddDirectory("~/Scripts/Minified", "*.js");
BundleTable.Bundles.Add(productionScripts);
これで、次の2行のいずれかを追加できます_layouts.cshtml
。
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/DebugScripts")" type="text/javascript"></script>
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/ProductionScripts")" type="text/javascript"></script>
もちろん、これを配置すると、もう少しファンキーになる可能性があります。バンドルを1つだけ生成し、ビルドされたタイプに応じて、含めるファイルを選択します。
もう 1 つのオプションは、script タグと link タグの作成に使用できる HTML ヘルパーを作成することです。これは私が JavaScript 用に実装したもので、CSS 用にも実行できます。
public static class BundleHelper
{
public static MvcHtmlString JsBundle(this HtmlHelper helper, string bundlePath)
{
var jsTag = new TagBuilder("script");
jsTag.MergeAttribute("type", "text/javascript");
return ReferenceBundle(helper, bundlePath, jsTag);
}
public static MvcHtmlString ReferenceBundle(this HtmlHelper helper, string bundlePath, TagBuilder baseTag)
{
var httpContext = helper.ViewContext.HttpContext;
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
var htmlString = new StringBuilder();
if (bundle != null)
{
var bundleContext = new BundleContext(helper.ViewContext.HttpContext, BundleTable.Bundles, urlHelper.Content(bundlePath));
if (!httpContext.IsDebuggingEnabled)
{
baseTag.MergeAttribute("href", System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(bundlePath));
return new MvcHtmlString(baseTag.ToString());
}
foreach (var file in bundle.EnumerateFiles(bundleContext))
{
var basePath = httpContext.Server.MapPath("~/");
if (file.FullName.StartsWith(basePath))
{
var relPath = urlHelper.Content("~/" + file.FullName.Substring(basePath.Length));
baseTag.MergeAttribute("href", relPath, true);
htmlString.AppendLine(baseTag.ToString());
}
}
}
return new MvcHtmlString(htmlString.ToString());
}
}
あとは、ビューで呼び出すだけです。
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="~/Content/css" rel="stylesheet" type="text/css" />
<link href="~/Content/themes/base/css" rel="stylesheet" type="text/css" />
@Html.JsBundle("~/scripts/js")
<meta name="viewport" content="width=device-width" />
</head>
また、 web.config のデバッグ設定に応じて、スクリプトを個別の参照としてレンダリングするか、新しいバンドル/縮小機能を使用します。もっと例を見たい場合は、ヘルパーを作成するときにhttp://codecutout.com/resource-minify-bundlingのコードの一部を参照として使用しました。彼らのヘルパーは、無効な引数が指定されたときに例外をスローするなど、もう少し良く書かれています....私はまだ私のものを片付けていません。
Global.asaxを呼び出した後、EnableDefaultBundles()
これを行うことができます...
if ( ... running in development environment ...)
{
var registeredBundles = BundleTable.Bundles.GetRegisteredBundles();
foreach (var bundle in registeredBundles)
{
if (bundle.Transform is System.Web.Optimization.JsMinify)
bundle.Transform = new NoTransform();
}
}
きれいではありませんが(システムによって設定された状態を変更します)、他のすべての提案よりもはるかに少ないコードであり、標準のバンドル動作を使用でき、ビューへの変更は含まれません.
設定からオフにすることができます:
<system.web>
<compilation debug="true" />
<!-- Lines removed for clarity. -->
</system.web>
http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification
そのような機能が「すぐに」利用できるのであれば、それは正しいと思います。
UserVoice.com にフィードバックを投稿しました: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle
あなたの「声」をください。
JsMinify と CssMinify のインスタンスを置き換えるのではなく、代わりにインターフェイスを使用できます。このオプションは、以前のリリースでは使用できませんでした。これは、2 番目のコンストラクター パラメーターがインターフェイスではなく型であったためです。
IBundleTransform jsTransform;
IBundleTransform cssTransform;
#if DEBUG
jsTransform = new NoTransform("text/javascript");
cssTransform = new NoTransform("text/css");
#else
jsTransform = new JsMinify();
cssTransform = new CssMinify();
#endif
Bundle jsBundle = new Bundle("~/JsB", jsTransform);
Bundle cssBundle = new Bundle("~/CssB", cssTransform);
おそらく注目に値するのは、jQuery などの縮小版と非縮小版に同梱されているスクリプトの場合、ヘルパー メソッドを使用して、デバッグを容易にするために DEBUG ビルドの ".min" をオプションで取り除くことができることです。
private string Min(string scriptNameIncludingMin)
{
#if DEBUG
return scriptNameIncludingMin.Replace(".min", ""); // Remove .min from debug builds
#else
return scriptNameIncludingMin;
#endif
}
// ...
jsBundle.AddFile(Min("~/Scripts/jquery-1.7.2.min.js"));
System.Web.Optimization - Bundle Transformerの新しい拡張機能を試してください。Bundle Transformer では、デバッグを簡素化するための多くの機会が実装されています (ドキュメントを参照してください)。