c# - Bundler inkluderar inte .min-filer


Jag har ett konstigt problem med mvc4-bundlern som inte inkluderar filer med filändelsen .min.js

I min BundleConfig-klass deklarerar jag

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

Enligt min uppfattning förklarar jag

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

Och när det renderar, renderar det bara

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

Om jag byter namn på jquery.tmpl.min.js till jquery.tmpl.js (och uppdaterar sökvägen i bundlen därefter), renderas båda skripten korrekt.

Finns det någon konfigurationsinställning som gör att den ignorerar '.min.js'-filer?

Svar #1

Lösningen jag ursprungligen publicerade är tveksam (är ett smutsigt hack). Det justerade beteendet har ändrats i Microsoft.AspNet.Web.Optimization-paketet och justeringen fungerar inte längre, vilket påpekas av många kommentatorer. Just nu kan jag inte återskapa problemet alls med version 1.1.3 av paketet.

Vänligen se källorna till System.Web.Optimization.BundleCollection (du kan till exempel använda dotPeek) för bättre förståelse av vad du är på väg att göra. Läs också Max Shmelevs svar.

Originalt svar:

Antingen byt namn på .min.js till .js eller gör något liknande

    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
     }

Svar #2

Microsoft antyder följande beteende (och jag föredrar att följa det i mina projekt):

kort version

  1. Du har både debug- och minifierade versioner av ett skript i ditt projekt under samma mapp:

    • script.js
    • script.min.js
  2. Du lägger bara till script.js i ett paket i din kod.

Som ett resultat kommer du automatiskt ha script.js inkluderad i DEBUG-läge och script.min.js i RELEASE-läge.

lång version

Du kan också ha .debug.js-version. I så fall inkluderas filen i följande ordning i DEBUG:

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

i RELEASE:

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

anteckning

Och förresten, den enda anledningen till att ha .min-versioner av dina skript i MVC4 är i de fall när den minifierade versionen inte kan behandlas automatiskt. Till exempel kan följande kod inte obfusceras automatiskt:

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

I alla andra fall kan du nöja dig med en felsökningsversion av ditt skript.

Relaterade artiklar