SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
Non-Blocking JavaScript
Dmitriy Yakubovskiy
Параллельные загрузки
Потоки по браузерам *
Firefox 3+
6 потоков
Chrome
6 потоков
Safari 3-4
4 потока
Safari 5
6 потоков
Opera 12
6 потоков
IE 6-7
2 потока
IE 8-9
6 потоков
IE 10
8 потоков
* - число параллельных соединений к одному хосту
Процесс отрисовки
Исходный HTML DOM дерево Дерево отрисовки
DOMContentLoaded
- событие срабатывает при загрузке документа, кроме IE<9
- ждет css, если после него идет скрипт
- ждёт загрузки и выполнения скриптов (кроме скриптов с
async/defer, если есть поддержка и динамических)
- в FF/Chrome формы автозаполняются по
DOMContentLoaded
- интерфейсы обычно инициализируются по
DOMContentLoaded
DOMContentLoaded (Firefox)
Скрипты на странице*
Во время загрузки
Во время выполнения
- блокируется отрисовка страницы
- блокируют вообще все загрузки (IE<8, Opera<15)
- блокируют все загрузки, кроме стилей и скриптов
(IE8, FF, Chrome, Safari)
- остальные загрузки не блокируются (IE>8)
- ждет пока загрузятся предшествующие css файлы
- блокируют вообще всё
* - распространяется на скрипты со всех хостов
Скрипты в HEAD
IE6-7
Скрипты в HEAD
IE8
Скрипты в HEAD
IE9
Скрипты в HEAD
Сhrome / Safari / FF
Скрипты в конце BODY
Chrome
- не блокируется рендеринг страницы
- не блокируются загрузки предыдущих ресурсов
- страница доступна до инициализации скриптов
Заглушки интерфейсов
<link rel="stylesheet" type="text/css" href="styles.css" />
<!--[if lte IE 8]>
<link rel="stylesheet" type="text/css" href="ie.css">
<![endif]-->
Conditional Comments (IE)
Conditional Comments (IE)
<!--[if IE]><![endif]-->
<link rel="stylesheet" type="text/css" href="styles.css" />
<!--[if lte IE 8]>
<link rel="stylesheet" type="text/css" href="ie.css">
<![endif]-->
Не блокирующие скрипты
- document.write
- script in iframe
- script defer
- script async
- XMLHttpRequest Eval
- XMLHttpRequest Injection
- Script DOM
document.write
IE6
document.write('<scr'+'ipt src="jquery.js"></scr'+'ipt>');
document.write('<scr'+'ipt src="scripts.js"></scr'+'ipt>');
- не блокирует другие скрипты
- сохраняет порядок выполнения
- блокирует рендеринг, загрузку css/img
- актуально только для IE<8, Opera<15
script in iframe
- не блокирует рендеринг / загрузки
- необходимо вносить изменения в скрипты
- ограничение по домену
<iframe src='script.html' id="f1"></iframe>
<iframe src='script2.html' id="f2"></iframe>
script defer
- по стандарту только для внешних скриптов
- не блокирует рендеринг / загрузки
- выполнение после рендеринга страницы
- сохраняется порядок выполнения (кроме IE<10)
- IE4+, FF3.1+, Chrome 8+, Safari 5.1+, Opera 15+
<script src="jquery.js" defer></script>
<script src="scripts.js" defer></script>
script async
- по стандарту только для внешних скриптов
- не блокирует рендеринг / загрузки
- выполнение сразу после загрузки
- не сохраняется порядок выполнения
- IE10+, FF3.6+, Chrome 8+, Safari 5.1+, Opera 15+
<script src="script1.js" async></script>
<script src="script2.js" async></script>
XMLHttpRequest Eval
var xhr = getXmlHttp();
xhr.open("GET", "script.js", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
eval.call(window, xhr.responseText);
}
}
xhr.send(null);
- не блокирует рендеринг / загрузки
- не сохраняется порядок выполнения
- ограничение по домену
- нет индикации загрузки
XMLHttpRequest Injection
- не блокирует рендеринг / загрузки
- не сохраняется порядок выполнения
- ограничение по домену
- нет индикации загрузки
var xhr = getXmlHttp();
xhr.open("GET", "script.js", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var s=document.createElement('script');
document.getElementsByTagName('head')[0]
.appendChild(s);
s.text = xhr.responseText;
}
} xhr.send(null);
Script DOM
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = 'app.js';
document.getElementsByTagName('head')[0]
.appendChild(script);
- не блокирует рендеринг / загрузки
- не сохраняется порядок выполнения, кроме Opera<15
- async:true для Firefox 3.6, чтобы не сохранять порядок
- нет ограничений на домен
Script DOM + async:false
- не блокирует рендеринг / загрузки
- сохраняется порядок выполнения (кроме браузеров,
которые не поддерживают async, но не FF<3.6 и Opera)
- нет ограничений на домен
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = false;
script.src = 'app.js';
document.getElementsByTagName('head')[0]
.appendChild(script);
Script DOM + onreadystatechange
- не блокирует рендеринг / загрузки
- позволяет гибко управлять загрузкой / выполнением
- нет ограничений на домен
- только IE6+
var js = document.createElement('script');
js.onreadystatechange = function() {
if (js.readyState == 'loaded') {
document.body.appendChild(js); // execution
}
};
js.src = 'app.js';
Порядок загрузки не важен
Цель:
- Загрузить скрипты параллельно
- Выполнить сразу после загрузки
- Не блокировать рендеринг
- Не блокировать загрузку других ресурсов
- Кроссбраузерное решение
Решение: Script DOM
Порядок загрузки важен
Цель:
- Загрузить скрипты параллельно
- Выполнить последовательно
- Не блокировать рендеринг
- Не блокировать загрузку других ресурсов
- Кроссбраузерное решение
Решение: Script DOM + async:false / onreadystatechange
для IE / document.write для остальных браузеров
Техники связывания
- window onload
- timer
- script onload
- callback (m)
- degrading script tags (m)
m - требует модификации скриптов
Техники связывания
<script type="text/javascript">
function init() {
...
App.start();
...
}
init();
</script>
<script type="text/javascript" src="app.js"></script>
window onload
if ( window.addEventListener ) {
window.addEventListener("load", init, false);
}
else if ( window.attachEvent ) {
window.attachEvent("onload", init);
}
- просто в реализации
- инициализация срабатывает слишком поздно
timer
function timer(interval) {
if ( typeof(jQuery) === "undefined" ) {
setTimeout(timer, interval);
}
else {
init();
}
}
timer(300);
- просто в реализации
- лишние расходы ресурсов на выполнение скрипта
- задержка при слишком большом интервале
script onload
js.onload = function() {
if ( !js.done ) {
js.done = true; init();
}
};
js.onreadystatechange = function() {
if ( !js.done &&
js.readyState.match(/loaded|complete/) ) {
js.done = true; init();
}
};
- выполнение инлайн скрипта максимально быстро
- немного сложнее в реализации
callback (m)
- выполнение инлайн скрипта максимально быстро
- вызов init() в конце app.js
- не гибкое решение
- требует модификации скриптов
function init() { ... }
var js = document.createElement('script');
js.src = "app.js"; document.getElementsByTagName('head')
[0].appendChild(js);
degrading script tags (m)
function init() { ... }
var js = document.createElement('script');
js.src = "app.js";
js.text = "init();"; document.getElementsByTagName('head')
[0].appendChild(js);
- гибкое решение
- требует модификации скриптов
inline script
<script type="text/javascript" src="app.js">
init();
</script>
degrading script tags (m)
var fs = document.getElementsByTagName("script");
var len = fs.length;
while ( len ) {
var s = fs[len-1];
if ( s.src.indexOf('app.js') != -1 ) {
eval( s.innerHTML );
break;
}
len--;
}
app.js
Загрузчики
- $script.js
- YepNope.js
- Control.js
- LAB.js
- Head.js
- Load.js
- Require.js
Как будем загружать
сам загрузчик?
Загрузка виджетов
● Добавление через DOM
● Связывание через
onload/onreadystatechange
● document.write()
○ Делаем свой document.write()
○ Выносим виджет в отдельный
невидимый элемент
○ Загружаем в скрытый iframe,
по onload копируем на страницу
Загрузка виджетов
(function(d, s) {
var js, fjs = d.getElementsByTagName(s)[0],
load = function(url, id) {
if (d.getElementById(id)) {return;}
js = d.createElement(s);
js.src = url;
js.id = id;
fjs.parentNode.insertBefore(js, fjs);
};
load('widget1.js', 'fbjssdk');
load('widget2.js', 'gplus1js');
load('widget3.js', 'tweetjs');
}(document, 'script'));
Преимущества подхода
Страница не виснет из-за сторонних виджетов
Управление виджетами из одного места
Гарантия подключения узла всего один раз (ID)
Постзагрузка виджетов
Постзагрузка виджетов
Полезные материалы
Ресурсы
www.browserscope.org
www.stevesouders.com
Книга
Steve Souders - Even Faster Web Sites
Таблица сравнения загрузчиков
https://spreadsheets.google.com/a/sysiq.com/lv?
key=tDdcrv9wNQRCNCRCflWxhYQ
● WebPageTest Online (www.webpagetest.org)
● Webkit Developer Toolbar (Timeline Tab)
● Firebug for FF (YSlow add-on, Net Tab)
● Fiddler (Web Debugging Proxy)
● DynaTrace Ajax Edition
● Sloppy (proxy server)
Инструменты
Вопросы?
Задавайте умные вопросы.
Получайте умные ответы.
Dmitriy Yakubovskiy
d.iakubovskiy@sysiq.com

