SlideShare a Scribd company logo
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

More Related Content

What's hot (20)

«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
2ГИС Технологии
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
MoscowJS
 
#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 integration
Illia 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
Первые шаги с RabbitMQ
Alexander Svetkin
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
Alexander Svetkin
 
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
Ontico
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
IT Share
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
2ГИС Технологии
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
MoscowJS
 
#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 integration
Illia 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
Первые шаги с RabbitMQ
Alexander Svetkin
 
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
HTML GL - возьмите столько FPS, сколько вам нужно, и немного эффектов в прида...
Ontico
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
IT Share
 

Viewers also liked (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
Ecommerce Solution Provider SysIQ
 
Психология восприятия и UX дизайн
Психология восприятия и UX дизайнПсихология восприятия и UX дизайн
Психология восприятия и UX дизайн
Ecommerce Solution Provider SysIQ
 
Java serialization
Java serializationJava serialization
Java serialization
Ecommerce Solution Provider SysIQ
 
Developing for e commerce is important
Developing for e commerce is importantDeveloping for e commerce is important
Developing for e commerce is important
Ecommerce Solution Provider SysIQ
 
User focused design
User focused designUser focused design
User focused design
Ecommerce Solution Provider SysIQ
 
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Ecommerce 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 2012
Ecommerce Solution Provider SysIQ
 
Правила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработкеПравила хорошего SEO тона в Frontend разработке
Правила хорошего SEO тона в Frontend разработке
Ecommerce Solution Provider SysIQ
 
Going global
Going globalGoing global
Going global
Ecommerce Solution Provider SysIQ
 
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSГибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Ecommerce Solution Provider SysIQ
 
QA evolution, in pictures
QA evolution, in picturesQA evolution, in pictures
QA evolution, in pictures
Ecommerce Solution Provider SysIQ
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
Ecommerce Solution Provider SysIQ
 
Management and Communications (IPAA)
Management and Communications (IPAA)Management and Communications (IPAA)
Management and Communications (IPAA)
Ecommerce Solution Provider SysIQ
 
Психология восприятия и UX дизайн
Психология восприятия и UX дизайнПсихология восприятия и UX дизайн
Психология восприятия и UX дизайн
Ecommerce Solution Provider SysIQ
 
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Модульные сетки в реальном мире - IQLab Frontend Fusion 2012
Ecommerce 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 2012
Ecommerce 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риентированноя CSS
Ecommerce Solution Provider SysIQ
 
Ad

Similar to non-blocking java script (20)

Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
Yandex
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
Eugene Zharkov
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
Yandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur 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
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
Константин Лебедев
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
Oleksandr 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 лекция 10
Technopark
 
Практическое применение 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
Работа со статикой в Django
MoscowDjango
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
Pavel Dovbush
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Yandex
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
Yandex
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
Eugene Zharkov
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
Yandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur 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 Framework
Oleksandr 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 лекция 10
Technopark
 
Практическое применение 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
Работа со статикой в Django
MoscowDjango
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
Pavel Dovbush
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Yandex
 
Ad

More from Ecommerce Solution Provider SysIQ (15)

Getting to know magento
Getting to know magentoGetting to know magento
Getting to know magento
Ecommerce Solution Provider SysIQ
 
Developing for e commerce is important
Developing for e commerce is importantDeveloping for e commerce is important
Developing for e commerce is important
Ecommerce Solution Provider SysIQ
 
Magento code audit
Magento code auditMagento code audit
Magento code audit
Ecommerce Solution Provider SysIQ
 
Scalability and performance for e commerce
Scalability and performance for e commerceScalability and performance for e commerce
Scalability and performance for e commerce
Ecommerce Solution Provider SysIQ
 
Going Global
Going GlobalGoing Global
Going Global
Ecommerce Solution Provider SysIQ
 
QA evolution to the present day
QA evolution to the present dayQA evolution to the present day
QA evolution to the present day
Ecommerce Solution Provider SysIQ
 
Quick Intro to Clean Coding
Quick Intro to Clean CodingQuick Intro to Clean Coding
Quick Intro to Clean Coding
Ecommerce Solution Provider SysIQ
 
IGears: Template Architecture and Principles
IGears: Template Architecture and PrinciplesIGears: Template Architecture and Principles
IGears: Template Architecture and Principles
Ecommerce Solution Provider SysIQ
 
Interactive web prototyping
Interactive web prototypingInteractive web prototyping
Interactive web prototyping
Ecommerce Solution Provider SysIQ
 
Understanding Annotations in Java
Understanding Annotations in JavaUnderstanding Annotations in Java
Understanding Annotations in Java
Ecommerce Solution Provider SysIQ
 
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
Ecommerce Solution Provider SysIQ
 

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) Инструменты