【问题标题】:ScriptBundle dependenciesScriptBundle 依赖项
【发布时间】:2012-10-26 08:43:56
【问题描述】:

我很难让ScriptBundle 正常工作(如果这应该工作的话)。我要做的是添加另一个包(jQuery)作为我的包的依赖项,如下所示:

bundles.Add(new ScriptBundle("~/js/myscripts")
                    .Include("~/js/jquery",
                             "~/Content/scripts/myscript.js"));

~/js/jquery 是 jQuery 包的“名称”(虚拟路径),如此注册(在我的依赖包之前):

bundles.Add(new ScriptBundle("~/js/jquery")
                    .Include("~/Content/scripts/jquery-{version}.js"));

在我看来,当我执行@Scripts.Render("~/js/myscripts") 时,只有myscript.js 会呈现为HTML。如果我将 jQuery 的虚拟路径从捆绑名称中的路径更改为物理的现有路径,它可以工作:

bundles.Add(new ScriptBundle("~/js/myscripts")
                    .Include("~/Content/scripts/jquery-{version}.js",
                             "~/Content/scripts/myscript.js"));

此外,在视图中执行 @Scripts.Render("~/js/jquery") 也可以。它只是引用另一个不起作用的 ScriptBundle 的不存在的虚拟路径(名称)。这应该工作吗?如果没有,我想知道我可以在哪里发布错误报告,说如果不支持这种情况应该抛出异常。如果支持,它在哪里说,为什么它不起作用?

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-optimization


    【解决方案1】:

    根据你的依赖关系,你需要在你的布局(视图)中添加什么

    @Scripts.Render("~/js/jquery")
    @Scripts.Render("~/js/myscripts")
    

    评论后更新:

    您不能嵌套捆绑包,也就是说,您不能在捆绑包中包含捆绑包,在创建父捆绑包时,该虚拟路径很可能不可用。

    通常我有一个单独的 jquery 包(包括其他一些不经常更改的 js),然后是另一个 js 包用于其他所有内容。非常适合浏览器缓存。

    附带说明一下,您是否查看过 requireJS,如果您正在捆绑所有内容,这并不是真正需要的,但它确实使您的 js 文件更好地记录,因为它使依赖关系明确

    【讨论】:

    • 我不想看到两个条目,我想要一个 ~/js/myscripts。如果我 Include 是 jQuery 的物理路径,这是可能的,但如果我 Include 是虚拟路径(用于 jQuery 的包名称),则不是。
    • 啊,我明白了。这不是捆绑的错误。您不能在包中包含包路径。这不是我的电话,但当/如果你用微软记录这个我会说这是一个功能请求。通常我有一个单独的 jquery 包(包括其他一些不经常更改的 js),然后是另一个 js 包用于其他所有内容。适用于浏览器缓存。附带说明一下,您是否看过 requireJS,如果您要捆绑所有内容,则不需要它,但它确实使您的 js 文件更好地记录,因为它使依赖关系明确。
    • 当不受支持的场景不会引发异常时,这是一个错误。虚拟路径的所有其他拼写错误、对不存在的文件的引用等都会引发异常,因此也应该如此。是的,我在我的许多项目中都使用 RequireJS,但是这个非常简单,我希望将 jQuery 和我自己的 JS 捆绑到一个 .js 文件中。
    • 对异常来说足够公平,这很好,尽管我想他们很难推断出它是一个捆绑包而不是一个要包含的文件夹。对于同一文件中的两者,您在第三个示例中的问题中都有答案。
    • 如果您提供的虚拟路径在物理上不存在且不作为另一个ScriptBundle 的名称存在,则会引发异常。所以那里有逻辑来检查已经注册的虚拟路径的虚拟路径,但它只是不做任何事情。这显然是一个错误,imo。
    【解决方案2】:

    不支持,但您可以想出自己的解决方案,对吧?比如:

    var jquery = new[] { "~/Content/scripts/jquery-{version}.js" };
    var myScripts = jquery.Concat(new[] { "~/Content/scripts/myscript.js" }).ToArray();
    var myOtherScripts = myScripts.Concat(new[] { "~/Content/scripts/otherscript.js").ToArray();
    
    bundles.Add(new ScriptBundle("~/js/jquery").Include(jquery));
    bundles.Add(new ScriptBundle("~/js/myscripts").Include(myScripts));
    bundles.Add(new ScriptBundle("~/js/other").Include(myOtherScripts));
    

    【讨论】:

      【解决方案3】:

      似乎这是一个不受支持的功能,所以我已经 reported an issue 支持它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2014-08-20
        • 2016-02-18
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        相关资源
        最近更新 更多