Який найкращий спосіб завантажити Javascript на сторінку для оптимізації продуктивності?


Відповіді:


14

Можна зробити кілька речей:

  1. Завантажте HTML та CSS перед JavaScript. Це дає веб-переглядачу все необхідне для розкладки сторінки та її надання. Це створює користувачеві враження, що сторінка спритна. Розміщуйте теги або блоки сценарію якомога ближче до тега закриваючого тіла.

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

  3. Завантажте код із зовнішнього файлу замість вбудованого сценарію. Це дає браузеру можливість кешувати вміст JS і зовсім не завантажувати його. Послідовні завантаження сторінки будуть швидшими.

  4. Увімкніть стиснення zip на веб-сервері.

Yahoo має чудову сторінку пропозицій, яка може допомогти скоротити час завантаження сторінки.


1
Yahoo також розповсюджує плагін YSlow для Firefox, який аналізує вашу сторінку відповідно до кращих практик, зазначених вище, і дає вам картку звіту. Дивіться developer.yahoo.com/yslow
Алан

1
Існують також такі методи, як асинхронне завантаження, які можна використовувати, якщо у вас є елементи сайту, які не вимагають завантаження сценарію, коли сторінка спочатку відображається. І це, і розміщення сценарію внизу сторінки мають обмеження; в деяких випадках потрібно завантажити JS в головку документа.
JasonBirch

7

Крім Minifing, gziping та CDNing (нове слово?). Ви повинні розглянути можливість відкладати завантаження. В основному, це - динамічне додавання скриптів і запобігання їх блокування, що дозволяє паралельне завантаження.

Є багато способів зробити це, я вважаю за краще цей

<script type="text/javascript">
    function AttachScript(src) {
        window._sf_endpt=(new Date()).getTime();
        var script = document.createElement("script");
        document.getElementsByTagName("body")[0].appendChild(script);
        script.src = src;
    }
    AttachScript("/js/scripts.js");
    AttachScript("http://www.google-analytics.com/ga.js");
</script>

Розташуйте це безпосередньо перед закриттям тегу тіла та використовуйте AttachScript для завантаження кожного js-файлу.
Більше інформації тут http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/


1
Гей, ти вкрав CDNing; це має означати робити щось канадське! ;)
JasonBirch

jajajaja good one
The Disintegrator

7

Ви можете подивитися, як Google завантажує Analytics:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

Оскільки це вважається сценарієм "найкращої практики":
http://www.stevesouders.com/blog/2009/12/01/google-analytics-goes-async/


3

Кілька людей із Google оголосили про новий проект з відкритим кодом на швидкості 2010 під назвою Diffable . Diffable виконує деяку магію, щоб поступово публікувати лише ті частини JS, HTML та CSS, які змінилися після версії, яка зберігається в кеші користувача, а не надсилати весь новий файл, коли виходить нова версія.

Ця методика є шалено класною і наразі є найбільш ефективною (і варто докладати зусиль) на веб-сайтах, де ви використовуєте велику базу коду JavaScript з невеликими частими змінами коду. Це особливо добре стосується таких додатків, як Google Maps, які виходять щонайменше одного випуску і в середньому становлять близько 100 нових випусків на рік. Це також має багато сенсу, коли локальне зберігання HTML5 стає більш поширеним.

До речі, якщо ви не бачили, як Майкл Джонс говорив про зміни від Google (в геопросторовому контексті), варто переглянути всю його основну примітку на GeoWeb 2009 .


1

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

Я додав запитання до StackOverflow, я додам зміст сюди aswel.

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

Тепер спочатку сценарії, вони виглядають так:

<script>
(function () {
    var styles = JSON.parse(myObject.styles);
    for( name in styles ){
        var link  = document.createElement('link');
        link.setAttribute('rel', 'stylesheet');
        link.setAttribute('type', 'text/css');
        link.setAttribute('href', styles[name]);
        document.getElementsByTagName('head')[0].appendChild(link);
    }

    var scripts = JSON.parse(myObject.scripts);
    for( name in scripts ){
        var e = document.createElement('script');
        e.src = scripts[name];
        e.async = true;
        document.getElementsByTagName('head')[0].appendChild(e);
    }
}());
</script>

myObject.styles тут просто об’єкт, який містить всі URL-адреси для всіх файлів.

Я провів 3 тесту, ось результати:

Нормальна настройка

Завантаження сторінки з CSS в голові та javascript внизу

Це просто звичайне налаштування, у нас є 4 файли css в голові та 3 файли css внизу сторінки.

Зараз я не бачу нічого блокуючого. Я бачу, що все одночасно завантажується.

Неблокуючий JS

Завантаження сторінки за допомогою блокування JavaScript

Тепер, щоб зробити це трохи далі, я зробив ТОЛЬКІ файли js не блокуючи. Це зі сценарієм вище. Я раптом бачу, що мої файли css блокують навантаження. Це дивно, адже це не блокує нічого в першому прикладі. Чому css раптово блокує навантаження?

Все, що не блокує

Завантаження сторінки все, що не блокує

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

Висновок

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

Або я щось тут пропускаю?

Більше:


Різниця полягає в розташуванні синьої лінії, яка, як я здогадуюсь, полягає в тому, коли сторінка починає відображатися. З точки зору кінцевого користувача, це коли "завантажується" сторінка, як це відбувається, коли вони починають бачити речі. У першому прикладі візуалізація починається після завантаження останнього файлу JS, на позначці 900 мс. По-друге, це після завантаження таблиць стилів (~ 700 мс). По-третє, це після завантаження HTML (~ 500 мс). Я б все-таки пішов з другим підходом, оскільки ви не дуже хочете завантаження CSS після візуалізації сторінки.
Фонтан Тіма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.