SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
Путешествие в мир
модульных загрузчиков
Кирилл КайсаровКирилл Кайсаров
2
Кратко обо мнеКратко обо мне
Javascript разработчик в команде 2gis.ruJavascript разработчик в команде 2gis.ru
3
Что такое модуль?Что такое модуль?
Модуль — функционально законченный фрагмент ,
оформленный в виде отдельного с или
поименованной непрерывной её части, предназначенный для
использования в других программах. Модули позволяют разбивать
сложные задачи на более мелкие в соответствии с
. Обычно проектируются таким образом, чтобы
предоставлять удобную для многократного
использования функциональность ( ) в виде
набора , , .
Источник: Wikipedia
программы
файла исходным кодом
принципом
модульности
программистам
интерфейс
функций классов констант
4
Плюсы использования модулейПлюсы использования модулей
— Независимость блоков кода
— Упрощает Unit тестирование и поиск ошибок
— Явные зависимости
5
В реальном миреВ реальном мире
РодоначальникиРодоначальники
Node.JS
Стандарт: CommonJS
Первый релиз: 2009 год
RequireJS
Стандарт: AMD
Первый релиз: Фев. 2010 года
var http = require('http');
function callback (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
};
http.createServer(callback).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
require(["helper/util"], function(util) {
// Эта функция не вызовется до тех пор пока
// не загрузиться helper/util.js
// Если внутри util.js есть define,
// то эта функция не вызовется пока не загрузятся
// зависимости указанные в define.
// Аргумент util вернет интерфейс util.js
});
— Синхронная загрузка
— Работает только на сервере
— Асинхронная загрузка
— Работает только в браузере
6
Единый стандартЕдиный стандарт
Мы хотим писать код который выполняется в разныхМы хотим писать код который выполняется в разных
окружениях без лишних сложностейокружениях без лишних сложностей
22 сентября 2010 года22 сентября 2010 года James HallidayJames Halliday, также известный как, также известный как
substacksubstack, выложил 37 строчный кусок кода который, выложил 37 строчный кусок кода который
трансформировалтрансформировал node.jsnode.js модули в browser-compability код.модули в browser-compability код.
https://github.com/substack/node-browserify/commit/b0363a
Появление browserify дало толчек развитию изморфных приложений.
Также появление этого решения позволило активно развиваться
пакетному менеджеру npm который сейчас
является самым популярным хранилищем
pre-written кода как для серверных так и для
клиентских приложений.
7
Новые испытанияНовые испытания
С развитиемС развитием HTML5HTML5 и появлением новых стандартов, таких каки появлением новых стандартов, таких как
Web ComponentsWeb Components, стало понятно что модульному принципу должны, стало понятно что модульному принципу должны
следовать не только Javascript блоки кода, но и остальныеследовать не только Javascript блоки кода, но и остальные
элементы, такие какэлементы, такие как CSSCSS таблицы, шрифты и графика.таблицы, шрифты и графика.
Загрузчики
// module.js
require('some.less');
// console
> browserify -t lessify module.js > build.js
Пример:
Webpack и Require.JS реализовывает этот функционалWebpack и Require.JS реализовывает этот функционал
через loaders, Browserify через transform'ычерез loaders, Browserify через transform'ы
8
Попытка стандартизацииПопытка стандартизации
Известный Open-Source разработчикИзвестный Open-Source разработчик TJ HolowaychukTJ Holowaychuk, также, также
известный какизвестный как visionmediavisionmedia ии tjtj, предложил коммьюнити компоненты, предложил коммьюнити компоненты
как стандарт клиентских библиотек. Для описания которыхкак стандарт клиентских библиотек. Для описания которых
использовался, отличный от привычного package.json,использовался, отличный от привычного package.json,
component.json. В нем содержались ссылки на все зависимостиcomponent.json. В нем содержались ссылки на все зависимости
модуля, в том числе и стилевые таблицы, изображения и так далее...модуля, в том числе и стилевые таблицы, изображения и так далее...
Репозиторий проекта
https://github.com/componentjs/component
Хранилище компонентов
https://github.com/component
9
Попытка стандартизацииПопытка стандартизации
{
"name": "dialog",
"description": "Dialog component",
"version": "0.4.0",
"keywords": [
"dialog",
"ui",
"modal"
],
"dependencies": {
"component/emitter": "1.1.3",
"component/overlay": "0.3.1",
"component/domify": "1.3.1",
"component/event": "0.1.4",
"component/classes": "1.2.1",
"component/query": "0.0.3"
},
"development": {
"visionmedia/mocha": "*",
"dominicbarnes/expect.js": "*"
},
"scripts": [
"index.js"
],
"styles": [
"dialog.css"
],
"templates": [
"template.html"
],
"demo": "http://component.github.io/dialog/"
}
Component.jsonComponent.json
К сожалению широкого
распространения component не
получил, но стандарт описания
активно используется таким
пакетным менеджером как Bower
Также мир компонентов пытался
покорить такой пакетный менеджер
как Duo (http://duojs.org/).
Основной идеей которого была
возможность подтягивать пакеты
прямо из github репозиториев.
@import 'necolas/normalize.css';
var tip = require('component/tip');
10
Следующие шаги развитияСледующие шаги развития
Chunk-loading on-demandChunk-loading on-demand
С развитием Javascript приложений, появилась проблема доставки
пользователю "большой" браузерной сборки кода. Особенно трудно перенесли
это мобильные устройства, часть из которых плохо кешируют любые файлы
больше 80-100кб. Для решения этой проблемы сборки отдают по частям.
WebpackWebpack
Встроенная функциональность базирующаяся на
экспериментальном стандарте require.ensure
BrowserifyBrowserify
Возможность разделения сборок с помощью плагина
factor-bundle. Больше ориентирован на многократные
точки входа и частоиспользуемые модули
11
Новая эра Javascript и ES6Новая эра Javascript и ES6
Разработчики стандарта EcmaScript 6, не пропустили мимо себя возможность
добавить в язык модули, и начали активную работу в 2013 году над написанием
стандарта.
В июле 2014 года TC39 финализировала синтаксис модулей:
// lib.js
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
// main.js
import { square, diag } from 'lib';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-imports
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-exports
12
Новая эра Javascript и ES6Новая эра Javascript и ES6
Также не маловажным пунктом стал и механизм загрузки модулей. В ранних
стандартах можно было увидеть глобальный объект System. Цель которого
была загрузка модулей в разных окружениях.
System.import('mymodule').then(function(m) {
new m.q();
});
Пример:
К большому сожалению группа разработки отказала в разработке этого
формата и перешла к новым обсуждениям этого вопроса.
https://whatwg.github.io/loader/
Status: This document is a work in progress and dreams of becoming a living standard.
13
ES6 прямо сейчас!ES6 прямо сейчас!
С активным развитием нового стандарта, появились
реализации экспериментального стандарта ES6 Loader
https://github.com/ModuleLoader/es6-module-loader
Polyfill для старого стандарта с объектом System, и активным
развитием в сторону нового стандарта с объектом Reflect
https://github.com/systemjs/systemjs
Универсальный загрузчик модулей для разных стандартов. AMD,
CommonJS, ES6 Modules, Node.JS, Global
http://jspm.io/
Package менеджер для system.js
Спасибо!!!Спасибо!!!
Приятных путешествий!!!Приятных путешествий!!!

Más contenido relacionado

La actualidad más candente

Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрийsolit
 
Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)Ontico
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Введение в maven
Введение в mavenВведение в maven
Введение в mavenDmitry Zinushin
 