Weitere ähnliche Inhalte

Was ist angesagt?

«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов2ГИС Технологии
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17MoscowJS
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...JSib
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...Ontico
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьCodeFest
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)7bits
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливееYaroslav Serhieiev
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Vladimir Malyk
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Yandex
 
Webpack integration
Webpack integrationWebpack integration
Webpack integrationIllia Zub
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)Ontico
 
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)Ontico
 
Виталий Ратушный "Vue: webcomponents"
Виталий Ратушный "Vue: webcomponents"Виталий Ратушный "Vue: webcomponents"
Виталий Ратушный "Vue: webcomponents"Fwdays
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQAlexander Svetkin
 
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...Ontico
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр КолесеньIT Share
 

Was ist angesagt? (20)

«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливее
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
Webpack integration
Webpack integrationWebpack integration
Webpack integration
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
 
Виталий Ратушный "Vue: webcomponents"
Виталий Ратушный "Vue: webcomponents"Виталий Ратушный "Vue: webcomponents"
Виталий Ратушный "Vue: webcomponents"
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQ
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
 

Andere mochten auch

Психология восприятия и UX дизайн
Психология восприятия и UX дизайнПсихология восприятия и UX дизайн
Психология восприятия и UX дизайнEcommerce Solution Provider SysIQ
 
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012Ecommerce Solution Provider SysIQ
 
