J'essaye la fonctionnalité MVC4 System.Web.Optimization 1.0 ScriptBundle .
J'ai la configuration suivante:
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
// shared scripts
Bundle canvasScripts =
new ScriptBundle(BundlePaths.CanvasScripts)
.Include("~/Scripts/modernizr-*")
.Include("~/Scripts/json2.js")
.Include("~/Scripts/columnizer.js")
.Include("~/Scripts/jquery.ui.message.min.js")
.Include("~/Scripts/Shared/achievements.js")
.Include("~/Scripts/Shared/canvas.js");
bundles.Add(canvasScripts);
}
}
et la vue suivante:
<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>
où BundlePaths.CanvasScripts
est "~/bundles/scripts/canvas"
. Il rend ceci:
<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>
Jusqu'ici tout va bien, sauf ~/Scripts/Shared/achievements.js
le premier script de la source fournie. Cela dépend de chaque script inclus avant dans le fichier ScriptBundle
. Comment puis-je m'assurer qu'il respecte l'ordre dans lequel j'ajoute des instructions d'inclusion à l'ensemble?
Mettre à jour
Il s'agissait d'une application ASP.NET MVC 4 relativement nouvelle, mais elle faisait référence au package de pré-version du framework d'optimisation. Je l'ai supprimé et ajouté le package RTM de http://nuget.org/packages/Microsoft.AspNet.Web.Optimization . Avec la version RTM avec debug = true dans web.config, @Scripts.Render("~/bundles/scripts/canvas")
restitue les balises de script individuelles dans le bon ordre.
Avec debug = false dans web.config, le script combiné a d'abord le script réalisations.js, mais comme il s'agit d'une définition de fonction (constructeur d'objet) appelée plus tard, il s'exécute sans erreur. Peut-être que le minificateur est assez intelligent pour comprendre les dépendances?
J'ai également essayé l' IBundleOrderer
implémentation suggérée par Darin Dimitrov avec RTM avec les deux options de débogage et elle s'est comportée de la même manière.
La version minifiée n'est donc pas dans l'ordre que j'attends, mais cela fonctionne.
Vous pouvez écrire un outil de commande de
IBundleOrderer
lots personnalisé ( ) qui garantira que les lots sont inclus dans l'ordre dans lequel vous les enregistrez:puis:
et à votre avis:
la source
Merci Darin. J'ai ajouté une méthode d'extension.
Usage
la source
FileInfo
pourBundleFile
la signature de la méthode d'interface. Ils l'ont changé.BundleFile
cours? Afin de regrouper les ressources intégrées, j'essaie de l'instancier et cela nécessite unVirtualFile
paramètre (enfant concret de) dans son constructeur.Mise à jour de la réponse fournie par SoftLion pour gérer les modifications dans MVC 5 (BundleFile vs FileInfo).
Usage:
J'aime utiliser une syntaxe fluide, mais cela fonctionne également avec un seul appel de méthode et tous les scripts passés en paramètres.
la source
Vous devriez être en mesure de définir l'ordre à l'aide de BundleCollection.FileSetOrderList. Jetez un œil à ce billet de blog: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx . Le code de votre instance serait quelque chose comme:
la source
Vous devriez envisager d'utiliser Cassette http://getcassette.net/ Il prend en charge la détection automatique des dépendances de script en fonction des références de script trouvées dans chaque fichier.
Si vous préférez vous en tenir à la solution MS Web Optimization mais que vous aimez l'idée d'organiser des scripts basés sur des références de script, vous devriez lire mon article de blog à l' adresse http://blogs.microsoft.co.il/oric/2013/12/27/building-single -page-application-bundle-commande /
la source
La réponse de @Darin Dimitrov fonctionne parfaitement pour moi, mais mon projet est écrit en VB, alors voici sa réponse convertie en VB
Pour l'utiliser:
la source
Class 'AsIsBundleOrderer' must implement 'Function OrderFiles(context as ....)' for interface 'System.Web.Optimization.IBundleOrderer'
idées?