"Electron. How the most modern framework works" Oleksii Holubiev
"Electron. How the most modern framework works" Oleksii Holubiev"Electron. How the most modern framework works" Oleksii Holubiev
"Electron. How the most modern framework works" Oleksii HolubievFwdays
 
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETДенис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETElias Fofanov
 
Вячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияВячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияElias Fofanov
 
История развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеИстория развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеlugnsk
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проектаYova Stoika
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDotNetConf
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVMKNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVMPavel Tsukanov
 
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"IT Event
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27MoscowJS
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Pavel Dovbush
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
МАПО 2013 Лекция 04 Фабрика Blockly
МАПО 2013 Лекция 04 Фабрика BlocklyМАПО 2013 Лекция 04 Фабрика Blockly
МАПО 2013 Лекция 04 Фабрика BlocklyОлег Гудаев
 
Обучение фронтенд разработке
Обучение фронтенд разработкеОбучение фронтенд разработке
Обучение фронтенд разработкеITCrowd Almaty
 

La actualidad más candente (19)

Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
 
Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Введение в maven
Введение в mavenВведение в maven
Введение в maven
 
"Electron. How the most modern framework works" Oleksii Holubiev
"Electron. How the most modern framework works" Oleksii Holubiev"Electron. How the most modern framework works" Oleksii Holubiev
"Electron. How the most modern framework works" Oleksii Holubiev
 
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETДенис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
 
Вячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияВячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестирования
 
История развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеИстория развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другие
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVMKNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
 
Непрерывная интеграция (Марина Пестова)
Непрерывная интеграция (Марина Пестова)Непрерывная интеграция (Марина Пестова)
Непрерывная интеграция (Марина Пестова)
 
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
МАПО 2013 Лекция 04 Фабрика Blockly
МАПО 2013 Лекция 04 Фабрика BlocklyМАПО 2013 Лекция 04 Фабрика Blockly
МАПО 2013 Лекция 04 Фабрика Blockly
 
Обучение фронтенд разработке
Обучение фронтенд разработкеОбучение фронтенд разработке
Обучение фронтенд разработке
 

Destacado

Мультиплатформенная синхронизация структурированных данных
Мультиплатформенная синхронизация структурированных данныхМультиплатформенная синхронизация структурированных данных
Мультиплатформенная синхронизация структурированных данныхCodeFest
 
Внутри Stack Overflow
Внутри Stack OverflowВнутри Stack Overflow
Внутри Stack OverflowCodeFest
 
Лекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, DrawerЛекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, DrawerАлександр Брич
 
Здравый смысл, брендинг, веб и как всё это связано
Здравый смысл, брендинг, веб и как всё это связаноЗдравый смысл, брендинг, веб и как всё это связано
Здравый смысл, брендинг, веб и как всё это связаноCodeFest
 
Демоны на PHP (Денис Глазков)
Демоны на PHP (Денис Глазков)Демоны на PHP (Денис Глазков)
Демоны на PHP (Денис Глазков)Ontico
 
7 кашкута
7 кашкута7 кашкута
7 кашкутаCodeFest
 
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)CodeFest
 
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...CodeFest
 
Growth hacking своими руками – поиск ключа к росту продукта
Growth hacking своими руками – поиск ключа к росту продуктаGrowth hacking своими руками – поиск ключа к росту продукта
Growth hacking своими руками – поиск ключа к росту продуктаCodeFest
 
Развитие управления проектами и критериев качества в ИТ
Развитие управления проектами и критериев качества в ИТРазвитие управления проектами и критериев качества в ИТ
Развитие управления проектами и критериев качества в ИТCodeFest
 
Php intro rus
Php intro rusPhp intro rus
Php intro rusaDDDitive
 
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?CodeFest
 
Функциональное программирование в браузере
Функциональное программирование в браузереФункциональное программирование в браузере
Функциональное программирование в браузереCodeFest
 
QA: Базовое тестирование защищенности веб-приложений в рамках QA
QA: Базовое тестирование защищенности веб-приложений в рамках QAQA: Базовое тестирование защищенности веб-приложений в рамках QA
QA: Базовое тестирование защищенности веб-приложений в рамках QACodeFest
 
CQRS: A More Effective Way of Writing the Same Applications
CQRS: A More Effective Way of Writing the Same ApplicationsCQRS: A More Effective Way of Writing the Same Applications
CQRS: A More Effective Way of Writing the Same ApplicationsCodeFest
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон ТурецкийCodeFest
 
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продуктCodeFest
 
Maurice de Beijer
Maurice de BeijerMaurice de Beijer
Maurice de BeijerCodeFest
 

