私はMVC 4
でウェブサイトを設計しました。今、リソースのロードとスクリプトの実行のタイミングに問題がありました。なぜなら、より高い優先順位(例えば、jQuery
)を持ち、最初に実行されなければならないが、他のスクリプトの後ろに読み込まれ、それらに依存するスクリプトが以前に読み込まれて実行されているライブラリがエラーを引き起こしているからです。非同期ロードでMVCバンドルを注文する方法は?
スクリプトの私のバンドルは次のとおりです。
bundles.Add(new ScriptBundle("~/bundles/scripts").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery-migrate.min.js",
"~/Scripts/jquery.unobtrusive-ajax.min.js",
"~/Scripts/jquery.knob.min.js",
"~/Scripts/toastr.min.js",
"~/Scripts/bootstrap.min.js",
"~/Scripts/respond.js",
"~/Scripts/bootstrap-select.min.js",
"~/Scripts/smoothscrool.js",
"~/Scripts/scrollReveal.js",
"~/Scripts/easing.min.js",
"~/Scripts/site.js"));
bundles.Add(new ScriptBundle("~/bundles/contact").Include(
"~/Scripts/contact.js"));
これが私のレイアウトです:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
@Scripts.RenderFormat("<script type=\"text/javascript\" src=\"{0}\" async></script>", "~/bundles/scripts")
<div id="page-content">
@RenderBody()
</div>
@RenderSection("scripts", required: false)
</body>
</html>
あなたが見ることができるように、身体の初めに、スクリプトが非同期をロードする:
@Scripts.RenderFormat("<script type=\"text/javascript\" src=\"{0}\" async></script>", "~/bundles/scripts")
これは私のコンタクトビューの剃刀コードです:
@section scripts
{
@Scripts.Render("~/bundles/contact")
}
<div>
Contact Contents
</div>
ここでセクションスクリプトは本体の最後にロードされますが、しかし、リソースの非同期ロードのために、従属スクリプトは以前にロードされていた(レイアウトスクリプトよりもコンパクトであるため)、エラーが発生しました。
すべてのレイアウト非同期スクリプトを実行した後に依存スクリプトを強制的に実行する方法
はあなたのような音すべてのものが正しく注文された状態で1つのタグ/ファイルを吐き出すだけでよいのです。 https://msdn.microsoft.com/en-us/library/system.web.optimization.scripts.renderformat(v=vs.110).aspx * RenderFormatは、指定された書式文字列を使用して、指定されたパスのスクリプトタグを生成します。 EnableOptimizationsがfalseに設定されている場合、バンドル内の各項目に対して複数のスクリプトタグが生成されます。最適化を有効にすると、バンドル全体を表すバージョンスタンプ付きのURLに単一のスクリプトタグが生成されます*スクリプトごとにビューごとに1つのバンドルが必要です。 –
@ ta.speot.is EnableOptimizationsがtrueです。私のcontact.jsスクリプトはContactビューで使用されていますので、レイアウトバンドルに追加する権利です。このスクリプトはすべてのページにロードされます。 – Behzad
*ビューごとに1つのバンドルが必要* –