私はGoogleマップにjQueryライブラリーを使用していますが、それは最初にロードされるGoogleスクリプトに依存しています。両方をバンドルに含めることができるようにしたいと思います。
_ 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サポートを既に使用しているため、そもそもそれがどのような意味を持つのかは不明です。そのため、ユースケースでconflictがどのように使用されるかは不明です。
現在、バンドルの内部に依存しているjqueryのローカルコピーを含める必要があります。または、言及したようにスクリプトタグを管理する必要があります。私たちはこの種の依存性管理の問題を認識しており、これはこれで追跡している資産管理のカテゴリーに該当します codeplexの作業項目
System.Web.Optimization
> = 1.1.2のバージョンを使用している場合、Styles
およびScripts
のURLを上書きする新しい便利な方法があります。以下の例では、web.config
からCdnBaseUrl
を取得して、すべてのスクリプトとスタイルシートのベース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..."
));
}
}
MVCチュートリアルに基づいて、CDNからバンドルを作成するための構文が正しくありません。そして、他の人が言ったように、あなたがbundles.UseCdn = true;
プロパティセット。 MVCサイト の例を使用すると、コードは次のようになります。
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&libraries=places";
bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
"~/Scripts/jquery-{version}.js"));
}
バンドル内の絶対URLを取得するだけの問題であれば、これに進むことができます。
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から動作を取得し、それに絶対URLを適用します。次に、ビューに書き込む必要があります
@Url.RenderScript("~/bundles/jquery")
の代わりに
@Scripts.Render("~/bundles/jquery")
コーディングをお楽しみください!! ...
私は提案されたようにこれを試しましたが、うまくいきませんでした:
string googleMapsApiCDN = "http://maps.google.com/maps/api/js?sensor=false&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スクリプト--両方が除外されていますです。
CDNサポートを有効にして、絶対URLが機能するかどうかを確認しましたか?
bundles.UseCdn = true;