Destacado (20)

Мультиплатформенная синхронизация структурированных данных
Мультиплатформенная синхронизация структурированных данныхМультиплатформенная синхронизация структурированных данных
Мультиплатформенная синхронизация структурированных данных
 
Внутри Stack Overflow
Внутри Stack OverflowВнутри Stack Overflow
Внутри Stack Overflow
 
Лекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, DrawerЛекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, Drawer
 
Здравый смысл, брендинг, веб и как всё это связано
Здравый смысл, брендинг, веб и как всё это связаноЗдравый смысл, брендинг, веб и как всё это связано
Здравый смысл, брендинг, веб и как всё это связано
 
Демоны на PHP (Денис Глазков)
Демоны на PHP (Денис Глазков)Демоны на PHP (Денис Глазков)
Демоны на PHP (Денис Глазков)
 
7 кашкута
7 кашкута7 кашкута
7 кашкута
 
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
 
Base php 1
Base php 1Base php 1
Base php 1
 
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...
CodeFest 2014. Christopher Bennage — CQRS Journey: scalable, available, and m...
 
Growth hacking своими руками – поиск ключа к росту продукта
Growth hacking своими руками – поиск ключа к росту продуктаGrowth hacking своими руками – поиск ключа к росту продукта
Growth hacking своими руками – поиск ключа к росту продукта
 
Развитие управления проектами и критериев качества в ИТ
Развитие управления проектами и критериев качества в ИТРазвитие управления проектами и критериев качества в ИТ
Развитие управления проектами и критериев качества в ИТ
 
Php intro rus
Php intro rusPhp intro rus
Php intro rus
 
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?
Эффективная, вовлеченная команда энтузиастов. А ты готов к этому?
 
Функциональное программирование в браузере
Функциональное программирование в браузереФункциональное программирование в браузере
Функциональное программирование в браузере
 
QA: Базовое тестирование защищенности веб-приложений в рамках QA
QA: Базовое тестирование защищенности веб-приложений в рамках QAQA: Базовое тестирование защищенности веб-приложений в рамках QA
QA: Базовое тестирование защищенности веб-приложений в рамках QA
 
CQRS: A More Effective Way of Writing the Same Applications
CQRS: A More Effective Way of Writing the Same ApplicationsCQRS: A More Effective Way of Writing the Same Applications
CQRS: A More Effective Way of Writing the Same Applications
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
Design by Contracts in PHP
Design by Contracts in PHPDesign by Contracts in PHP
Design by Contracts in PHP
 
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт
20 миллионов долларов за два года с нуля, или как мы делаем нужный людям продукт
 
Maurice de Beijer
Maurice de BeijerMaurice de Beijer
Maurice de Beijer
 

Similar a Frontend: Путешествие в мир модульных загрузчиков

Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5Provectus
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...JSib
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakAmasty
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012InTRUEdeR
 
Client Side Autotesting Flash
Client Side Autotesting FlashClient Side Autotesting Flash
Client Side Autotesting Flashguestb0af15
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Web programming modern tendencies
Web programming modern tendenciesWeb programming modern tendencies
Web programming modern tendenciesDarkestMaster
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Инструменты разработки ПО в *nix
Инструменты разработки ПО в *nixИнструменты разработки ПО в *nix
Инструменты разработки ПО в *nixAlexander Gerasiov
 
Platypus platform ivbit
Platypus platform ivbitPlatypus platform ivbit
Platypus platform ivbitjskonst
 
Liferay Portal и приемы разработки
Liferay Portal и приемы разработкиLiferay Portal и приемы разработки
Liferay Portal и приемы разработкиdevclub
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыOleg Nenashev
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияOvadiah Myrgorod
 

Similar a Frontend: Путешествие в мир модульных загрузчиков (20)

WebAssembly
WebAssemblyWebAssembly
WebAssembly
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis Bosak
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
Java 2 - Java Intro
Java 2 - Java IntroJava 2 - Java Intro
Java 2 - Java Intro
 
