Каков наилучший способ загрузки Javascript на страницу для оптимизации производительности?


Есть ли способ загрузить мой JavaScript на страницу, который ускорит ее загрузку?

Author: Jason, 2010-07-08

5 answers

Есть несколько вещей, которые вы можете сделать:

  1. Загрузите HTML и CSS перед javascript. Это дает браузеру все необходимое для размещения страницы и ее визуализации. Это создает у пользователя впечатление, что страница является быстрой. Размещайте теги или блоки сценариев как можно ближе к закрывающему тегу тела.

  2. Подумайте об использовании CDN. Если вы используете любую из популярных библиотек, таких как jQuery, многие компании (например, google, yahoo) используют бесплатные CDN, которые вы можете использовать для загрузки библиотек.

  3. Загрузите код из внешнего файла вместо встроенного скрипта. Это дает браузеру возможность кэшировать содержимое JS и вообще не загружать его. Последующие загрузки страниц будут выполняться быстрее.

  4. Включите сжатие zip-файлов на веб-сервере.

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

 14
Author: Gareth Farrington, 2010-07-10 17:42:24

Помимо минифинга, 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/

 7
Author: The Disintegrator, 2010-07-10 10:46:57

Возможно, вам также захочется посмотреть, как Google загружает аналитику:

<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/

 7
Author: Jeff Atwood, 2010-07-10 13:25:35

Пара людей из Google объявили о новом проекте с открытым исходным кодом на Velocity 2010 под названием Diffable. Diffable выполняет некоторую магию, чтобы постепенно публиковать только те части JS, HTML и CSS, которые изменились с версии, хранящейся в кэше пользователя, а не отправлять весь новый файл при выпуске новой версии.

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

КСТАТИ, если вы не видели, как Майкл Джонс из Google говорил об изменениях (в геопространственном контексте), стоит посмотреть весь его доклад на GeoWeb 2009.

 3
Author: JasonBirch, 2010-07-10 09:30:40

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

Я добавил вопрос в StackOverflow, я добавлю контент здесь, как только.

Единственное отличие состоит в том, что событие загрузки будет запущено немного раньше, но загрузка самих файлов останется прежней. Я также хочу добавить, что даже если загрузка даже запускается раньше с помощью неблокирующего скрипта, это делает это не означает, что файлы 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 теста, вот результаты:

Обычная настройка

Page load with css in the head and javascript at the bottom

Это просто обычная настройка, у нас есть 4 css-файла в голове и 3 css-файла внизу страницы.

Теперь я не вижу ничего блокирующего. Что Я вижу, что все загружается одновременно.

Неблокирующий JS

Page load with non-blocking javascript

Теперь, чтобы сделать это немного дальше, я сделал неблокирующими ТОЛЬКО файлы js. Это со сценарием выше. Я вдруг вижу, что мои css-файлы блокируют загрузку. Это странно, потому что в первом примере он ничего не блокирует. Почему css внезапно блокирует загрузку ?

Все неблокирующее

Page load with everything non-blocking

Наконец-то я провел тест, в котором все внешние файлы загружаются неблокирующим способом. Теперь я не вижу никакой разницы с нашим первым методом. Они просто оба выглядят одинаково.

Заключение

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

Или я что-то здесь упускаю?

Подробнее:

 1
Author: Saif Bechan, 2017-05-23 12:37:07