В настоящее время я работаю над улучшением одного из наших сайтов. Оценка баллов по показам PageSpeed, в настоящий момент мы колеблются около 90
, мы хотели бы прорваться в середину 90-х, если возможно ,Перемещение сценариев инструментария Ajax в нижней части страницы
Одна из точек преткновения у нас является то, что менеджер инструментарий скрипт Ajax генерирует свой сценарий в верхней части страницы, Google флаги это как вопрос «должны исправить» и жалуются, что скрипт оказывает блокирующий и его следует перемещать в нижнюю часть страницы или загружать асинхронно или через атрибут defer
.
Я использую следующий, чтобы объединить наши скрипты в один файл .js
, чтобы свести к минимуму запросов:
<ajaxToolkit:ToolkitScriptManager ID="manScript" LoadScriptsBeforeUI="false" runat="server" EnableViewState="false" ScriptMode="Release">
<CompositeScript ScriptMode="Release" Path="/CMSGlobalFiles/Js/combinedajax.min.js">
<Scripts>
<asp:ScriptReference Name="WebForms.js" Path="/CMSGlobalFiles/Js/aspnet/WebForms.js" Assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<asp:ScriptReference Name="MicrosoftAjax.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjax.js" />
<asp:ScriptReference Name="MicrosoftAjaxWebForms.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjaxWebForms.js" />
</Scripts>
</CompositeScript>
</ajaxToolkit:ToolkitScriptManager>
Есть ли способ установить либо defer
или async
на CompositeScript
тег, который получает выход? Или любой другой способ переместить это в нижнюю часть страницы?
Я попытался следующие:
protected override void Render(HtmlTextWriter writer)
{
StringWriter output = new StringWriter();
base.Render(new HtmlTextWriter(output));
string outputAsString = output.ToString();
if(outputAsString.Contains("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>"))
{
outputAsString = outputAsString.Replace("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>", string.Empty);
}
writer.Write(outputAsString);
}
, а затем вручную включить ссылку на сценарий в нижней части страницы:
<script type="text/javascript">
function downloadJSAtOnload() {
createScript("/CMSGlobalFiles/Js/combinedajax.min.js?v=1");
createScript("//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js");
createScript("/cmsglobalfiles/js/vendor/modernizr.js");
createScript("/cmsglobalfiles/js/main.min.js");
createScript("/cmsglobalfiles/js/vendor/wow.min.js");
}
function createScript(path) {
var element = document.createElement("script");
element.src = path;
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
Это удаляет сгенерированный композитный сценарий и создает новый до закрывающего тега тела, это приносит наш результат до 95
, но я думаю, что это загружается слишком поздно, поскольку мы получаем много ошибок консоли:
ReferenceError: Sys is not defined
WebForm_InitCallback is not defined
Что означает, что диспетчер скриптов сломан, есть ли способ достичь этого?
Какую версию ACT вы используете? Вы пытались перейти на последнюю версию и использовать [Bundling] (https://github.com/DevExpress/AjaxControlToolkit/wiki/How-to-use-bundling-and-CDN)? –
@MikhailTymchuk В настоящее время я использую связывание, но проблема заключается в том, что сгенерированный скрипт сложения появляется в верхней части страницы и помечен как блокировка визуализации – DGibbs