#javascript #jquery #performance #optimization #render-blocking
#javascript #jquery #Производительность #оптимизация #блокировка рендеринга
Вопрос:
Я пытаюсь загрузить все файлы js, используя подход, описанный в этом видео @ 3:30 Оптимизируйте свой код: загружайте код в нужное время
Я реализовал этот подход в index.js как
<script>
var scripts = '<script src="./js/jquery-3.5.1.min.js"/>'
'<script src="./js/jquery-ui.min.js"/>'
'<script src="./js/bootstrap.min.js"/>'
'<script src="./js/index.js"/>';
$(window).on("load",function(){
$("body").append(scripts)
});
</script>
также пробовал, как в теге html head
<script>
var scripts = '<script src="./js/jquery-3.5.1.min.js"/>'
'<script src="./js/jquery-ui.min.js"/>'
'<script src="./js/bootstrap.min.js"/>'
'<script src="./js/index.js"/>';
$(window).on("load",function(){
$("body").append(scripts)
});
</script>
тем не менее, он не загружает все файлы js, которые я передаю в тегах скрипта, а также не загружает на вкладке сети.
Мой вопрос
- Действительно ли это лучший подход для загрузки всех скриптов подобным образом и должен соблюдаться постоянно?
- Если да, то что мне нужно оптимизировать приведенный выше код, чтобы он загружал целые скрипты и добавлял в html?
Комментарии:
1. Вы не можете использовать
$(window).on("load"
, если вы еще не загрузили jquery2. Также теги скрипта, добавленные через
append()
, не выполняются. Вы должны использовать $.getScript , добавить фактический объект элемента dom скрипта или использовать собственный API3. затем я должен загрузить jquery и другие файлы в тег script? тогда нет никакой пользы от загрузки только одного внешнего локального файла.
4. Нет, просто jquery — и если вы используете CDN, то есть большая вероятность, что ваш браузер уже кэширует его и обработал — так что загрузка с CDN будет быстрее, чем поздняя загрузка с локального
5. @freedomn-m: мне не разрешено использовать CDN в моих проектах, я должен использовать Jquery, Jquery-UI, Bootstrap4.js и index.js . Я должен добавить все файлы сценариев в head, а затем index.js как добавить?
Ответ №1:
jQuery еще не загружен, поэтому вы не можете его использовать. Поэтому я предлагаю вам использовать ванильное решение javascript. (Добавить как встроенный тег сценария прямо перед закрывающим тегом тела </body>
)
const scripts = [
"./js/jquery-3.5.1.min.js",
"./js/jquery-ui.min.js",
"./js/bootstrap.min.js",
"./js/index.js",
];
window.addEventListener("DOMContentLoaded", () => {
for(const script of scripts) {
const scriptTag = document.createElement("script");
scriptTag.src = script;
document.body.appendChild(scriptTag);
}
});
РЕДАКТИРОВАТЬ: Если вам нужно, чтобы скрипты загружались в определенном порядке. Вы можете использовать событие «load» для запуска следующего. Смотрите фрагмент ниже
const scripts = [
"./js/jquery-3.5.1.min.js",
"./js/jquery-ui.min.js",
"./js/bootstrap.min.js",
"./js/index.js",
];
window.addEventListener("DOMContentLoaded", () => loadScript(scripts, 0));
function loadScript(scripts, index) {
if (!scripts[index]) return;
const scriptTag = document.createElement("script");
scriptTag.src = scripts[index];
scriptTag.addEventListener("load", () => loadScript(scripts, index 1));
document.body.appendChild(scriptTag);
}
Комментарии:
1. Я должен добавить <script src=»./js/index.js»></script> in html then only it will load all script right ?
2. Нет — вы не помещаете этот скрипт в
index.js
— вы помещаете его непосредственно на страницу отдельно или загружаете его с<script src
тегом , отдельным от файлов, которые вы включаете3. @amarghodke Нет, вы должны добавить это внутри встроенного тега скрипта непосредственно перед закрывающим тегом </body>
4. После случайного обновления я получаю ошибку, так как неперехваченный ReferenceError: $ не определен в index.js указание на document.ready и еще одна ошибка как Uncaught TypeError: для JavaScript Bootstrap требуется jQuery. jQuery должен быть включен перед Bootstrap JavaScript. в качестве альтернативы возникает ошибка и не работает.
5. @amarghodke Вероятно, это потому, что некоторые скрипты завершаются раньше, чем jQuery. Чтобы решить эту проблему, вы можете использовать
load
обратный вызов. Смотрите новый фрагмент