ASP.NET Web Optimization - 关于加载顺序的混淆

时间:2014-08-22 16:15:23

标签: asp.net web-optimization

使用ASP.NET Web Optimization Framework,我正在尝试加载一些javascript文件。它工作正常,除了我遇到加载顺序,加载速度或执行的特殊情况。我无法弄清楚哪个。

基本上,我正在使用ace代码编辑器来实现javascript,我还希望包含它的自动完成包。这需要两个文件。

/ace.js

/ext-language_tools.js

这不是问题,如果我以正常方式加载这两个文件(使用<script>标签),它可以正常工作。但是当我尝试使用网络优化捆绑包时,似乎出现了问题。

试试这个......

bundles.Add(new ScriptBundle("~/bundles/js") {
   .Include("~/js/ace.js")
   .Include("~/js/ext-language_tools.js")
});

然后在视图中..

@Scripts.Render("~/bundles/js")

我收到错误

  

ace未定义

这意味着ace.js文件尚未运行或未加载。因为如果我将它分成两个包,它就会开始工作。

bundles.Add(new ScriptBundle("~/bundles/js") {
   .Include("~/js/ace.js")
});

bundles.Add(new ScriptBundle("~/bundles/js/language_tools") {
   .Include("~/js/ext-language_tools.js")
});

有谁可以解释为什么这会以这种方式表现?

1 个答案:

答案 0 :(得分:1)

MSDN Magazine: Programming CSS: Bundling and Minification中详细说明了这一点(滚动到更多高级捆绑功能部分)。

摘录(我加粗了一些文字):

  

特别是, BundleCollection 类有一些值得一提的功能,即使它们在捆绑脚本文件而不是CSS文件时非常有用。

     

第一个功能是订购。 BundleCollection类有一个名为Orderer的属性,类型为 IBundleOrderer 。尽管看起来很明显,但是,订购者是一个组件,负责确定您希望将文件捆绑下载的实际顺序。默认订货人是 DefaultBundleOrderer 类。此类按照通过FileSetOrderList设置的设置(BundleCollection的属性)生成的顺序捆绑文件。 FileSetOrderList被设计为BundleFileSetOrdering类的集合。这些类中的每一个都定义了文件的模式(例如,jquery- *),并且将BundleFileSetOrdering类添加到FileSetOrderList的顺序决定了文件的实际顺序。例如,给定默认配置,所有jQuery文件始终在Modernizr文件之前捆绑。

DefaultBundleOrderer课程的来源为here

然而,特别感兴趣的是BundleCollection班级&#39; AddDefaultFileOrderings 功能(截图如下)。

BundleCollection

现在,回到您的问题,在您的论坛中,您有ace.jsext-language_tools.js。后一个文件与ext-*匹配,因此将始终包含在ace.js之前的数据包中文件列表的顶部。

<强> SOLUTION:

已经回答HERE

同样的解决方案也在MSDN杂志中给出(链接在顶部)。

其中描述的另一种方法是使用以下代码&#34;重置所有排序&#34;:

    bundles.ResetAll();

&#34;在这种情况下,使用前面显示的默认订货人或穷人订货人的效果是相同的。但请注意,ResetAll也会重置脚本排序。&#34;