Client Side Autotesting Flash
Client Side Autotesting FlashClient Side Autotesting Flash
Client Side Autotesting Flash
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Web programming modern tendencies
Web programming modern tendenciesWeb programming modern tendencies
Web programming modern tendencies
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Backbone lesson 1
Backbone lesson 1Backbone lesson 1
Backbone lesson 1
 
Инструменты разработки ПО в *nix
Инструменты разработки ПО в *nixИнструменты разработки ПО в *nix
Инструменты разработки ПО в *nix
 
Platypus platform ivbit
Platypus platform ivbitPlatypus platform ivbit
Platypus platform ivbit
 
Step 1
Step 1Step 1
Step 1
 
Liferay Portal и приемы разработки
Liferay Portal и приемы разработкиLiferay Portal и приемы разработки
Liferay Portal и приемы разработки
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровождения
 

Más de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Más de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

Frontend: Путешествие в мир модульных загрузчиков

  • 1. Путешествие в мир модульных загрузчиков Кирилл КайсаровКирилл Кайсаров
  • 2. 2 Кратко обо мнеКратко обо мне Javascript разработчик в команде 2gis.ruJavascript разработчик в команде 2gis.ru
  • 3. 3 Что такое модуль?Что такое модуль? Модуль — функционально законченный фрагмент , оформленный в виде отдельного с или поименованной непрерывной её части, предназначенный для использования в других программах. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с . Обычно проектируются таким образом, чтобы предоставлять удобную для многократного использования функциональность ( ) в виде набора , , . Источник: Wikipedia программы файла исходным кодом принципом модульности программистам интерфейс функций классов констант
  • 4. 4 Плюсы использования модулейПлюсы использования модулей — Независимость блоков кода — Упрощает Unit тестирование и поиск ошибок — Явные зависимости
  • 5. 5 В реальном миреВ реальном мире РодоначальникиРодоначальники Node.JS Стандарт: CommonJS Первый релиз: 2009 год RequireJS Стандарт: AMD Первый релиз: Фев. 2010 года var http = require('http'); function callback (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }; http.createServer(callback).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); require(["helper/util"], function(util) { // Эта функция не вызовется до тех пор пока // не загрузиться helper/util.js // Если внутри util.js есть define, // то эта функция не вызовется пока не загрузятся // зависимости указанные в define. // Аргумент util вернет интерфейс util.js }); — Синхронная загрузка — Работает только на сервере — Асинхронная загрузка — Работает только в браузере
  • 6. 6 Единый стандартЕдиный стандарт Мы хотим писать код который выполняется в разныхМы хотим писать код который выполняется в разных окружениях без лишних сложностейокружениях без лишних сложностей 22 сентября 2010 года22 сентября 2010 года James HallidayJames Halliday, также известный как, также известный как substacksubstack, выложил 37 строчный кусок кода который, выложил 37 строчный кусок кода который трансформировалтрансформировал node.jsnode.js модули в browser-compability код.модули в browser-compability код. https://github.com/substack/node-browserify/commit/b0363a Появление browserify дало толчек развитию изморфных приложений. Также появление этого решения позволило активно развиваться пакетному менеджеру npm который сейчас является самым популярным хранилищем pre-written кода как для серверных так и для клиентских приложений.
  • 7. 7 Новые испытанияНовые испытания С развитиемС развитием HTML5HTML5 и появлением новых стандартов, таких каки появлением новых стандартов, таких как Web ComponentsWeb Components, стало понятно что модульному принципу должны, стало понятно что модульному принципу должны следовать не только Javascript блоки кода, но и остальныеследовать не только Javascript блоки кода, но и остальные элементы, такие какэлементы, такие как CSSCSS таблицы, шрифты и графика.таблицы, шрифты и графика. Загрузчики // module.js require('some.less'); // console > browserify -t lessify module.js > build.js Пример: Webpack и Require.JS реализовывает этот функционалWebpack и Require.JS реализовывает этот функционал через loaders, Browserify через transform'ычерез loaders, Browserify через transform'ы
  • 8. 8 Попытка стандартизацииПопытка стандартизации Известный Open-Source разработчикИзвестный Open-Source разработчик TJ HolowaychukTJ Holowaychuk, также, также известный какизвестный как visionmediavisionmedia ии tjtj, предложил коммьюнити компоненты, предложил коммьюнити компоненты как стандарт клиентских библиотек. Для описания которыхкак стандарт клиентских библиотек. Для описания которых использовался, отличный от привычного package.json,использовался, отличный от привычного package.json, component.json. В нем содержались ссылки на все зависимостиcomponent.json. В нем содержались ссылки на все зависимости модуля, в том числе и стилевые таблицы, изображения и так далее...модуля, в том числе и стилевые таблицы, изображения и так далее... Репозиторий проекта https://github.com/componentjs/component Хранилище компонентов https://github.com/component
  • 9. 9 Попытка стандартизацииПопытка стандартизации { "name": "dialog", "description": "Dialog component", "version": "0.4.0", "keywords": [ "dialog", "ui", "modal" ], "dependencies": { "component/emitter": "1.1.3", "component/overlay": "0.3.1", "component/domify": "1.3.1", "component/event": "0.1.4", "component/classes": "1.2.1", "component/query": "0.0.3" }, "development": { "visionmedia/mocha": "*", "dominicbarnes/expect.js": "*" }, "scripts": [ "index.js" ], "styles": [ "dialog.css" ], "templates": [ "template.html" ], "demo": "http://component.github.io/dialog/" } Component.jsonComponent.json К сожалению широкого распространения component не получил, но стандарт описания активно используется таким пакетным менеджером как Bower Также мир компонентов пытался покорить такой пакетный менеджер как Duo (http://duojs.org/). Основной идеей которого была возможность подтягивать пакеты прямо из github репозиториев. @import 'necolas/normalize.css'; var tip = require('component/tip');
  • 10. 10 Следующие шаги развитияСледующие шаги развития Chunk-loading on-demandChunk-loading on-demand С развитием Javascript приложений, появилась проблема доставки пользователю "большой" браузерной сборки кода. Особенно трудно перенесли это мобильные устройства, часть из которых плохо кешируют любые файлы больше 80-100кб. Для решения этой проблемы сборки отдают по частям. WebpackWebpack Встроенная функциональность базирующаяся на экспериментальном стандарте require.ensure BrowserifyBrowserify Возможность разделения сборок с помощью плагина factor-bundle. Больше ориентирован на многократные точки входа и частоиспользуемые модули
  • 11. 11 Новая эра Javascript и ES6Новая эра Javascript и ES6 Разработчики стандарта EcmaScript 6, не пропустили мимо себя возможность добавить в язык модули, и начали активную работу в 2013 году над написанием стандарта. В июле 2014 года TC39 финализировала синтаксис модулей: // lib.js export const sqrt = Math.sqrt; export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); } // main.js import { square, diag } from 'lib'; console.log(square(11)); // 121 console.log(diag(4, 3)); // 5 https://people.mozilla.org/~jorendorff/es6-draft.html#sec-imports https://people.mozilla.org/~jorendorff/es6-draft.html#sec-exports
  • 12. 12 Новая эра Javascript и ES6Новая эра Javascript и ES6 Также не маловажным пунктом стал и механизм загрузки модулей. В ранних стандартах можно было увидеть глобальный объект System. Цель которого была загрузка модулей в разных окружениях. System.import('mymodule').then(function(m) { new m.q(); }); Пример: К большому сожалению группа разработки отказала в разработке этого формата и перешла к новым обсуждениям этого вопроса. https://whatwg.github.io/loader/ Status: This document is a work in progress and dreams of becoming a living standard.
  • 13. 13 ES6 прямо сейчас!ES6 прямо сейчас! С активным развитием нового стандарта, появились реализации экспериментального стандарта ES6 Loader https://github.com/ModuleLoader/es6-module-loader Polyfill для старого стандарта с объектом System, и активным развитием в сторону нового стандарта с объектом Reflect https://github.com/systemjs/systemjs Универсальный загрузчик модулей для разных стандартов. AMD, CommonJS, ES6 Modules, Node.JS, Global http://jspm.io/ Package менеджер для system.js