SlideShare a Scribd company logo
Modules and assembling of JavaScript (in russian)
Михаил Давыдов
JavaScript разработчик
Модули и
сборка
JavaScript
Моя история.
С чего я начинал и
к чему пришел…
cat **/*.js > build.js!
5
Файлы и cat **/*.js > build.js
• Это быстро и просто
• Что плохого
–  Собирается все без разбора
–  Возможны конфликты имен переменных
–  Результат плохо сжимается
–  Нужно учитывать порядок
Так жить нельзя!
– Нужны модули.
7
Мне понадобились модули. Зачем?
• Разделение логических частей
• Управление импортом/экспортом
• Явные зависимости и их контроль
• Меньше конфликтов переменных
Модуль? – нет, не слышал!
Learning JavaScript
Design Patterns
http://clck.ru/8aLgX
include('main.js');!
10
(function ($) {
var myStuff = {};
window.stuff = myStuff;
})(jQuery);
IIFE и include()
11
include('common.js');
include('ru.js');
include('main.js');
IIFE и include(): Сборка
includify main.js > build.js
12
IIFE и include()
• Что хорошего
–  Модули в замыканиях
–  Можно наследовать сборки
• Что плохого
–  RegExp
–  Дублирование модулей
Я встретил её…
REQUIRE JS
15
RequireJS
• AMD
• Асинхронные зависимости
• Плагины
• Оптимизация – r.js
• Большое комьюнити
16
define(['jQuery', 'lodash'],
function ($, _) {
var myStuff = {};
return myStuff;
});
RequireJS & AMD: Модули
17
<script
data-main="js/app"
src="js/require.js">
</script>
RequireJS & AMD: Сборка
node r.js -o build.js
I REQUIRE JS
Я думал, что это навсегда…
19
define(function () {
var myStuff = {};
return myStuff;
});
Много церемоний с define()
1. Нужно писать обертку
20
define("dojo/_base/html", [
"./kernel",
"../dom",
"../dom-style",
"../dom-attr",
"../dom-prop",
"../dom-class",
"../dom-construct",
"../dom-geometry"
], function (dojo, dom, style, attr, prop, cls, ctr, geom) {
});
Много церемоний с define()
2. Куча зависимостей – ад
http://clck.ru/4b7ew
Modules and assembling of JavaScript (in russian)
22
define(function () {
var myStuff = {};
return myStuff;
});
Много церемоний с define()
3. Артефакты: Приходится табулировать
23
require('module'); // js?
require('async!data', cb); // ?
require(ComicSans); // font?
require() - God Object?
1. Возвращает что угодно, как угодно
2. Не сразу понятен результат
AMD и CJS
25
И еще AMD
• Приходится поддерживать AMD
–  jQuery, underscore, backbone, …
–  2 версии с AMD и без
• Пытаются заразить Node.js
–  node-requirejs
–  в node и так есть модульная система
http://clck.ru/4b7dE
Сейчас мы друзья
Другие пути
28
Другие пути
•  browserify
–  CommonJS – хорошо
–  слишком много от Node.js – плохо
•  просто загрузчик
–  headjs
–  yepnopejs
29
Из моего опыта
•  Сегодня все собирается. Даже dev
•  Читаемость кода очень важна
–  Нужно исключить неявные конструкции
•  Сборок бывает много
–  dev, production, dev-ru, test-en_US
•  Нужен контроль результата сборки
–  Проверка целостности
–  Подробная информация о сборке
Я создал новый
инструмент
LMD – Lazy Module Declaration
LMD
Модули – CommonJS
Остальное делает сборщик
33
var $ = require('$'),
myStuff = {};
module.exports = myStuff;
Модули – CommonJS/Modules 1.0*
http://clck.ru/4b7gO
34
Профит
•  Ненавязчивый формат
–  Нет лишней писанины
–  Единообразие вида модулей
•  Обратная совместимость с Node.js
–  Без плагинов, регистрации и SMS
•  Оберткой модулей занимается сборщик
35
{
"root": "../js",
"output": "../index.js",
"modules": {
"main": "main.js",
"i18n": "locale/ru.json"
},
"css": true,
"ie": false,
"worker": true
}
Конфиг сборки
http://clck.ru/4b7gq
Проблема: Много конфигов
37
{
"extends": "index.json",
"output": "../index-en.js"
"modules": {
"i18n": "locale/en.json"
}
}
Операции над конфигами
1. Наследование конфигов
http://clck.ru/4b7j2
38
{
"modules": {
"i18n": "locale/en.json"
}
}
Операции над конфигами
2. Миксины конфигов
lmd index+en 
–output=index-en.js
http://clck.ru/4b7pI
39
{
"root": "../js",
"modules": {
"main": "main.js"
},
"depends": "*.lmd.json"
}
Операции над конфигами
3. Зависимости модулей
main.lmd.json хранит зависимости main.js
http://clck.ru/4b7sw
40
Профит
•  Минус – нужно писать конфиг
•  JSON можно легко реиспользовать
•  Количество конфигов сократилось
•  Меньше писать сборочных скриптов
•  Легче понять результат сборки
Явные плагины
Гибкие плагины
Очень гибкие плагины
44
{
"image": true,
"promise": true,
"cache": true,
"stats": true
}
Явный способ подключения плагинов
http://clck.ru/4b7t6
Сборщик проверит плагины
45
// javascript
require('module');
// css
require.css('path/to.css', callback);
// image+promise
require.image('path/img.png')
.then(callback);
LMD require – не God Object
http://clck.ru/4b7tO
46
Профит
•  require() делает одну работу
•  Результат require() стал предсказуемым
•  Код стало проще воспринимать
______ __ __ !
/ ___ /  /  !
  ____   ____    !
 _____  _____  _ !
