Как лучше всего контролировать загрузку нескольких файлов JavaScript в ASP.NET?
Я смотрю на повышение производительности загрузки страницы и времени рендеринга довольно сложного сайта ASP.NET.
Из-за использования большого количества элементов управления ASP.NET, которые сами включают файлы javascript (просто используя тег script), некоторые страницы загружают один и тот же javascript до 10 раз. Кроме того, некоторые javascript должны быть загружены в начале страницы, в то время как другие лучше включить в конце. Некоторые из них я хотел бы динамически загружать после события onload вместо явного включения в страницу.
Я думаю о том, чтобы позволить всем различным элементам управления регистрировать свою потребность в конкретном файле javascript в центральном месте, которое, в свою очередь, контролирует генерацию тегов сценария (таким образом избегая дубликатов) и где они вставляются в сгенерированный вывод., Это также упростит динамическое переключение между минимизированными и полными файлами javascript (например, добавление debug = true в строку запроса приведет к загрузке файлов по имени filename.debug.js вместо filename.compressed.js).
Используя это решение, можно также сгенерировать массив имен файлов javascript, которые используются пользовательской функцией javascript onload для динамической загрузки скриптов.
Каков наилучший способ сделать это? Использовать или расширять что-то вроде ScriptManager, создавать собственный элемент управления, переопределять объект Page?
2 ответа
В методе Page_Load элемента управления вы можете зарегистрировать свой javascript для вывода (после подтверждения того, что он еще не зарегистрирован).
Например,
ClientScriptManager script = Page.ClientScript;
if (!script.IsClientScriptIncludeRegistered("AlertHello"))
{
script.RegisterClientScriptInclude("AlertHello", "Public/AlertHello.js");
}
ПРИМЕЧАНИЕ: вы можете использовать .RegisterClientScriptBlock()
если вы хотите иметь блок JS вместо отдельного файла.
Тем не менее, это выводит тег script вскоре после открытия тега формы страницы. Чтобы вывести ваш скрипт ближе к концу страницы (т. Е. Непосредственно перед закрытием тега формы), используйте .RegisterStartupScript()
методы.
ClientScriptManager script = Page.ClientScript;
if (!script.IsStartupScriptRegistered("StartupAlert"))
{
script.RegisterStartupScript(this.GetType(), "StartupAlert",
"<script type='text/javascript' src='Public/Alert.js'></script>");
}
Предполагая, что он вам абсолютно необходим в определенном месте, вы можете добавить статическое (или "общее" в VB.NET) свойство только для чтения, которое возвращает тег сценария, и логическое свойство, которое сообщает элементу управления, выводить ли тег сценария. В этом случае, в вашем ASPX, вы можете сделать что-то вроде...
<body>
<!-- any place -->
<uc1:myControl ID="myControl1" runat="server" jsOutput="False" />
<!-- elsewhere -->
<asp:Literal ID="litJS" runat="server" OnLoad="litJS_Load" />
</body>
Тогда программа litJS_Load
установить свойство Text отправителя в строку, возвращаемую статическим свойством класса myControl.
Как уже упоминалось, использование регистрации скрипта с помощью события Load элементов управления является хорошей идеей, если они являются скомпилированными элементами управления, вы также можете ссылаться на них как на встроенный ресурс... Если вы используете ASP.Net Ajax, вы можете использовать ScriptManager, который может объединить скрипты на вашей странице в один непрерывный блок для скачивания.
У Yahoo также есть много информации относительно производительности скриптов, рекомендации для этого также включены в расширение YSlow для Firefox, которое расширяет firebug.
В дополнение к наличию сценариев в качестве внешнего ресурса необходимо включить сжатие на сервере, что может уменьшить загрузку различных сценариев. Не говоря уже о минимизации включенных скриптов.