Ненав’язливий JavaScript: <script> у верхній або нижній частині HTML-коду?


90

Нещодавно я читав маніфест Yahoo Best Practices для прискорення роботи вашого веб-сайту . Вони рекомендують розміщувати включення JavaScript у нижній частині HTML-коду, коли це можливо.

Але де саме і коли?

Чи слід ставити його до закриття </html>чи після? І перш за все, коли ми все-таки повинні помістити це в <head>розділ?


Відповіді:


87

Є дві можливості для справді ненав’язливих сценаріїв:

  • включаючи зовнішній файл сценарію через тег сценарію в розділі head
  • включення зовнішнього файлу сценарію через тег сценарію внизу тіла (до </body></html>)

Другий може бути швидшим, оскільки оригінальне дослідження Yahoo показало, що деякі браузери намагаються завантажувати файли скриптів, коли вони натискають тег скрипта, і тому не завантажують решту сторінки, поки не закінчать. Однак, якщо у вашому скрипті є частина "готовий", яку потрібно виконати, як тільки DOM буде готовий, можливо, вам доведеться мати її в голові. Іншим питанням є макет - якщо ваш сценарій збирається змінити макет сторінки, який ви хочете завантажити якомога раніше, щоб ваша сторінка не витрачала багато часу на перемальовування перед вашими користувачами.

Якщо зовнішній сайт сценарію знаходиться в іншому домені (наприклад, зовнішні віджети), можливо, варто поставити його внизу, щоб уникнути затримки завантаження сторінки.

А щодо будь-яких проблем із продуктивністю виконуйте власні тести - те, що може бути правдою одночасно, коли проводиться дослідження, може змінитися залежно від ваших локальних налаштувань або змін у браузерах.


13
Щодо сценарію, який має "готову" частину. Поміщення цього сценарію в нижній частині корпусу гарантує, що DOM готовий до маніпуляцій; якщо ви покладете його в голову, вам доведеться обернути його так, щоб він чекав події DOMReady (або подібної)
Хуан Мендес,

4
@Juan Так - це так, але, розмістивши скрипт внизу, ви затримуєте подію DOMReady на час, необхідний браузеру для синтаксичного аналізу документа та обробки елементів head (200-500 мс), перш ніж він запитує цей сценарій . В основному при завантаженні першої сторінки (за умови, що її можна кешувати звідти). Тоді як якщо покласти це в голову. Ймовірно, це буде набагато швидше. Отож, маючи на увазі HTML5, якщо сценарій повинен змінити макет, коли DOM буде готовий, то тепер вам буде краще із сценарієм "async" або "defer" у голові.
hexalys

31

Це ніколи не буває настільки вирізаним і сухим - Yahoo рекомендує розміщувати сценарії безпосередньо перед закриваючим </body>тегом, що створить ілюзію швидшого завантаження сторінки на порожній кеш (оскільки сценарії не блокують завантаження решти документа). Однак якщо у вас є якийсь код, який ви хочете запустити під час завантаження сторінки, він почне виконуватися лише після завантаження всієї сторінки. Якщо ви помістите сценарії в<head> тег, вони почнуть виконуватися раніше - так що в грунтованому кеші сторінка фактично швидше завантажується.

Крім того, привілей розміщувати скрипти внизу сторінки не завжди доступний. Якщо вам потрібно включити в свої перегляди вбудовані сценарії, які залежать від бібліотеки або якогось іншого коду JavaScript, який завантажувався раніше, ви повинні завантажити ці залежності в<head> тег.

Загалом, рекомендації Yahoo цікаві, але не завжди застосовні, і їх слід розглядати в кожному конкретному випадку.


1
Якщо у вас є ненав’язливий javscript, у вас не буде вбудованих фрагментів, у питанні конкретно згадується ненав’язливий.
Хуан Мендес,

1
вбудовані <script>теги не означають нав'язливого javascript.
Еран Гальперін

@ Ерік Гальперін: Яке хороше використання вбудованих тегів скриптів, які не є нав'язливими?
Хуан Мендес,

4
Обструктивний Javascript @Juan означає, що користувальницький інтерфейс зламаний без нього або що він вбудований у розмітку. <script>теги окремі від розмітки і можуть використовуватися з кодом, що покращує інтерфейс, але не є обов’язковим. Тож у вбудованих <script>тегах немає нічого настирливого .
Еран Гальперін,

