15

我正在开发一个 ASP.Net MVC 4 应用程序,并使用 Bundling 和 minifiction 来呈现样式和脚本文件。

我有一个脚本文件(File A ),它在另一个文件( File B )中调用函数,当我使用
@Scripts.Render()方法时,它会在File B之前为File Alink渲染标签,因此它会引发错误并且脚本无法正常工作。

有没有办法强制@Script.Render()以特定顺序呈现link标签而不为每个文件使用单独的包????

编辑

我正在使用IncludeDirectory方法将所有脚本文件包含在该文件夹中

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
                    "~/Scripts/js",
                    "*.js"));
    }
}
4

4 回答 4

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"));
    }
}

另一种选择是通配符。此选项仍然包括将您的自定义脚本移动到它们自己的文件夹,但只有一个包():*

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标签,而无需为每个文件使用单独的包” - 请注意,单独的链接标签仅在调试模式下发生。在发布模式下部署后,将只有一个链接标签和一个文件。

于 2013-01-28T14:07:54.933 回答
6

将您自己的订购者写成Darin Dimitrov回答这个问题:如何指定明确的 ScriptBundle 包含顺序?

public class MyBundleOrderer : IBundleOrderer
{
    public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        //any ordering logic here

        return files;
    }
}
于 2013-01-28T14:15:45.510 回答
1

查看 BundleCollection.FileSetOrderList 以了解捆绑文件的顺序。我发现了这篇关于它的博客文章: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);
于 2013-06-17T10:22:07.180 回答
0

您应该考虑使用 Cassette http://getcassette.net/ 它支持根据在每个文件中找到的脚本引用自动检测脚本依赖项。

如果您更喜欢坚持 MS Web 优化解决方案,但喜欢根据脚本参考安排脚本的想法,您应该阅读我的博文http://blogs.microsoft.co.il/oric/2013/12/27/building-single -page-application-bundle-orderer/

于 2013-12-27T21:40:22.620 回答