c# bundleconfig mvc - Bundler no incluye archivos .min




5 Answers

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
     }
asp net

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




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.




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



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.




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




Related