4
1. Мене звати Еран, а не Ерік, 2. Коли ви хочете передати дані в Javascript з мови сервера, у циклі, якщо елементи, наприклад, ви можете використовувати <script>теги для кодування цих значень у змінні javascript, для використання, можливо, з вбудоване редагування або інша подібна поведінка.
Еран Гальперін

22

Як вже говорили інші, розмістіть його перед закриваючими тегами html тіла .

Днями у нас були численні дзвінки від клієнтів, які скаржились на те, що їх сайти були надзвичайно повільними. Ми відвідали їх місцево і виявили, що їм потрібно 20-30 секунд, щоб завантажити одну сторінку. Думаючи, що це погано працюють сервери, ми увійшли в систему, але як веб-сервери, так і SQL-сервери мали ~ 0% активності.

Через кілька хвилин ми зрозуміли, що зовнішній сайт не працює, на який ми посилаємося для тегів відстеження Javascript. Це означало, що браузери вбивали тег скрипта в голову розділі сайту і чекали завантаження файлу сценарію.

Отже, принаймні для сторонніх / зовнішніх сценаріїв я б рекомендував розміщувати їх як останнє на сторінці. Тоді, якби вони були недоступні, браузер принаймні завантажував би сторінку до цього моменту - і користувач не пам’ятав би про це.


10
Класна історія, брате :) Але серйозно, це найпереконливіший аргумент, який я бачив щодо розміщення тегів скриптів внизу сторінки.
user271608

16

Підсумовуючи, виходячи з наведених вище пропозицій:

  1. Для зовнішніх сценаріїв (аналітика Google, сторонні маркетингові трекери тощо) розмістіть їх перед </body>тегом.
  2. Для сценаріїв, що впливають на макет сторінки, розмістіть їх у голові.
  3. Для сценаріїв, які покладаються на "dom ready" (наприклад, jquery), розгляньте можливість розміщення раніше, </body>якщо у вас немає крайньої причини розміщувати сценарії в голові.
  4. Якщо є вбудовані сценарії із залежностями, розмістіть потрібні сценарії в голові.

6

Якщо ви хочете поговорити з позицією своїх сценаріїв, YSlow - це чудовий інструмент для надання вам смаку, якщо це покращить або погіршить продуктивність. Поміщення javascript у певні позиції документа може дійсно знищити час завантаження сторінки.

http://developer.yahoo.com/yslow/


5

Ні, це не повинно бути після того, </html>як це було б недійсним. Найкраще місце для розміщення сценаріїв - безпосередньо перед</body>

Це пояснюється тим, що більшість браузерів припиняють рендерінг сторінки, поки вони обробляють сценарій, який ви надаєте. Тож нормально розміщувати неблокуючий код де завгодно на сторінці (я в основному думаю про речі, які приєднують функції до onLoadподії, оскільки прив’язка подій відбувається настільки швидко, що ефективно може бути безкоштовною). Великий вбивця - це на початку сторінки введення сценарію сервера оголошень, який може запобігти завантаженню будь-якої сторінки до повного завантаження оголошень, що збільшує час завантаження сторінки


Знаєте, якщо ви дійсно стурбовані швидкістю, тоді не буде </body> чи </html> - закриваючі теги для цих типів елементів є необов’язковими. Покладіть <script> в самий кінець і забудьте про використання </body> та </html> взагалі.
Джим,

9
Сподіваємось, Джим є саркастичним - у всякому разі, не приймайте його поради. Добре сформований XHTML вимагає закриття тегів для кожного елемента, включаючи теги body і html. Якщо ваш код не є дійсним XML, ви робите це неправильно.
matt lohkamp

6
Ні, я не є саркастичним. Погляньте на питання. Він визначає HTML, а не XHTML. Це правда, що дійсний XHTML вимагає цих речей, але дійсний HTML - ні. Немає абсолютно нічого поганого у виборі HTML і пропуску закриваючих тегів для цих типів елементів.
Джим

2

Якщо покласти його внизу, він завантажується в останню чергу, отже, прискорюючи швидкість, яку користувач може побачити сторінку. Це має бути до фіналу, </html>хоча інакше він не буде частиною DOM.

Якщо код потрібен миттєво, тоді покладіть його в голову.

Найкраще розміщувати такі речі, як віджети блогу, внизу, щоб, якщо вони не завантажуються, це не впливало на зручність використання сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.