Доступность веб-сайтов: WWW для всех?
Доступность веб-сайтов: WWW для всех?Доступность веб-сайтов: WWW для всех?
Доступность веб-сайтов: WWW для всех?Ecommerce Solution Provider SysIQ
 
Эффективный JavaScript - IQLab Frontend Fusion 2012
Эффективный  JavaScript - IQLab Frontend Fusion 2012Эффективный  JavaScript - IQLab Frontend Fusion 2012
Эффективный JavaScript - IQLab Frontend Fusion 2012Ecommerce Solution Provider SysIQ
 
Правила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработкеПравила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработкеEcommerce Solution Provider SysIQ
 
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSГибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSEcommerce Solution Provider SysIQ
 

Andere mochten auch (20)

User Behavior: Interacting With Important Website Elements
User Behavior: Interacting With Important Website ElementsUser Behavior: Interacting With Important Website Elements
User Behavior: Interacting With Important Website Elements
 
Testing schools overview
Testing schools overviewTesting schools overview
Testing schools overview
 
Психология восприятия и UX дизайн
Психология восприятия и UX дизайнПсихология восприятия и UX дизайн
Психология восприятия и UX дизайн
 
Java serialization
Java serializationJava serialization
Java serialization
 
Developing for e commerce is important
Developing for e commerce is importantDeveloping for e commerce is important
Developing for e commerce is important
 
Speed Up Your Website
Speed Up Your WebsiteSpeed Up Your Website
Speed Up Your Website
 
All things php
All things phpAll things php
All things php
 
User focused design
User focused designUser focused design
User focused design
 
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
 
Доступность веб-сайтов: WWW для всех?
Доступность веб-сайтов: WWW для всех?Доступность веб-сайтов: WWW для всех?
Доступность веб-сайтов: WWW для всех?
 
Эффективный JavaScript - IQLab Frontend Fusion 2012
Эффективный  JavaScript - IQLab Frontend Fusion 2012Эффективный  JavaScript - IQLab Frontend Fusion 2012
Эффективный JavaScript - IQLab Frontend Fusion 2012
 
