Чи повинен код Jquery переходити в колонтитул або колонтитул?


Відповіді:


189

Усі сценарії повинні бути завантажені останніми

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

Якщо ви не можете зробити це через проблеми із шаблонами та що-небудь ще, прикрасьте свої теги сценарію deferатрибутом, щоб браузер знав завантажувати ваші сценарії після завантаження HTML:

<script src="my.js" type="text/javascript" defer="defer"></script>

Корпусні кромки

Є деякі крайні випадки, однак, де ви можете випробувати сторінку мерехтіння або інші артефакти під час завантаження сторінки , які , як правило , можуть бути вирішені шляхом простого розміщення ваших посилань скрипта JQuery в <head>тезі без в deferатрибуті. Ці випадки включають інтерфейс jQuery та інші доповнення, такі як jCarousel або Treeview, які змінюють DOM як частину своєї функціональності.


Подальші застереження

Є деякі бібліотеки, які потрібно завантажити перед DOM або CSS, наприклад поліфіли. Modernizr - це така бібліотека, яку потрібно помістити в тег заголовка .


5
Ну, врахуйте це: topicforest.net/item/portfolious-professional-business-template/… . Я нещодавно придбав тему сайту, яка на своїй домашній сторінці містить використання jQuery з jCarousel. Коли я перемістив блоки сценаріїв із заголовка до кінця файлу, я помітив, що зображення, використані у каруселі, будуть відображатися одразу під час завантаження сторінки, тоді як, коли файли сценаріїв у голові, сторінка завантажуватиметься більш плавно.
Чад Леві

5
Використовуйте CSS для встановлення початкового стану вмісту. CSS повинен йти в голову. Порушити щось, щоб змусити щось інше працювати - це не рішення. Якщо відвідувачеві доводиться чекати завантаження jQuery та всіх пов'язаних плагінів до того, як будь-який вміст буде надано, він може не затримуватися досить довго, щоб побачити вміст.
Дункан

9
ChadLevy правий: є деякі умови, за яких плагіни jQuery працюють краще, якщо на них посилаються в <head>. Якщо ваша розмітка залежить від плагіна jQuery, який сортує вміст для вас, немає сенсу розміщувати посилання на плагін у нижній частині сторінки, оскільки ви збираєтеся отримувати прикольну розмітку на своїй веб-сторінці до завантаження плагінів. Правила мають бути дотримані до тих пір, поки вони більше не працюватимуть, і тоді слід порушувати правила.
Роберт Харві

2
@Duncan: В ідеалі це був би випадок, коли ви можете контролювати всі залежності. Справа в jQuery (точніше такі речі, як jQuery UI та інші аддони) полягає в тому, що за допомогою дизайну ви не можете мати повний контроль над їх функціональністю, тому додаючи щось подібне до атрибутів видимості до елемента DOM, щоб воно більш граціозно завантажувалося, можливо, неможливо. аддон, який використовує цей елемент, не враховує зазначений атрибут. Іноді краще відмовитися від простої конвенції, ніж намагатися домогтися залежності, щоб працювати так, як хочеш.
Чад Леві

2
@Stefan: Якщо вашим плагінам jQuery заборонено маніпулювати DOM, то в чому сенс?
Роберт Харві

229

Покладіть сценарії знизу

Проблема, викликана сценаріями, полягає в тому, що вони блокують паралельні завантаження. Специфікація HTTP / 1.1 передбачає, що браузери завантажують не більше двох компонентів паралельно на ім’я хоста. Якщо ви подаєте свої зображення з кількох імен хостів, ви можете отримати більше двох завантажень паралельно. Поки сценарій завантажується, однак браузер не запускатиме жодних інших завантажень, навіть на різних іменах хостів. У деяких ситуаціях перемістити сценарії до низу непросто. Наприклад, якщо скрипт використовує document.write для вставки частини вмісту сторінки, її не можна перемістити нижче. Можуть також виникнути проблеми з визначенням масштабів. У багатьох випадках існують способи вирішити ці ситуації.

