Я ищу, чтобы оптимизировать способ загрузки больших файлов javascript в моем MVC-проекте. Я уже использую связывание и минимизацию, но мне бы хотелось загрузить только несколько из них ПОСЛЕ загрузки HTML и CSS. Я смотрел на такого рода подход:Откладывание загрузки javascript в asp.net MVC
https://varvy.com/pagespeed/defer-loading-javascript.html
В этом подходе теги сценария впрыскивают в использовании JavaScript в случае загрузки/OnLoad после загрузки тела. Моя проблема заключается в том, что я хотел бы использовать наряду с набором и минимизацией, предлагаемыми каркасом, и я не нашел хорошего способа сделать это.
Я просто задаюсь вопросом, успешно ли кто-либо использовал этот подход с проектами MVC, и, возможно, уже может быть библиотека (на Nuget или иначе), чтобы облегчить это.
EDITED: Вот мое текущее решение, но я не уверен, что мне это нравится.
Поскольку структура Bundling может возвращать один тег сценария или список из них в зависимости от того, выполняется ли вы отлаживать или нет, нам нужно извлечь исходные значения для этих тегов. Для этого я создал статический помощник.
public static string ExtactFromScriptBundle(string aBundle)
{
List<string> returnValue = new List<string>();
var jQueryString = Scripts.Render(aBundle).ToHtmlString();
var reg = new Regex("\".*?\"");
var matches = reg.Matches(jQueryString);
foreach (var match in matches)
{
returnValue.Add(match.ToString().Replace("\"", ""));
}
return Json.Encode(returnValue);
}
чем от _layout.cshtml вы cound вставить блок, как следующий прямо перед тегом:
<script>
function downloadJSAtOnload() {
createScripElementsFromArray(@Html.Raw(ScriptHelper.ExtactFromScriptBundle("~/bundles/jquery")));
createScripElementsFromArray(@Html.Raw(ScriptHelper.ExtactFromScriptBundle("~/bundles/bootstrap")));
}
function createScripElementsFromArray(fileNameList) {
var arrayLength = fileNameList.length;
for (var i = 0; i < arrayLength; i++) {
createScripElement(fileNameList[i]);
}
}
function createScripElement(fileName) {
var element = document.createElement("script");
element.src = fileName;
document.body.appendChild(element);
console.log(fileName + " was loaded");
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
Это немного хак на мой взгляд, так как я рендеринга пучки просто разобрать выход, но я думаю, что я мог бы также кэшировать эти выходные данные для дальнейшей оптимизации рендеринга страницы.
Проблема с этим подходом заключается в том, что он не использует структуру связывания/минимизации для сжатия test.js. – daoom