/_____/ /_____/ /_/ !
!
http://clck.ru/4dU-0!
$ lmd -c cfg.json ✘!
-o result.js ✘!
!
$ lmd make cfg ✔!
$ lmd make cfg+ru ✔!
$ lmd info cfg ✔!
$ lmd ✔!atch !fg!⇥ ⇥! c!w!
LMD GUI
Встроенная аналитика
http://clck.ru/4b8My
Интеграция с Grunt.js
https://npmjs.org/package/grunt-lmd
52
Профит LMD
•  Максимум автоматизации
–  Сборщик LMD
–  Аналитика
•  Максимум явного кода
–  require.*()
•  Минимум писанины
–  CommonJS
–  CLI & GUI
•  Минимум копипаста
–  Операции над кофигами
https://github.com/azproduction/lmd
Михаил Давыдов
JavaScript разработчик
i@azproduction.ru
azproduction
Спасибо
Lazy Module Declaration
http://lmdjs.org

More Related Content

What's hot (20)

PDF
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
QADay
 
PPT
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
Dmytro Zharii
 
PPTX
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Ontico
 
PPTX
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Dmytro Zharii
 
PDF
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
PDF
DOM-шаблонизаторы – не только "быстро"
Roman Dvornov
 
PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
PDF
Опыт разработки эффективного SPA
Eugene Abrosimov
 
PDF
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Roman Dvornov
 
PDF
Basis.js – «под капотом»
Roman Dvornov
 
PDF
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Ontico
 
PDF
Компонентный подход: скучно, неинтересно, бесперспективно
Roman Dvornov
 
PPTX
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Dmytro Zharii
 
PDF
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
PDF
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Krivoy Rog IT Community
 
PDF
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Ontico
 
PDF
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
PDF
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
DevDay
 
PDF
Быстро о быстром
Roman Dvornov
 
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
QADay
 
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
Dmytro Zharii
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Ontico
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Dmytro Zharii
 
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
DOM-шаблонизаторы – не только "быстро"
Roman Dvornov
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Опыт разработки эффективного SPA
Eugene Abrosimov
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Roman Dvornov
 