Правила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработкеПравила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработке
 
Databases on Client Side
Databases on Client SideDatabases on Client Side
Databases on Client Side
 
Seo and Marketing Requirements in Web Architecture
Seo and Marketing Requirements in Web ArchitectureSeo and Marketing Requirements in Web Architecture
Seo and Marketing Requirements in Web Architecture
 
Going global
Going globalGoing global
Going global
 
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSГибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSS
 
QA evolution, in pictures
QA evolution, in picturesQA evolution, in pictures
QA evolution, in pictures
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
Management and Communications (IPAA)
Management and Communications (IPAA)Management and Communications (IPAA)
Management and Communications (IPAA)
 
Lupan big enterprise ecommerce fusion 2013
Lupan   big enterprise ecommerce fusion 2013Lupan   big enterprise ecommerce fusion 2013
Lupan big enterprise ecommerce fusion 2013
 

Ähnlich wie non-blocking java script

Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаAlexei Smolyanov
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Eugene Zharkov
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxYandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''DneprCiklumEvents
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....KazHackStan
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
XSS. Обходы фильтров и защит.
XSS. Обходы фильтров и защит.XSS. Обходы фильтров и защит.
XSS. Обходы фильтров и защит.Дмитрий Бумов
 
Web осень 2012 лекция 10
Web осень 2012 лекция 10Web осень 2012 лекция 10
Web осень 2012 лекция 10Technopark
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеAlexey Androsov
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Ontico
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Работа со статикой в Django
Работа со статикой в DjangoРабота со статикой в Django
Работа со статикой в DjangoMoscowDjango
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеYandex
 

Ähnlich wie non-blocking java script (20)

Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
XSS. Обходы фильтров и защит.
XSS. Обходы фильтров и защит.XSS. Обходы фильтров и защит.
XSS. Обходы фильтров и защит.
 
Web осень 2012 лекция 10
Web осень 2012 лекция 10Web осень 2012 лекция 10
Web осень 2012 лекция 10
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.Почте
 
176023
176023176023
176023
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Работа со статикой в Django
Работа со статикой в DjangoРабота со статикой в Django
Работа со статикой в Django
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 

Mehr von Ecommerce Solution Provider SysIQ

Mehr von Ecommerce Solution Provider SysIQ (15)

Unexpected achievements 2013
Unexpected achievements 2013Unexpected achievements 2013
Unexpected achievements 2013
 
Getting to know magento
Getting to know magentoGetting to know magento
Getting to know magento
 
Developing for e commerce is important
Developing for e commerce is importantDeveloping for e commerce is important
Developing for e commerce is important
 
Magento code audit
Magento code auditMagento code audit
Magento code audit
 
Scalability and performance for e commerce
Scalability and performance for e commerceScalability and performance for e commerce
Scalability and performance for e commerce
 
Going Global
Going GlobalGoing Global
Going Global
 
QA evolution to the present day
QA evolution to the present dayQA evolution to the present day
QA evolution to the present day
 
Quick Intro to Clean Coding
Quick Intro to Clean CodingQuick Intro to Clean Coding
Quick Intro to Clean Coding
 
Manifest of modern engineers
Manifest of modern engineersManifest of modern engineers
Manifest of modern engineers
 
IGears: Template Architecture and Principles
IGears: Template Architecture and PrinciplesIGears: Template Architecture and Principles
IGears: Template Architecture and Principles
 
Interactive web prototyping
Interactive web prototypingInteractive web prototyping
Interactive web prototyping
 
Модульные сетки в реальном мире
Модульные сетки в реальном миреМодульные сетки в реальном мире
Модульные сетки в реальном мире
 
External Widgets Performance
External Widgets PerformanceExternal Widgets Performance
External Widgets Performance
 
Understanding Annotations in Java
Understanding Annotations in JavaUnderstanding Annotations in Java
Understanding Annotations in Java
 
Frontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and HowFrontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and How
 

