260 votes

Bundler ne comprenant pas les fichiers .min

J'ai un drôle de problème avec le mvc4 bundler pas y compris les fichiers avec l'extension .min.js

Dans mon BundleConfig classe, je déclare

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

De mon point de vue, je déclare

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

Et quand il rend, elle rend seulement

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

Si je renomme le jquery.tmpl.min.js pour jquery.tmpl.js (et mettre à jour le chemin d'accès dans le bundle en conséquence), les deux scripts sont rendus correctement.

Est-il un paramètre de configuration qui est à l'origine de l'ignorer '.min.js les fichiers?

255voto

Pavel Points 2416

La solution que j'ai posté est discutable (c'est un sale hack). L'modifié le comportement a été modifié dans Microsoft.AspNet.Web.L'optimisation de l'emballage et le tweak ne fonctionne plus, comme l'a souligné par de nombreux intervenants. Maintenant je ne peux pas reproduire le problème avec la version 1.1.3 de l'emballage.

Veuillez consulter les sources du Système.Web.L'optimisation.BundleCollection (vous pouvez utiliser dotPeek par exemple) pour une meilleure compréhension de ce que vous vous apprêtez à faire. Lire aussi Max Schmelev de réponse.

Réponse originale à cette question:

Renommer .min.js .js ou faire quelque chose comme

    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
     }

176voto

Max Shmelev Points 2272

Microsoft implique le comportement suivant (et je préfère me suivre dans mes projets):

version courte

  1. Vous avez à la fois le débogage et minimisé les versions d'un script dans votre projet dans le cadre du même dossier:
    • script.js
    • script.min.js
  2. Vous ajoutez uniquement script.js pour un bundle dans votre code.

Comme résultat vous sera automatiquement avoir le script.js inclus dans le DEBUG mode et script.min.js dans le COMMUNIQUÉ de mode.

version longue

Vous pouvez également avoir .debug.js version. Dans ce cas, le fichier est inclus dans l'ordre de priorité suivant dans DEBUG:

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

dans la PRESSE:

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

note

Et par la manière, la seule raison d'avoir un .min les versions de vos scripts en MVC4 est le cas lorsque la version minifiée ne peuvent pas être traitées automatiquement. Par exemple, le code suivant ne peut pas être occulté automatiquement:

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

Dans tous les autres cas, vous pouvez aller avec juste une version de débogage du script.

5voto

joelfp Points 31

Si tout ce que vous avez est une version compacte d'un fichier, la solution la plus simple que j'ai trouvé est de copier le minifiés fichier, supprimer .min à partir de la copie du nom du fichier, puis de référence de la non-minifiés nom de fichier dans votre bundle.

Par exemple, disons que vous avez acheté un js composant et ils vous ont donné un fichier appelé some-lib-3.2.1.min.js. Pour utiliser ce fichier dans un bundle, procédez de la manière suivante:

  1. Copie some-lib-3.2.1.min.js et renommer le fichier copié some-lib-3.2.1.js. Inclure à la fois les fichiers de votre projet.

  2. Référence à la non-compacte de fichier dans votre bundle, comme ceci:

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

Tout simplement parce que le fichier sans " min " dans le nom est en fait minifiés ne devrait pas causer des problèmes (autres que le fait que c'est essentiellement illisible). Il est utilisé uniquement en mode debug et obtient écrit comme un script séparé. Lorsqu'il n'est pas en mode debug, le pré-compilé min fichier doit être inclus dans votre bundle.

2voto

AcidPAT Points 373

Pour mon cas, j'utilisais la bibliothèque (magnifique!) Knockout.js qui vient en tant que versions Debug / Non:

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

Pour que cela fonctionne, j'ai inclus "Knockout- {Version} .js" (non-debug) dans mon Bundle et j'ai obtenu le .debug. Fichier js en mode débogage.

1voto

Un moyen facile suffit de renommer le fichier .min par exemple vous avez abc.min.css que de simplement renommer ce fichier en abc_min.css et l'ajouter à votre ensemble. Je suis sûr à 100% que cela fonctionnera. merci et codage heureux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X