强制ASP.Net MVC Bundle以特定顺序呈现javascript文件

时间:2013-01-28 13:45:58

标签: asp.net .net-4.0 asp.net-mvc-4 bundle bundling-and-minification

我正在开发一个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"));
    }
}

4 个答案:

答案 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/

阅读我的帖子博客