我正在开发一个ASP.Net MVC 4应用程序,并使用Bundling和minifiction来呈现样式和脚本文件。
我有一个脚本文件(文件A ),当我使用时,调用另一个文件中的功能(文件B )
@Scripts.Render()
方法在文件B 之前为文件A 呈现link
标记,以便触发错误并且脚本无法正常运行。
有没有办法强制@Script.Render()
按特定顺序呈现link
代码而不为每个文件使用单独的分发包????
修改
我正在使用IncludeDirectory
方法将所有脚本文件包含在该文件夹中
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
"~/Scripts/js",
"*.js"));
}
}
答案 0 :(得分:9)
默认情况下,捆绑将按字母顺序添加脚本。它将移动已知的库并以正确的顺序添加它们(它将首先放入jQuery,然后放入jQuery-ui)。
最简单的方法是自己订购脚本。一种方法是将自定义脚本移到另一个文件夹,然后按所需顺序将所有脚本添加到自己的包中:
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
"~/Scripts/js","*.js"));
bundles.Add(new ScriptBundle("~/bundles/myScripts").Include(
"~/Scripts/custom/scriptB.js",
"~/Scripts/custom/scriptA.js"));
}
}
另一个选项是通配符。此选项仍包括将自定义脚本移动到自己的文件夹,但只有一个包(source):*
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").Include(
"~/Scripts/*.js",
"~/Scripts/custom/scriptB.js",
"~/Scripts/custom/scriptA.js"));
}
}
还有关于您的评论“有没有办法强制@Script.Render()
以特定顺序呈现link
标签而不为每个文件使用单独的包” - 请注意,单独的链接标记仅在调试中发生模式。在发布模式下部署后,只会有一个链接标记和一个文件。
答案 1 :(得分:6)
在此问题中将您自己的订购者编写为 Darin Dimitrov 回答:How can I specify an explicit ScriptBundle include order?
public class MyBundleOrderer : IBundleOrderer
{
public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
//any ordering logic here
return files;
}
}
答案 2 :(得分:1)
查看BundleCollection.FileSetOrderList以获取Bundeled文件的顺序。我发现了这篇关于它的博客文章:http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx这解释得非常好。
JQuery排序的示例代码:
BundleFileSetOrdering bundleFileSetOrdering1 = new BundleFileSetOrdering("jquery");
bundleFileSetOrdering1.Files.Add("jquery.js");
bundleFileSetOrdering1.Files.Add("jquery-min.js");
bundleFileSetOrdering1.Files.Add("jquery-*");
bundleFileSetOrdering1.Files.Add("jquery-ui*");
bundleFileSetOrdering1.Files.Add("jquery.ui*");
bundleFileSetOrdering1.Files.Add("jquery.unobtrusive*");
bundleFileSetOrdering1.Files.Add("jquery.validate*");
bundles.FileSetOrderList.Add(bundleFileSetOrdering1);
答案 3 :(得分:0)
您应该考虑使用Cassette http://getcassette.net/ 它支持基于每个文件中的脚本引用自动检测脚本依赖项。
如果您更喜欢坚持使用MS Web优化解决方案,但想要根据脚本引用安排脚本,那么您应该在http://blogs.microsoft.co.il/oric/2013/12/27/building-single-page-application-bundle-orderer/
阅读我的帖子博客