script net mvc minification example bundling bundleconfig asp and c# javascript asp.net-mvc-4 bundling-and-minification

c# - minification - bundles asp net mvc 4



Bundler no incluye archivos.min (9)

Tengo un problema extraño con el agrupador de mvc4 que no incluye los archivos con la extensión .min.js

En mi clase BundleConfig, declaro

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

En mi opinión, declaro

<html> <head> @Scripts.Render("~/Scripts/jquery") </head><body>test</body> </html>

Y cuando se rinde, solo se rinde.

<html> <head> <script src="/Scripts/jquery-1.8.0.js"></script> </head> <body>test</body> </html>

Si cambio el nombre de jquery.tmpl.min.js a jquery.tmpl.js (y actualizo la ruta en el paquete correspondiente), ambos scripts se representan correctamente.

¿Hay algún ajuste de configuración que haga que ignore los archivos ''.min.js''?


Amigos, simplemente lo mantendría hasta que Microsoft actúe en conjunto.

Prueba esto

En RegisterBundles crea este paquete para Kendo

bundles.Add(new StyleBundle("~/Content/kendo/css").Include( "~/Content/kendo/2012.3.1121/kendo.common.min.css", "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css", "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css" ));

En _Layout.cshtml pon esto:

@if (HttpContext.Current.IsDebuggingEnabled) { <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")" rel="stylesheet" type="text/css" /> <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" rel="stylesheet" type="text/css" /> <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")" rel="stylesheet" type="text/css" /> } else { @Styles.Render("~/Content/kendo/css") }

De esta manera obtenemos lo mejor de los paquetes en producción y una referencia en depuración.

Arreglarlo cuando Microsoft arregle su código MVC 4


Bundler tiene muchos beneficios revisa esta página PERO :

La plataforma de Microsoft MVC4 considera que tiene al menos una versión minificada y una versión no minada para cada Script o Style Bundle (también están disponibles otros archivos como Debug y vsdoc). Así que tenemos problemas en situaciones en que solo hay uno de estos archivos.

Puede cambiar el estado de depuración en el archivo web.config de forma permanente para manejar la salida:

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

Ver los cambios de salida! Filtrado de archivos cambiado. Para cumplir con el propósito, debemos cambiar ignorar la filtración de casos que cambiará la lógica de la aplicación.


En mi caso, estaba usando la biblioteca Knockout.js (¡maravillosa!) Que viene como versiones Debug / Non:

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

Para hacer que esto funcione, incluí "Knockout- {Version} .js" (no depuración) en mi paquete y obtuve el .debug. js archivo en modo de depuración.


He encontrado una buena solución que funciona al menos en MVC5, puedes usar Bundle lugar de ScriptBundle . No tiene el comportamiento inteligente de ScriptBundle que no nos gusta (ignorando .min, etc.) en este caso. En mi solución, uso Bundle for 3d party scripts con archivos ScriptBundle y .map, y uso ScriptBundle para nuestro código. No he notado ninguna desventaja de hacerlo. Para que funcione de esta manera, deberá agregar el archivo original, por ejemplo, angular.js, y cargará angular.js en la depuración y agrupará el angular.min.js en el modo de lanzamiento.


La solución que originalmente publiqué es cuestionable (es un truco sucio). El comportamiento modificado ha cambiado en el paquete Microsoft.AspNet.Web.Optimization y el ajuste ya no funciona, como lo señalaron muchos comentaristas. En este momento no puedo reproducir el problema con la versión 1.1.3 del paquete.

Consulte las fuentes de System.Web.Optimization.BundleCollection (puede usar dotPeek por ejemplo) para comprender mejor lo que está por hacer. También lea la respuesta de Max Shmelev .

Respuesta original :

Cambie el nombre de .min.js a .js o haga algo como

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 }


Microsoft implica el siguiente comportamiento (y prefiero seguirlo en mis proyectos):

version corta

  1. Tiene las versiones de depuración y minimizadas de un script en su proyecto en la misma carpeta:
    • script.js
    • script.min.js
  2. Solo agrega script.js a un paquete en su código.

Como resultado, automáticamente tendrá el script.js incluido en el modo DEBUG y script.min.js en el modo LIBERAR .

Versión larga

También puedes tener la versión .debug.js . En ese caso, el archivo se incluye en la siguiente prioridad en DEBUG:

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

en LIBERACIÓN:

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

Nota

Y, por cierto, la única razón para tener versiones .min de sus scripts en MVC4 es cuando la versión minified no puede procesarse automáticamente. Por ejemplo, el siguiente código no puede ser ofuscado automáticamente:

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

En todos los demás casos, puede usar solo una versión de depuración de su script.


Para representar los archivos *.min.js , debe deshabilitar BundleTable.EnableOptimizations , que es una configuración global que se aplica a todos los paquetes.

Si desea habilitar optimizaciones solo para paquetes específicos, puede crear su propio tipo ScriptBundle que habilite temporalmente las optimizaciones al enumerar archivos en el paquete.

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

Use OptimizedScriptBundle lugar de ScriptBundle para paquetes cuyo archivo minificado siempre debe usarse, independientemente de si existe un archivo no minificado.

Ejemplo para Kendo UI para ASP.NET MVC, que se distribuye como una colección de solo archivos minificados.

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo") .Include( "~/Scripts/kendo/kendo.all.*", "~/Scripts/kendo/kendo.aspnetmvc.*", "~/Scripts/kendo/cultures/kendo.*", "~/Scripts/kendo/messages/kendo.*"));


Si todo lo que tiene es una versión minificada de un archivo, la solución más sencilla que he encontrado es copiar el archivo minificado, eliminar .min del nombre del archivo copiado y luego hacer referencia al nombre del archivo no minificado en su paquete.

Por ejemplo, digamos que compró un componente js y le dieron un archivo llamado some-lib-3.2.1.min.js. Para usar este archivo en un paquete, haga lo siguiente:

  1. Copie some-lib-3.2.1.min.js y cambie el nombre del archivo copiado a some-lib-3.2.1.js. Incluye ambos archivos en tu proyecto.

  2. Haz referencia al archivo no minificado en tu paquete, como este:

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include( "~/Scripts/some-lib-{version}.js" ));

El hecho de que el archivo sin ''min'' en el nombre esté realmente minimizado no debería causar ningún problema (aparte del hecho de que es esencialmente ilegible). Solo se usa en el modo de depuración y se escribe como un script separado. Cuando no esté en modo de depuración, el archivo min precompilado debe incluirse en su paquete.


Una forma sencilla es simplemente cambiar el nombre del archivo .min; por ejemplo, tiene abc.min.css que simplemente cambiar el nombre de este archivo a abc_min.css y agregarlo a su paquete. Sé que no es la forma correcta de hacerlo, sino una solución temporal. Gracias y feliz codificación.