Альтернативна пропозиція, яка часто з'являється, - використовувати відкладені сценарії. Атрибут DEFER вказує, що скрипт не містить document.write, і є підказкою для браузерів про те, що вони можуть продовжувати візуалізацію. На жаль, Firefox не підтримує атрибут DEFER. В Internet Explorer сценарій може бути відкладений, але не настільки, наскільки бажано. Якщо сценарій можна відкласти, його також можна перемістити внизу сторінки. Це зробить швидше завантаження веб-сторінок.

EDIT: Firefox підтримує атрибут DEFER з версії 3.6.

Джерела:


4
Я бачив кілька сучасних порад, згідно з якими сценарії повинні бути розміщені вгорі. Розміщення сценаріїв у нижній частині дозволяє паралельно завантажувати зображення та інший вміст у тілі сторінки, але фактично спричиняє завантаження скриптів на сторінці пізніше - все тіло HTML потрібно завантажити, перш ніж браузер дізнається про URL-адреси сценарію для завантаження. Більшість людей посилаються на посібник Yahoo, який вже не є точним - Firefox дійсно шанує відкладені атрибути на скриптах. Відмітка вгорі призведе до швидшого завантаження сторінки, якщо ви вимірюєте її.
ShadowChaser

Чи можу я побачити деякі статистичні дані щодо швидкості завантаження сторінки за допомогою цього методу?
Габріель Алак

1
Firefox підтримує версію DEFER з версії 3.6. Джерело: w3schools.com/tags/att_script_defer.asp
Микита 웃

1
Оновлення: станом на початок / середина 2016 року всі сучасні браузери збільшили кількість підключень на ім’я хоста до мінімум 6.
Night Owl

32

Завантажуйте лише jQuery в голову, звичайно, через CDN.

Чому? У деяких сценаріях ви можете включити частковий шаблон (наприклад, фрагмент форми для входу в ajax) із вбудованим кодом jQuery; якщо jQuery завантажується внизу сторінки, ви отримуєте помилку "$ не визначено", добре.

Існують способи вирішити це, звичайно, (наприклад, не вставляти будь-який JS та додавати його до пакета js-внизу), але навіщо втрачати свободу ліниво завантажених js, щоб мати можливість розміщувати залежний від jQuery куди завгодно ? Двигун Javascript не хвилює, де код живе в DOM до тих пір, поки залежать залежності (наприклад, завантаження jQuery).

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

Немає результатів із завантаженням jquery в голову; який браузер на планеті ще не має файлу CDQ jQuery CDN в кеші?

Дуже багато чого ні про що, вставте jQuery в голову і нехай панує ваша js свобода.


1
багато, багато браузерів не роблять; приблизно 2% - це найвищий показник, який я читав, коли ви враховуєте версію, а кешування фактів базується на точних назвах ресурсів, тому jquery1.4.2 не те саме, що jquery1.7, або 1.9.1 або .. .
Тоні Лі

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

13

Nimbuz дає дуже хороше пояснення проблеми, але я думаю, що остаточна відповідь залежить від вашої сторінки: що важливіше для користувача швидше - сценарії чи зображення?

Є деякі сторінки, які не мають сенсу без зображень, але мають лише незначні, неістотні сценарії. У цьому випадку є сенс розмістити сценарії внизу, щоб користувач швидше побачив зображення і почав мати сенс сторінки. Інші сторінки покладаються на написання сценаріїв для роботи. У такому випадку краще мати робочу сторінку без зображень, ніж непрацюючу сторінку із зображеннями, тому має сенс розміщувати сценарії вгорі.

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

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


Ти мав мене, поки не витягнув аргумент передчасної оптимізації. Це лише ще одне правило, якого люди догматично дотримуються, не розуміючи повністю його наслідків.
Роберт Харві

6
Ну добре, не можу виграти їх усіх! Я вважаю, що розумію її наслідки. :)
EMP

Я не впевнений, що вам потрібно переживати, чи завантажувались ваші сценарії. Блокування візуалізації, поки не завантажиться сценарій, саме про це йдеться в основному в цій дискусії. Тож поки ви нічого не зателефонуєте перед тим, як завантажити його, ви добре. Крім того, саме для цього є зворотні дзвінки, і ви насправді не повинні вбудовувати багато іншого на свою сторінку. Як я розумію, зображення не блокуються (вони завантажуються паралельно), і насправді DOM може бути готовий, а ваші сценарії працювати до повного завантаження зображень. Немає сенсу ставити сценарії на перше місце, щоб уникнути їх блокування.
Дункан

