modules and assembling of javascript (in russian)

54

Upload: mikhail-davydov

Post on 28-Nov-2014

483 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Modules and assembling of JavaScript (in russian)
Page 2: Modules and assembling of JavaScript (in russian)

Михаил Давыдов JavaScript разработчик

Модули и сборка JavaScript

Page 3: Modules and assembling of JavaScript (in russian)

Моя история. С чего я начинал и к чему пришел…

Page 4: Modules and assembling of JavaScript (in russian)

cat **/*.js > build.js!

Page 5: Modules and assembling of JavaScript (in russian)

5

Файлы и cat **/*.js > build.js

• Это быстро и просто • Что плохого

–  Собирается все без разбора –  Возможны конфликты имен переменных –  Результат плохо сжимается –  Нужно учитывать порядок

Page 6: Modules and assembling of JavaScript (in russian)

Так жить нельзя! – Нужны модули.

Page 7: Modules and assembling of JavaScript (in russian)

7

Мне понадобились модули. Зачем?

• Разделение логических частей • Управление импортом/экспортом • Явные зависимости и их контроль • Меньше конфликтов переменных

Page 8: Modules and assembling of JavaScript (in russian)

Модуль? – нет, не слышал!

Learning JavaScript Design Patterns

http://clck.ru/8aLgX

Page 9: Modules and assembling of JavaScript (in russian)

include('main.js');!

Page 10: Modules and assembling of JavaScript (in russian)

10

(function ($) { var myStuff = {}; window.stuff = myStuff; })(jQuery);

IIFE и include()

Page 11: Modules and assembling of JavaScript (in russian)

11

include('common.js'); include('ru.js'); include('main.js');

IIFE и include(): Сборка

includify main.js > build.js

Page 12: Modules and assembling of JavaScript (in russian)

12

IIFE и include()

• Что хорошего –  Модули в замыканиях –  Можно наследовать сборки

• Что плохого –  RegExp –  Дублирование модулей

Page 13: Modules and assembling of JavaScript (in russian)

Я встретил её…

Page 14: Modules and assembling of JavaScript (in russian)

REQUIRE JS

Page 15: Modules and assembling of JavaScript (in russian)

15

RequireJS

• AMD • Асинхронные зависимости • Плагины • Оптимизация – r.js • Большое комьюнити

Page 16: Modules and assembling of JavaScript (in russian)

16

define(['jQuery', 'lodash'], function ($, _) { var myStuff = {}; return myStuff; });

RequireJS & AMD: Модули

Page 17: Modules and assembling of JavaScript (in russian)

17

<script data-main="js/app" src="js/require.js"> </script>

RequireJS & AMD: Сборка

node r.js -o build.js

Page 18: Modules and assembling of JavaScript (in russian)

IREQUIRE JS

Я думал, что это навсегда…

Page 19: Modules and assembling of JavaScript (in russian)

19

define(function () { var myStuff = {}; return myStuff; });

Много церемоний с define()

1. Нужно писать обертку

Page 20: Modules and assembling of JavaScript (in russian)

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

Page 21: Modules and assembling of JavaScript (in russian)
Page 22: Modules and assembling of JavaScript (in russian)

22

define(function () { var myStuff = {}; return myStuff; });

Много церемоний с define()

3. Артефакты: Приходится табулировать

Page 23: Modules and assembling of JavaScript (in russian)

23

require('module'); // js? require('async!data', cb); // ? require(ComicSans); // font?

require() - God Object?

1. Возвращает что угодно, как угодно 2. Не сразу понятен результат

Page 24: Modules and assembling of JavaScript (in russian)

AMD и CJS

Page 25: Modules and assembling of JavaScript (in russian)

25

И еще AMD

• Приходится поддерживать AMD –  jQuery, underscore, backbone, … –  2 версии с AMD и без

• Пытаются заразить Node.js –  node-requirejs –  в node и так есть модульная система

http://clck.ru/4b7dE

Page 26: Modules and assembling of JavaScript (in russian)

Сейчас мы друзья

Page 27: Modules and assembling of JavaScript (in russian)

Другие пути

Page 28: Modules and assembling of JavaScript (in russian)

28

Другие пути

• browserify –  CommonJS – хорошо –  слишком много от Node.js – плохо

• просто загрузчик –  headjs –  yepnopejs

Page 29: Modules and assembling of JavaScript (in russian)

29

Из моего опыта

• Сегодня все собирается. Даже dev • Читаемость кода очень важна

–  Нужно исключить неявные конструкции

• Сборок бывает много –  dev, production, dev-ru, test-en_US