non-blocking java script

  • 3. Потоки по браузерам * Firefox 3+ 6 потоков Chrome 6 потоков Safari 3-4 4 потока Safari 5 6 потоков Opera 12 6 потоков IE 6-7 2 потока IE 8-9 6 потоков IE 10 8 потоков * - число параллельных соединений к одному хосту
  • 4. Процесс отрисовки Исходный HTML DOM дерево Дерево отрисовки
  • 5. DOMContentLoaded - событие срабатывает при загрузке документа, кроме IE<9 - ждет css, если после него идет скрипт - ждёт загрузки и выполнения скриптов (кроме скриптов с async/defer, если есть поддержка и динамических) - в FF/Chrome формы автозаполняются по DOMContentLoaded - интерфейсы обычно инициализируются по DOMContentLoaded
  • 7. Скрипты на странице* Во время загрузки Во время выполнения - блокируется отрисовка страницы - блокируют вообще все загрузки (IE<8, Opera<15) - блокируют все загрузки, кроме стилей и скриптов (IE8, FF, Chrome, Safari) - остальные загрузки не блокируются (IE>8) - ждет пока загрузятся предшествующие css файлы - блокируют вообще всё * - распространяется на скрипты со всех хостов
  • 12. Скрипты в конце BODY Chrome - не блокируется рендеринг страницы - не блокируются загрузки предыдущих ресурсов - страница доступна до инициализации скриптов
  • 14. <link rel="stylesheet" type="text/css" href="styles.css" /> <!--[if lte IE 8]> <link rel="stylesheet" type="text/css" href="ie.css"> <![endif]--> Conditional Comments (IE)
  • 15. Conditional Comments (IE) <!--[if IE]><![endif]--> <link rel="stylesheet" type="text/css" href="styles.css" /> <!--[if lte IE 8]> <link rel="stylesheet" type="text/css" href="ie.css"> <![endif]-->
  • 16. Не блокирующие скрипты - document.write - script in iframe - script defer - script async - XMLHttpRequest Eval - XMLHttpRequest Injection - Script DOM
  • 17. document.write IE6 document.write('<scr'+'ipt src="jquery.js"></scr'+'ipt>'); document.write('<scr'+'ipt src="scripts.js"></scr'+'ipt>'); - не блокирует другие скрипты - сохраняет порядок выполнения - блокирует рендеринг, загрузку css/img - актуально только для IE<8, Opera<15
  • 18. script in iframe - не блокирует рендеринг / загрузки - необходимо вносить изменения в скрипты - ограничение по домену <iframe src='script.html' id="f1"></iframe> <iframe src='script2.html' id="f2"></iframe>
  • 19. script defer - по стандарту только для внешних скриптов - не блокирует рендеринг / загрузки - выполнение после рендеринга страницы - сохраняется порядок выполнения (кроме IE<10) - IE4+, FF3.1+, Chrome 8+, Safari 5.1+, Opera 15+ <script src="jquery.js" defer></script> <script src="scripts.js" defer></script>
  • 20. script async - по стандарту только для внешних скриптов - не блокирует рендеринг / загрузки - выполнение сразу после загрузки - не сохраняется порядок выполнения - IE10+, FF3.6+, Chrome 8+, Safari 5.1+, Opera 15+ <script src="script1.js" async></script> <script src="script2.js" async></script>
  • 21. XMLHttpRequest Eval var xhr = getXmlHttp(); xhr.open("GET", "script.js", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { eval.call(window, xhr.responseText); } } xhr.send(null); - не блокирует рендеринг / загрузки - не сохраняется порядок выполнения - ограничение по домену - нет индикации загрузки
  • 22. XMLHttpRequest Injection - не блокирует рендеринг / загрузки - не сохраняется порядок выполнения - ограничение по домену - нет индикации загрузки var xhr = getXmlHttp(); xhr.open("GET", "script.js", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { var s=document.createElement('script'); document.getElementsByTagName('head')[0] .appendChild(s); s.text = xhr.responseText; } } xhr.send(null);
  • 23. Script DOM var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.src = 'app.js'; document.getElementsByTagName('head')[0] .appendChild(script); - не блокирует рендеринг / загрузки - не сохраняется порядок выполнения, кроме Opera<15 - async:true для Firefox 3.6, чтобы не сохранять порядок - нет ограничений на домен
  • 24. Script DOM + async:false - не блокирует рендеринг / загрузки - сохраняется порядок выполнения (кроме браузеров, которые не поддерживают async, но не FF<3.6 и Opera) - нет ограничений на домен var script = document.createElement('script'); script.type = 'text/javascript'; script.async = false; script.src = 'app.js'; document.getElementsByTagName('head')[0] .appendChild(script);
  • 25. Script DOM + onreadystatechange - не блокирует рендеринг / загрузки - позволяет гибко управлять загрузкой / выполнением - нет ограничений на домен - только IE6+ var js = document.createElement('script'); js.onreadystatechange = function() { if (js.readyState == 'loaded') { document.body.appendChild(js); // execution } }; js.src = 'app.js';
  • 26. Порядок загрузки не важен Цель: - Загрузить скрипты параллельно - Выполнить сразу после загрузки - Не блокировать рендеринг - Не блокировать загрузку других ресурсов - Кроссбраузерное решение Решение: Script DOM
  • 27. Порядок загрузки важен Цель: - Загрузить скрипты параллельно - Выполнить последовательно - Не блокировать рендеринг - Не блокировать загрузку других ресурсов - Кроссбраузерное решение Решение: Script DOM + async:false / onreadystatechange для IE / document.write для остальных браузеров
  • 28. Техники связывания - window onload - timer - script onload - callback (m) - degrading script tags (m) m - требует модификации скриптов
  • 29. Техники связывания <script type="text/javascript"> function init() { ... App.start(); ... } init(); </script> <script type="text/javascript" src="app.js"></script>
  • 30. window onload if ( window.addEventListener ) { window.addEventListener("load", init, false); } else if ( window.attachEvent ) { window.attachEvent("onload", init); } - просто в реализации - инициализация срабатывает слишком поздно
  • 31. timer function timer(interval) { if ( typeof(jQuery) === "undefined" ) { setTimeout(timer, interval); } else { init(); } } timer(300); - просто в реализации - лишние расходы ресурсов на выполнение скрипта - задержка при слишком большом интервале
  • 32. script onload js.onload = function() { if ( !js.done ) { js.done = true; init(); } }; js.onreadystatechange = function() { if ( !js.done && js.readyState.match(/loaded|complete/) ) { js.done = true; init(); } }; - выполнение инлайн скрипта максимально быстро - немного сложнее в реализации
  • 33. callback (m) - выполнение инлайн скрипта максимально быстро - вызов init() в конце app.js - не гибкое решение - требует модификации скриптов function init() { ... } var js = document.createElement('script'); js.src = "app.js"; document.getElementsByTagName('head') [0].appendChild(js);
  • 34. degrading script tags (m) function init() { ... } var js = document.createElement('script'); js.src = "app.js"; js.text = "init();"; document.getElementsByTagName('head') [0].appendChild(js); - гибкое решение - требует модификации скриптов inline script <script type="text/javascript" src="app.js"> init(); </script>
  • 35. degrading script tags (m) var fs = document.getElementsByTagName("script"); var len = fs.length; while ( len ) { var s = fs[len-1]; if ( s.src.indexOf('app.js') != -1 ) { eval( s.innerHTML ); break; } len--; } app.js
  • 36. Загрузчики - $script.js - YepNope.js - Control.js - LAB.js - Head.js - Load.js - Require.js Как будем загружать сам загрузчик?
  • 37. Загрузка виджетов ● Добавление через DOM ● Связывание через onload/onreadystatechange ● document.write() ○ Делаем свой document.write() ○ Выносим виджет в отдельный невидимый элемент ○ Загружаем в скрытый iframe, по onload копируем на страницу
  • 38. Загрузка виджетов (function(d, s) { var js, fjs = d.getElementsByTagName(s)[0], load = function(url, id) { if (d.getElementById(id)) {return;} js = d.createElement(s); js.src = url; js.id = id; fjs.parentNode.insertBefore(js, fjs); }; load('widget1.js', 'fbjssdk'); load('widget2.js', 'gplus1js'); load('widget3.js', 'tweetjs'); }(document, 'script'));
  • 39. Преимущества подхода Страница не виснет из-за сторонних виджетов Управление виджетами из одного места Гарантия подключения узла всего один раз (ID)
  • 42. Полезные материалы Ресурсы www.browserscope.org www.stevesouders.com Книга Steve Souders - Even Faster Web Sites Таблица сравнения загрузчиков https://spreadsheets.google.com/a/sysiq.com/lv? key=tDdcrv9wNQRCNCRCflWxhYQ
  • 43. ● WebPageTest Online (www.webpagetest.org) ● Webkit Developer Toolbar (Timeline Tab) ● Firebug for FF (YSlow add-on, Net Tab) ● Fiddler (Web Debugging Proxy) ● DynaTrace Ajax Edition ● Sloppy (proxy server) Инструменты