Estou testando o recurso MVC4 System.Web.Optimization 1.0 ScriptBundle .
Tenho a seguinte configuração:
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);
}
}
e a seguinte visão:
<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>
onde BundlePaths.CanvasScripts
está "~/bundles/scripts/canvas"
. Ele processa isso:
<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>
Até aqui tudo bem, exceto que ~/Scripts/Shared/achievements.js
é o primeiro script na fonte agrupada. Depende de cada script incluído antes dele no ScriptBundle
. Como posso garantir que ele respeite a ordem em que adiciono instruções de inclusão ao pacote?
Atualizar
Este era um aplicativo ASP.NET MVC 4 relativamente novo, mas fazia referência ao pacote de pré-lançamento da estrutura de otimização. Eu o removi e adicionei o pacote RTM de http://nuget.org/packages/Microsoft.AspNet.Web.Optimization . Com a versão RTM com debug = true em web.config, @Scripts.Render("~/bundles/scripts/canvas")
renderiza as tags de script individuais na ordem correta.
Com debug = false em web.config, o script combinado tem o script Achievements.js primeiro, mas como é uma definição de função (construtor de objeto) que é chamada posteriormente, ele é executado sem erros. Talvez o minificador seja inteligente o suficiente para descobrir dependências?
Também tentei a IBundleOrderer
implementação que Darin Dimitrov sugeriu com RTM com ambas as opções de depuração e se comportou da mesma forma.
Portanto, a versão reduzida não está na ordem que espero, mas funciona.
Você pode escrever um ordenador de pacote personalizado (
IBundleOrderer
) que garantirá que os pacotes sejam incluídos no pedido em que você os registra:e depois:
e na sua opinião:
fonte
Obrigado Darin. Eu adicionei um método de extensão.
Uso
fonte
FileInfo
paraBundleFile
na assinatura do método de interface. Eles mudaram isso.BundleFile
aula? Para agrupar recursos incorporados, estou tentando instanciar isso e requer umVirtualFile
parâmetro (filho concreto de) em seu construtor.Atualizado a resposta fornecida pelo SoftLion para lidar com as mudanças no MVC 5 (BundleFile vs FileInfo).
Uso:
Gosto de usar sintaxe fluente, mas também funciona com uma única chamada de método e todos os scripts passados como parâmetros.
fonte
Você deve ser capaz de definir o pedido com a ajuda de BundleCollection.FileSetOrderList. Dê uma olhada nesta postagem do blog: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx . O código em sua instância seria algo como:
fonte
Você deve considerar o uso de Cassette http://getcassette.net/ Ele suporta detecção automática de dependências de script com base nas referências de script encontradas dentro de cada arquivo.
Se você preferir usar a solução MS Web Optimization, mas gosta da ideia de organizar scripts com base em referências de script, leia minha postagem do blog em http://blogs.microsoft.co.il/oric/2013/12/27/building-single -page-application-bundle-orderer /
fonte
A resposta de @Darin Dimitrov funciona perfeitamente para mim, mas meu projeto foi escrito em VB, então aqui está sua resposta convertida para VB
Para usá-lo:
fonte
Class 'AsIsBundleOrderer' must implement 'Function OrderFiles(context as ....)' for interface 'System.Web.Optimization.IBundleOrderer'
Alguma ideia?