• Нужен контроль результата сборки –  Проверка целостности –  Подробная информация о сборке

Page 30: Modules and assembling of JavaScript (in russian)

Я создал новый инструмент

Page 31: Modules and assembling of JavaScript (in russian)

LMD – Lazy Module Declaration

LMD

Page 32: Modules and assembling of JavaScript (in russian)

Модули – CommonJS Остальное делает сборщик

Page 33: Modules and assembling of JavaScript (in russian)

33

var $ = require('$'), myStuff = {}; module.exports = myStuff;

Модули – CommonJS/Modules 1.0*

http://clck.ru/4b7gO

Page 34: Modules and assembling of JavaScript (in russian)

34

Профит

• Ненавязчивый формат –  Нет лишней писанины –  Единообразие вида модулей

• Обратная совместимость с Node.js –  Без плагинов, регистрации и SMS

• Оберткой модулей занимается сборщик

Page 35: Modules and assembling of JavaScript (in russian)

35

{ "root": "../js", "output": "../index.js", "modules": { "main": "main.js", "i18n": "locale/ru.json" }, "css": true, "ie": false, "worker": true }

Конфиг сборки

http://clck.ru/4b7gq

Page 36: Modules and assembling of JavaScript (in russian)

Проблема: Много конфигов

Page 37: Modules and assembling of JavaScript (in russian)

37

{ "extends": "index.json", "output": "../index-en.js" "modules": { "i18n": "locale/en.json" } }

Операции над конфигами

1. Наследование конфигов

http://clck.ru/4b7j2

Page 38: Modules and assembling of JavaScript (in russian)

38

{ "modules": { "i18n": "locale/en.json" } }

Операции над конфигами

2. Миксины конфигов

lmd index+en \ –output=index-en.js

http://clck.ru/4b7pI

Page 39: Modules and assembling of JavaScript (in russian)

39

{ "root": "../js", "modules": { "main": "main.js" }, "depends": "*.lmd.json" }

Операции над конфигами

3. Зависимости модулей

main.lmd.json хранит зависимости main.js

http://clck.ru/4b7sw

Page 40: Modules and assembling of JavaScript (in russian)

40

Профит

• Минус – нужно писать конфиг •  JSON можно легко реиспользовать • Количество конфигов сократилось • Меньше писать сборочных скриптов • Легче понять результат сборки

Page 41: Modules and assembling of JavaScript (in russian)

Явные плагины

Page 42: Modules and assembling of JavaScript (in russian)

Гибкие плагины

Page 43: Modules and assembling of JavaScript (in russian)

Очень гибкие плагины

Page 44: Modules and assembling of JavaScript (in russian)

44

{ "image": true, "promise": true, "cache": true, "stats": true }

Явный способ подключения плагинов

http://clck.ru/4b7t6

Сборщик проверит плагины

Page 45: Modules and assembling of JavaScript (in russian)

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

Page 46: Modules and assembling of JavaScript (in russian)

46

Профит

•  require() делает одну работу • Результат require() стал предсказуемым • Код стало проще воспринимать

Page 47: Modules and assembling of JavaScript (in russian)

______ __ __ !/\ ___\ /\ \ /\ \ !\ \ \____ \ \ \____ \ \ \ ! \ \_____\ \ \_____\ \ \_\ ! \/_____/ \/_____/ \/_/ !

!

http://clck.ru/4dU-0!

Page 48: Modules and assembling of JavaScript (in russian)

$ lmd -c cfg.json\ ✘! -o result.js ✘!!$ lmd make cfg ✔!$ lmd make cfg+ru ✔!$ lmd info cfg ✔!$ lmd ✔! atch ! fg!⇥ ⇥ ! c!w!

Page 49: Modules and assembling of JavaScript (in russian)

LMD GUI

Page 50: Modules and assembling of JavaScript (in russian)

Встроенная аналитика

http://clck.ru/4b8My

Page 51: Modules and assembling of JavaScript (in russian)

Интеграция с Grunt.js

https://npmjs.org/package/grunt-lmd

Page 52: Modules and assembling of JavaScript (in russian)

52

Профит LMD

• Максимум автоматизации –  Сборщик LMD –  Аналитика

• Максимум явного кода –  require.*()

• Минимум писанины –  CommonJS –  CLI & GUI

• Минимум копипаста –  Операции над кофигами

https://github.com/azproduction/lmd

Page 53: Modules and assembling of JavaScript (in russian)

Михаил Давыдов

JavaScript разработчик

[email protected] azproduction

Спасибо

Page 54: Modules and assembling of JavaScript (in russian)

Lazy Module Declaration

http://lmdjs.org