Estoy probando la función MVC4 System.Web.Optimization 1.0 ScriptBundle .
Tengo la siguiente configuración:
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);
}
}
y la siguiente vista:
<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>
donde BundlePaths.CanvasScripts
esta "~/bundles/scripts/canvas"
. Hace esto:
<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>
Hasta ahora todo va bien, excepto que ~/Scripts/Shared/achievements.js
es el primer script en la fuente incluida. Depende de cada script incluido antes en el ScriptBundle
. ¿Cómo puedo asegurarme de que respeta el orden en el que agrego declaraciones de inclusión al paquete?
Actualizar
Esta era una aplicación ASP.NET MVC 4 relativamente nueva, pero hacía referencia al paquete de versión preliminar del marco de optimización. Lo eliminé y agregué el paquete RTM de http://nuget.org/packages/Microsoft.AspNet.Web.Optimization . Con la versión RTM con debug = true en web.config,@Scripts.Render("~/bundles/scripts/canvas")
procesa las etiquetas de script individuales en el orden correcto.
Con debug = false en web.config, la secuencia de comandos combinada tiene la secuencia de comandos logros.js primero, pero como es una definición de función (constructor de objeto) que se llama más tarde, se ejecuta sin errores. ¿Quizás el minificador es lo suficientemente inteligente como para descubrir dependencias?
También probé el IBundleOrderer
implementación que sugirió Darin Dimitrov con RTM con ambas opciones de depuración y se comportó igual.
Entonces, la versión minificada no está en el orden que esperaba, pero funciona.
Puede escribir un orden de paquetes personalizado (
IBundleOrderer
) que garantizará que los paquetes se incluyan en el orden en que los registre:y entonces:
y en tu opinión:
fuente
Gracias Darin. Agregué un método de extensión.
Uso
fuente
FileInfo
paraBundleFile
en la firma del método de interfaz. Ellos lo cambiaron.BundleFile
clase? Para agrupar recursos incrustados, estoy tratando de instanciar eso y requiere unVirtualFile
parámetro (hijo concreto de) en su constructor.Se actualizó la respuesta proporcionada por SoftLion para manejar los cambios en MVC 5 (BundleFile vs FileInfo).
Uso:
Me gusta usar una sintaxis fluida, pero también funciona con una sola llamada a un método y todos los scripts pasados como parámetros.
fuente
Debería poder establecer el orden con la ayuda de BundleCollection.FileSetOrderList. Eche un vistazo a esta publicación de blog: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx . El código en su instancia sería algo como:
fuente
Debería considerar el uso de Cassette http://getcassette.net/ Admite la detección automática de dependencias de scripts en función de las referencias de scripts que se encuentran dentro de cada archivo.
Si prefiere seguir con la solución de optimización web de MS pero le gusta la idea de organizar scripts basados en referencias de scripts, debe leer mi publicación de blog en http://blogs.microsoft.co.il/oric/2013/12/27/building-single -página-solicitud-paquete-ordenador /
fuente
La respuesta de @Darin Dimitrov funciona perfectamente para mí, pero mi proyecto está escrito en VB, así que aquí está su respuesta convertida a VB
Para usarlo:
fuente
Class 'AsIsBundleOrderer' must implement 'Function OrderFiles(context as ....)' for interface 'System.Web.Optimization.IBundleOrderer'
Alguna idea?