4
Зважаючи на те, що загальний консенсус полягає в тому, щоб розставляти сценарії внизу, чи не було б краще це зробити за замовчуванням, а лише перемістити їх до верху, якщо виникнуть проблеми? Дуже дивно робити речі назад. Іноді краще зробити оптимальну справу, якщо немає різниці в витрачених зусиллях :)
Duncan

@Duncan, Так, це був мій підхід. Я ставлю плагіни внизу, і коли у мене виникли проблеми, я ставлю їх вгорі, і це вирішило проблеми.
Роберт Харві

6

Більшість кодів jquery виконується на готовому документі, який все одно не відбувається до кінця сторінки. Крім того, візуалізація сторінок може бути відкладена шляхом розбору / виконання javascript, тому найкраща практика розмістити весь JavaScript у нижній частині сторінки.


5

Стандартна практика полягає в тому, щоб розмістити всі ваші сценарії внизу сторінки, але я використовую ASP.NET MVC з низкою плагінів jQuery, і я вважаю, що все працює краще, якщо я поміщаю свої сценарії jQuery у <head> розділі головного сторінки.

У моєму випадку є артефакти, які виникають під час завантаження сторінки, якщо сценарії знаходяться внизу сторінки. Я використовую плагін jQuery TreeView, і якщо сценарії не завантажуються на початку, дерево буде виводитись без необхідних класів CSS, накладених на нього плагіном. Таким чином ви отримуєте цей смішний безлад, коли сторінка спочатку завантажується з подальшим правильним відображенням TreeView. Дуже погано виглядає. Якщо розмістити плагіни jQuery у <head>розділі головної сторінки, це усуне цю проблему.


Інтранети не підпадають під ті ж умови, що і в Інтернеті, тому затримка завантаження, ймовірно, менш помітна. Однак доцільно дотримуватися правил.
Дункан

ні, розміщення ідентифікаторів / стилів CSS у розмітці (замість того, щоб чекати, коли jQuery зробить це на DOM готовий) вирішує проблему.
Дан Промінь

1
@Dan Beam: Treeview заповнюється з таблиці бази даних, а стилі Treeview встановлюються плагіном Treeview на основі вмісту таблиці, тому ні, це не працюватиме.
Роберт Харві

1
Навіщо мені це робити, коли я просто можу змінити скрипт плагіну Treeview у верхній частині сторінки, і він буде працювати чудово? Це не має сенсу, Ден.
Роберт Харві

1
Здрастуйте, Роберт, я також використовую ASP.NETMVC з формами в партії. Має сенс тримати javascript у межах часткового, оскільки новим полям переназначається їх функціональність щоразу, коли частка виконується (скажімо для перевірки). Я зіткнувся з проблемами лише при спробі використання @Html.Action, яка динамічно записує результат у вихідний результат, оскільки мій частковий дає $ is undefinedсенс, що я замість цього повинен використовувати .load ('@ Url.Action') для завантаження часткового. Але це дає фок через додатковий запит. Виходячи з ваших даних, я просто переміщу jquery над RenderBody () на своїй головній сторінці
Малкін

4

Хоча майже всі веб-сайти все ще розміщують Jquery та інші javascript на заголовку: D, навіть перевірте stackoverflow.com.

Я також пропоную вам надіти до кінця тег корпусу. Ви можете перевірити час завантаження після розміщення в будь-якому місці. Тег сценарію призупинить вашу веб-сторінку для подальшого завантаження.

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


2
Але, ви можете досягти того ж, використовуючи відстрочку на сценарії. w3schools.com/tags/att_script_defer.asp
Jack Tuck

2

Безпосередньо перед тим </body>краще місце в відповідно до Yahoo Developer Network «s Best Practices для прискорення вашого веб - сайту посилання , це має сенс.

Найкраще зробити тест на собі.


0

Для мене jQuery трохи особливий. Можливо, виняток із норми. Існує так багато інших сценаріїв, які покладаються на нього, тому досить важливо, що він завантажується рано, щоб інші сценарії, які з’являються пізніше, працюватимуть за призначенням. Як зауважив хтось, навіть ця сторінка завантажує jQuery у розділ голови.

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