20

我为谷歌地图使用了一个 jQuery 库,它依赖于首先加载的谷歌脚本。我希望能够将两者都包含在捆绑包中:

  bundles.Add(new ScriptBundle("myfoobundle").Include(
    "http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places",
    "~/scripts/jquery.fooplugin-{version}.js"
  ));

这似乎不起作用(引发抱怨第一个字符串的异常)。有人可能会说这不应该工作,因为绝对 URL 并不意味着被缩小/捆绑。

但是当前的方法很麻烦,因为我需要确保依赖项是正确的,并且发生在不同的地方(捆绑代码中的一半问题,视图中的另一半)。

有一个如上所述的 1 步解决方案会很好。在这方面我有什么选择吗?

更新:

解决有关使用 CDN 作为解决方案的评论:如果我指定bundles.UseCdn = true它无效,我仍然会收到异常The URL 'http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places' is not valid. Only application relative URLs (~/url) are allowed。另外我不确定这样做的意义是什么,因为我已经使用了对 jQuery 等的 CDN 支持,所以不确定这会如何与我的用例发生冲突。

4

6 回答 6

11

如果您使用System.Web.Optimization>= 1.1.2 的版本,则有一种新的便捷方法可以覆盖 url 的 forStylesScripts。在下面的示例中,我获取了一个CdnBaseUrlfromweb.config以用作所有脚本和样式表的基本 url:

public class BundleConfig
{
    private static readonly string BaseUrl = ConfigurationManager.AppSettings["CdnBaseUrl"];

    public static void RegisterBundles(BundleCollection bundles)
    {
        // This is the new hotness!!
        Styles.DefaultTagFormat = "<link href=\"" + BaseUrl + "{0}\" rel=\"stylesheet\"/>";
        Scripts.DefaultTagFormat = "<script src=\"" + BaseUrl + "{0}\"></script>";

        bundles.Add(new ScriptBundle("~/bundles/js").Include(
            "Your scripts here..."
        ));

        bundles.Add(new StyleBundle("~/bundles/css").Include(
            "Your css files here..."
        ));
    }
}

有关静态站点 (CDN) 优化的更多信息

于 2015-03-11T23:23:04.553 回答
7

目前,您必须在捆绑包中包含您所依赖的 jquery 的本地副本,或者您必须管理您提到的脚本标签。我们知道这种依赖管理问题,它属于资产管理类别,我们正在使用codeplex 上的此工作项进行跟踪

于 2012-12-06T19:46:46.393 回答
6

Based on the MVC tutorials, your syntax is incorrect for creating a bundle from a CDN. And as others have said, ensure that you have the bundles.UseCdn = true; property set. Using the example on the MVC site - your code should reflect the following:

public static void RegisterBundles(BundleCollection bundles)
{
   bundles.UseCdn = true;   //enable CDN support
   //add link to jquery on the CDN
   var jqueryCdnPath = "http://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=places";
   bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
                "~/Scripts/jquery-{version}.js"));
}
于 2012-12-03T15:27:09.553 回答
5

如果只是在捆绑中获取绝对网址,那么您可以这样做。

public static class Extensions
    {
        public static IHtmlString RenderScript(this UrlHelper helper, params string[] paths)
        {
            string scripts = System.Web.Optimization.Scripts.Render(paths).ToHtmlString();
            string hostName = HttpContext.Current.Request.Url.Scheme + Uri.SchemeDelimiter + HttpContext.Current.Request.Url.Authority;
            string replaced = Regex.Replace(scripts, "src=\"/", "src=\"" + hostName + "/", RegexOptions.Multiline | RegexOptions.IgnoreCase);
            return new HtmlString(replaced);
        }
    }

这基本上会从 Scripts.Render 中获取 bahvior,然后对其应用绝对 URL。然后在视图中你必须写

  @Url.RenderScript("~/bundles/jquery")

代替

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

享受编码!...

于 2014-04-25T11:03:36.057 回答
1

我按照建议尝试了这个,但没有奏效:

string googleMapsApiCDN = "http://maps.google.com/maps/api/js?sensor=false&amp;language=en";
        bundles.Add(new ScriptBundle("~/bundles/gmap3", googleMapsApiCDN).Include(
                    "~/Scripts/GMap3/gmap3.min.js",         // GMap3 library
                    "~/Scripts/GMap3/mygmap3-about.js"      // Pops up and configures     
GMap3 on About page
                    ));

渲染了 mygmap3-about.js 脚本,但 gmap3.min.js 和来自 google 的 CDN 脚本都被排除在外

于 2014-01-30T16:21:30.533 回答
0

您是否尝试过启用 CDN 支持并查看是否允许绝对 URL 工作:

bundles.UseCdn = true;
于 2012-12-03T12:05:43.733 回答