【问题标题】:Ordering the scripts & css inside the bundle, should i use IEnumerable<BundleFile> OR IEnumerable<FileInfo>在捆绑包中订购脚本和 css,我应该使用 IEnumerable<BundleFile> 还是 IEnumerable<FileInfo>
【发布时间】:2015-12-06 01:30:58
【问题描述】:

我正在开发一个 asp.net mvc-5 Web 应用程序。我有以下脚本和 css 文件包如下:-

  bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/bootstrap.min.js",
                     "~/Scripts/tm-scripts.js",
                     "~/Scripts/activeMenuItem.js",
                     "~/Scripts/respond.js"
                      ));

            bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/bootstrap.css",
                     // "~/Content/style.css", 
                      "~/Content/touchTouch.css",
                      "~/fonts/font-awesome.css"));

现在我定义脚本和 css 的方式将导致脚本按字母顺序排列,而我希望脚本根据添加的方式进行排序。现在从我自己的阅读和搜索中我发现我可以使用IBundleOrderer. ro 定义订单。但正如这个问题所示link 似乎有两种方法可以使用IEnumerable&lt;BundleFile&gt;IEnumerable&lt;FileInfo&gt; 来实现这个,所以我需要遵循哪种方法?

第一种方法:-

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}

或者第二种方法:-

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

【问题讨论】:

  • 实际上,您提供的链接描述了何时应用“排序”(如果/当您使用通配符时)。还有另一个命令occurs for "known libraries" this post describes,所以在你做任何事情之前,看看它是否适用于你。嗯……
  • @EdSF 对不起,我没有明白你的意思,现在如果我不实现 IBundleOrderer,那么即使我不使用通配符,即使我不使用通配符,我也不能 100% 保证脚本的顺序使用 .Include ,我将脚本一一包含在包中。因为默认捆绑包可能会为某些脚本提供最高优先级。所以为了避免这种行为,我必须实现我自己的 IBundleOrderer ,所以我的问题是我应该使用 IEnumerable 还是 IEnumerable

标签: asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

首先,这不是直接回答您的问题,也不适合 cmets:

“通过通配符添加脚本默认按字母顺序加载它们,这通常不是您想要的。CSS 和 JavaScript 文件经常需要以特定(非字母)顺序添加。您可以缓解这种情况添加自定义 IBundleOrderer 实现会带来风险,但显式添加每个文件不太容易出错。"

参考号:ASP.Net Bundling and Minification

在实践中: 这是使我免于“已知库”的错误排序的“隐藏排序”。

 bundles.Add(new ScriptBundle("~/bundles/sitescripts").Include(

             //add my own scripts explicitly
             "~/Scripts/bscript.js",
             "~/Scripts/zscript.js",
             "~/Scripts/ascript.js",

             //purposely calling wrong order
             "~/Scripts/jquery.validate.js",
             "~/Scripts/jquery-{version}.js"
  ));

DEBUG 模式下,ASP.Net 将我从 "known libraries" by ordering them properly 的错误中解救出来。 HTML 源代码:

<script src="/Scripts/jquery-2.1.4.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/bscript.js"></script>
<script src="/Scripts/zscript.js"></script>
<script src="/Scripts/ascript.js"></script>
  • jqueryjquery.validate 呈现正确的顺序
  • 我对“我的脚本”的排序保持不变,没有按任何字母顺序(但 jquery 在我的脚本之前排序 - 更多内容见下文)

Production/Live 中(奇怪的是,行为与 DEBUG 不同,但实际上是我想要/期望的),“我的订单”(显式)被保留完全 并且已知库的默认排序正在发挥作用。

捆绑/缩小脚本的屏幕截图,Chrome 开发工具“美化”以提高可读性:

  • 我的脚本的顺序被保留为明确添加在Bundle
  • 包括“已知库”——它们是在我的脚本之后Bundle 中明确添加的(但是这种行为与 DEBUG 不同)。
  • 但是 ASP.net 仍然使我免于 已知库 的错误排序(jquery lib 在 validate 之前)

至于“为什么”DEBUGPRODUCTION 行为不同(在 Debug 中,已知库在我的脚本之前排序),我不知道并且会推迟....


更新:

回到link/answer of Hao Kung,它提到了ResetAll()。所以有效地使用它:

  • 删除任何默认排序
  • 将完全遵循您的明确命令(它不会使您免于任何错误)
  • DEBUG 和 PRODUCTION 中的一致行为

所以:

 public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.ResetAll(); //does what it says in DEBUG and Production

        bundles.Add(new ScriptBundle("~/bundles/sitescripts").Include(
                    "~/Scripts/bscript.js",
                    "~/Scripts/zscript.js",
                     "~/Scripts/ascript.js",
                    "~/Scripts/jquery.validate.js",
                    "~/Scripts/jquery-{version}.js"
                    ));

调试 HTML 源代码(完全保留,不保存排序错误):

<script src="/Scripts/bscript.js"></script>
<script src="/Scripts/zscript.js"></script>
<script src="/Scripts/ascript.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery-2.1.4.js"></script>

生产屏幕截图(已美化并已在validate 中显示错误):

第...

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2019-09-04
    • 1970-01-01
    • 2012-10-28
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多