Pregunta

Estoy probando ASP.NET MVC 4 pero no sé cómo desactivar la función de minificación de Javascript/CSS.Especialmente para el entorno de desarrollo, esto será de gran ayuda en la depuración.Me imagino que sería un cambio en web.config, pero dado que ASP.NET MVC 4 todavía está en etapa beta en este momento, realmente no hay mucha información disponible.Agradecería que alguien pudiera ayudar o señalar las publicaciones de blog correctas, etc.

¿Fue útil?

Solución

En Global.asax.cs

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transform = new NoTransform();
        }
#endif

Otros consejos

Otra opción sería crear un HTML Helper que podría utilizar para crear el script y las etiquetas de enlace.Esto es lo que he implementado para Javascript, que también se puede hacer para 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());
        }
    }

Ahora todo lo que tienes que hacer es llamarlo en tu vista:

<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>

Y renderizará los scripts como referencias independientes, o utilizará la nueva función de agrupación / minificación según la configuración de depuración en su web.config.Utilicé parte del código de http://codecutout.com/resource-minify-bundling comouna referencia al crear mi ayudante si desea ver algunos ejemplos más.Su ayudante está escrito un poco mejor, lanzando excepciones cuando se suministran argumentos inválidos, etc ... Simplemente no he podido limpiar el mío todavía.

Puedes registrar tus propios paquetes en el Global.asax y usar el NoTransform class si no desea que se minimice el contenido.

Personalmente no quiero que mi guión se transforme en absoluto.Simplemente creo dos directorios de scripts.Uno con las versiones del script de depuración y otro con las versiones minimizadas descargadas originalmente.

El minificador MVC 4 listo para usar (JsMinify) rompe jQuery 1.7.1 para Opera, por lo que no quiero usarlo.Acabo de poner las siguientes líneas en mi Global.asax: Application_Start() método:

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

Con eso en su lugar, puedo simplemente agregar cualquiera de las dos líneas en mi _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>

Por supuesto, podríamos volvernos un poco más originales con esto en su lugar.Podríamos generar solo un paquete y, según el tipo de compilación, seleccionar qué archivos incluir.

Después de la llamada a EnableDefaultBundles() en Global.asax, puede hacer esto ...

        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();
            }
        }

No es bonito (modifica el estado establecido por el sistema), pero es mucho menos código que todas las otras sugerencias, aún le permite usar el comportamiento de empaquetado estándar y no implica ningún cambio en sus vistas.

En las versiones más recientes de ASP.NET MVC, simplemente agregue

#if DEBUG
            foreach (var bundle in BundleTable.Bundles)
            {
                bundle.Transforms.Clear();
            }
#endif

justo después

BundleConfig.RegisterBundles(...);

puedes desactivarlo desde config:

<system.web>
    <compilation debug="true" />
    <!-- Lines removed for clarity. -->
</system.web>

http://www.asp.net/mvc/tutoriales / mvc-4 / empaquetado-y-minificación

Creo que sería correcto si dicha función estuviera disponible "lista para usar".

Publiqué un comentario sobre UserVoice.com: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle

Dale tus "voces".

En lugar de reemplazar instancias de JsMinify y CssMinify, se pueden usar interfaces. Esta opción no estaba disponible en versiones anteriores porque el segundo parámetro del constructor era un tipo en lugar de una interfaz.

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

Quizás también valga la pena señalar, para scripts que se envían con versiones minimizadas y no minimizadas, p.jQuery, se puede usar un método auxiliar para eliminar opcionalmente el ".min" para las compilaciones DEBUG para facilitar la depuración:

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

Pruebe una nueva extensión para System.Web.Optimization: Bundle Transformer .In Bundle Transformer implementó una serie de oportunidades para simplificar la depuración (consulte la documentación ).

Otra alternativa (probada con v1.1.0.0 y MVC5):

public class BundleConfig
{
    public static void Register()
    {
        ScriptBundle jsBundle = new ScriptBundle("~/Scripts/myscript.min.js");
        jsBundle.Include("~/Scripts/myscript.js");
        DisableInDebugMode(jsBundle);

        BundleTable.Bundles.Add(jsBundle);
    }

    private static void DisableInDebugMode(ScriptBundle jsBundle)
    {
    #if DEBUG
        // Don't minify in debug mode
        jsBundle.Transforms.Clear();
    #endif
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top