Basis.js – «под капотом»
Roman Dvornov
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Ontico
 
Компонентный подход: скучно, неинтересно, бесперспективно
Roman Dvornov
 
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Dmytro Zharii
 
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Krivoy Rog IT Community
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Ontico
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
DevDay
 
Быстро о быстром
Roman Dvornov
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 

Similar to Modules and assembling of JavaScript (in russian) (17)

PDF
RequireJS і Magento 2
Elogic Magento Development
 
PPTX
JavaScript-модули "из прошлого в будущее"
oelifantiev
 
PDF
Frontend: Путешествие в мир модульных загрузчиков
CodeFest
 
PDF
NPM и модульная архитектура приложения
Denis Latushkin
 
PDF
webpack: 7 бед - один ответ
Denis Izmaylov
 
PDF
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
MoscowJS
 
PDF
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Yandex
 
PPTX
Javascript! That's sick! Modules, AMD, Require.js
Stanislav Chistenko
 
PDF
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
PPT
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
PPTX
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest
 
PPTX
What do you MEAN? или введение в Fullstack JavaScript
Vasiliy Teliatnikov
 
PDF
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
QADay
 
PDF
JavaScript on frontend and backend (in Russian
Mikhail Davydov
 
PPT
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
RequireJS і Magento 2
Elogic Magento Development
 
JavaScript-модули "из прошлого в будущее"
oelifantiev
 
Frontend: Путешествие в мир модульных загрузчиков
CodeFest
 
NPM и модульная архитектура приложения
Denis Latushkin
 
webpack: 7 бед - один ответ
Denis Izmaylov
 
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
MoscowJS
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Yandex
 
Javascript! That's sick! Modules, AMD, Require.js
Stanislav Chistenko
 
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest
 
What do you MEAN? или введение в Fullstack JavaScript
Vasiliy Teliatnikov
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
QADay
 
JavaScript on frontend and backend (in Russian
Mikhail Davydov
 
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
Ad

More from Mikhail Davydov (14)

PDF
Components now! (in russian)
Mikhail Davydov
 
PDF
JavaScript. Event Model (in russian)
Mikhail Davydov
 
PDF
Code Style (in russian)
Mikhail Davydov
 
PDF
Ajax and Transports (in russian)
Mikhail Davydov
 
PDF
Introduction in Node.js (in russian)
Mikhail Davydov
 
PDF
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
PDF
JavaScript. OOP (in russian)
Mikhail Davydov
 
PDF
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
PDF
JavaScript. Introduction (in russian)
Mikhail Davydov
 
PDF
JavaScript. Basics (in russian)
Mikhail Davydov
 
PDF
JavaScript. Async (in Russian)
Mikhail Davydov
 
PDF
Components now!
Mikhail Davydov
 
PDF
Dart - светлая сторона силы?
Mikhail Davydov
 
PDF
Making Scalable JavaScript Application
Mikhail Davydov
 
Components now! (in russian)
Mikhail Davydov
 
JavaScript. Event Model (in russian)
Mikhail Davydov
 
Code Style (in russian)
Mikhail Davydov
 
Ajax and Transports (in russian)
Mikhail Davydov
 
Introduction in Node.js (in russian)
Mikhail Davydov
 
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
JavaScript. OOP (in russian)
Mikhail Davydov
 
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
JavaScript. Introduction (in russian)
Mikhail Davydov
 
JavaScript. Basics (in russian)
Mikhail Davydov
 
JavaScript. Async (in Russian)
Mikhail Davydov
 
Components now!
Mikhail Davydov
 
Dart - светлая сторона силы?
Mikhail Davydov
 
Making Scalable JavaScript Application
Mikhail Davydov
 
Ad

Modules and assembling of JavaScript (in russian)