SlideShare a Scribd company logo
1 of 52
JavaScript-модули
“Из прошлого в будущее”
Константин Ершов,
frontend meetup, Ярославль, 10.12.2014
Начало...
● легкая модификация DOM
● 50 строк кода
Что дает модульная система?
● Ограничение области видимости
● Реиспользование частей приложения
● Структуризация приложения
● Наглядный код
Простейшие модули
● Разделение на файлы
● Паттерн с самовызывающейся ф-цией
● Глобальная область видимости
//iMath.js
(function(myNameSpace){
function square(x){
return x*x;
}
myNameSpace.iMath = {
square: square
};
}(window.myNamespace = window.myNamespace || {}))
//main.js
(function(){
alert(window.myNamespace.iMath.square(2));
}())
Плюсы:
- ограничение области видимости
- это уже почти модули
Плюсы:
- ограничение области видимости
- это уже почти модули
Минусы:
- нет поддержки зависимостей
- для асинхронной загрузки модуля нужно
реализовывать обертку
- нужно следить за порядком загрузки модулей
Asynchronous Module
Definition (AMD)
- подход к организации модулей, который
определяет API, следуя которому можно организовать
асинхронную загрузку модулей и их зависимостей.
Asynchronous Module
Definition (AMD)
Краткие характеристики
● работает без eval() или этапа компиляции, за счет
синтаксиса;
● предназначен для асинхронной загрузки;
● преимущественно используется на стороне клиента.
define для определения модуля
require для загрузки
define - определение модуля
define(
[module_name] /*опционально*/,
[dependencies] /*зависимости -
опционально*/,
definition /*функция инстанцирования
модуля или объект*/
);
define('iMath', function(){
function square(x){
return x*x;
}
return {
square: square
};
});
define('anotherModule', ['iMath'], function(iMath){
alert(iMath.square(2));
});
require - загрузка модулей
require(
[modules] /*список модулей*/,
callback /*функция вызываемая при
успешной загрузке модулей*/
errback /*функция вызываемая при ошибке
загрузки модулей*/
);
require(
['anotherModule', 'yetAnotherModule'],
function(aM, yAM){
//do something with modules
}, function(error){
console.error(error);
}
);
Система плагинов
require(['tpl!main'], function(tplFn){
var html = tplFn(data);
});
//плагин 'tpl!'
define('tpl', ['templateEngine'], function(templateEngine){
return {
load: function(name, parentRequire, onload, config){
parentRequire(['text!' + name], function(text){
onload(templateEngine.createTemplate(text));
});
}
};
});
Почему AMD - это лучший выбор для написания модульного js на клиенте?
● Имеет четкое представление о том как нужно подходить к определению гибких модулей.
● Значительно чище и безопасней, чем использование глобального нэймспейса
● Определение модуля инкапсулировано, что помогает избежать загрязнения глобальной
области видимости.
● Работает лучше чем альтернативные решения (например CommonJS, который мы
рассмотрим позже)
● Не имеет проблем с кросс-доменностью, отладкой. Не нуждается в инструменте на
стороне сервера. Большенство загрузчиков AMD поддерживают загрузку модулей без
процесса сборки.
● Обеспечивает подход «transport» для включения нескольких модулей в один файл.
● Поддерживает ленивую загрузку, если необходимо.
CommonJS
CommonJS
- рабочая группа, работающая над разработкой и стандартизацией
JavaScript API. На сегодняшний день они работают над ратификацией
стандарта для модулей и пакетов. Модули предложенные CommonJS
определяют простой API для работы js на стороне сервера.
Краткие характеристики:
● компактный синтаксис;
● предназначен для синхронной загрузки;
● преимущественно используется на стороне сервера.
require для загрузки импортов
exports для публикации частей
модуля
//iMath.js
function square(x){
return x*x;
}
exports.square = square;
//anotherModule.js
var iMath = require('./iMath');
console.log(iMath.square(2));
//iMath.js
define('iMath', function(){
function square(x){
return x*x;
}
return {
square: square
};
});
//anotherModule.js
define('anotherModule', ['iMath'], function(iMath){
alert(iMath.square(2));
});
Подходит ли CommonJS для
браузера?
Общие модули для клиента и сервера
● Загрузчики и фреймворки поддерживащие CommonJS модули в
браузере:
○ curl.js - загрузчик модулей на клиенте
○ cajon - загрузчик разработанный поверх require.js
Общие модули для клиента и сервера
● Загрузчики и фреймворки поддерживащие CommonJS модули в
браузере:
○ curl.js - загрузчик модулей на клиенте
○ cajon - загрузчик разработанный поверх require.js
● Использование Browserify, утилиты которая позволяет запускать любые
node.js модули в браузере
Общие модули для клиента и сервера
● Загрузчики и фреймворки поддерживащие CommonJS модули в
браузере:
○ curl.js - загрузчик модулей на клиенте
○ cajon - загрузчик разработанный поверх require.js
● Использование Browserify, утилиты которая позволяет запускать дюбые
node.js модули в браузере
● Использование на сервере node-require (AMD на клиенте и на сервере)
Общие модули для клиента и сервера
● Загрузчики и фреймворки поддерживащие CommonJS модули в
браузере:
○ curl.js - загрузчик модулей на клиенте
○ cajon - загрузчик разработанный поверх require.js
● Использование Browserify, утилиты которая позволяет запускать дюбые
node.js модули в браузере
● Использование на сервере node-require (AMD на клиенте и на сервере)
● Использование оберток для модулей
ES6
Стандарт ES6 module состоит из двух частей:
● декларативный синтаксис (для импорта и экспорта);
● программной загрузки (чтобы задать конфигурацию
загрузки модулей и для условной загрузки
модулей).
Экспорт
let notExported = 'abc';
export function square(x) {
return x * x;
}
export const MY_CONSTANT = 123;
Импорт
import { square } from './iMath';
console.log(square(3));
Импорт
import { square } from './iMath';
console.log(square(3));
import { square, MY_CONSTANT } from './iMath';
Импорт
import { square } from './iMath';
console.log(square(3));
import { square, MY_CONSTANT } from './iMath';
import './iMath' as c;
console.log(c.square(3));
Импорт
import { square } from './iMath';
console.log(square(3));
import { square, MY_CONSTANT } from './iMath';
import './iMath' as c;
console.log(c.square(3));
import { square as squ } from './iMath';
console.log(squ(3));
Экспорт по умолчанию
// myapp/models/Customer.js
export default class { // анонимный класс
constructor(id, name) {
this.id = id;
this.name = name;
}
};
Экспорт по умолчанию
// myapp/models/Customer.js
export default class { // анонимный класс
constructor(id, name) {
this.id = id;
this.name = name;
}
};
// myapp/myapp.js
import Customer from 'models/Customer';
let c = new Customer(0, 'Jane');
API программной загрузки
Позволяет делать две вещи:
● настраивать загрузку модулей
● программно работать с модулями и скриптами
Цепь загрузки и компиляции модуля
normalize
System.normalize = function(moduleName, options){
//преобразуем 'core!superLib' --> 'core/lib/superLib.coffee'
return moduleName
};
resolve
System.resolve = function(moduleName, options){
// преобразуем 'core/lib/superLib.coffee' -->
// '/var/www/myProject/resources/core/lib/superLib.coffee'
return moduleName
};
fetch
System.fetch = function(url, options){
//читаем с диска или грузим через сеть
};
translate
System.translate = function(source, options){
return CoffeeScript.translate(source);
};
link
System.link = function(jsSource, options){
//можем вернуть объект, с зависимостями и колбэком
//можем вернуть модуль
//можем вернуть undefined тогда система решит, что мы загрузили
// настоящий ES6 модуль и предоставит наружу все что он экспортирует
};
Используем модули ECMAScript 6
● ES6 Module Transpiler: позволяет писать свои модули, используя
некую часть стандарта ECMAScript 6 (грубо говоря, ECMAScript 5 +
экспорт + импорт), и компилирует их в модули AMD или CommonJS.
Статья Райана Флоренца (Ryan Florence) детально объясняет этот
подход.
● ES6 Module Loader: позволяет использовать API загрузки модулей
ECMAScript 6 в современных браузерах.
Ещё:
● require-hm: плагин для RequireJS, позволяющий загружать модули ECMAScript 6 (только
ECMAScript 5 + экспорт + импорт). Статья Каолана Макмахона (Caolan McMahon) объясняет,
как он работает. Предупреждение: плагин использует более старый синтаксис.
● Traceur (компилятор ECMAScript 6 в ECMAScript 5): частично поддерживает модули,
возможно, в конечном счете будет поддерживать их полностью.
● TypeScript TypeScript (грубо говоря, ECMAScript 6 и поддержка статической типизации):
компилирует модули из внешних файлов (которые могут использовать большую часть
ECMAScript 6) в AMD или CommonJS.
Вопросы?
Материалы
● Статья про es6 модули на frontender.info
● Варианты использования es6 модулей - Иегуда Кац(Yehuda Katz)
● Блог Эдди Османи(Addy Osmani)
● Статья “Путь js модуля” - Михаил Давыдов (Mikhail Davydov)

More Related Content

What's hot

Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotkidrupalconf
 
Drupal организация разработки
Drupal   организация разработкиDrupal   организация разработки
Drupal организация разработкиAnna Fedoruk
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Ontico
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Ontico
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливееYaroslav Serhieiev
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...zfconfua
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложенияDenis Latushkin
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеYandex
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьCodeFest
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)Ontico
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4rit2011
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
Стажировка-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
 
Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейKonstantin Komelin
 
Kopytov
KopytovKopytov
KopytovYandex
 

What's hot (20)

Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotki
 
Drupal организация разработки
Drupal   организация разработкиDrupal   организация разработки
Drupal организация разработки
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
 
Symfony 3
Symfony 3Symfony 3
Symfony 3
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливее
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Tapestry it is simple
Tapestry it is simpleTapestry it is simple
Tapestry it is simple
 
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людей
 
Kopytov
KopytovKopytov
Kopytov
 

Viewers also liked

Tessel. JavaScript на реальных устройствах.
Tessel. JavaScript на реальных устройствах. Tessel. JavaScript на реальных устройствах.
Tessel. JavaScript на реальных устройствах. oelifantiev
 
Пишем Google Extensions. Начальный уровень
Пишем Google Extensions. Начальный уровеньПишем Google Extensions. Начальный уровень
Пишем Google Extensions. Начальный уровеньoelifantiev
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJS
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScriptDmitry Soshnikov
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24MoscowJS
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)mlatushko
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Ontico
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraAllen Wirfs-Brock
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionMoscowJS
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptWojciech Dzikowski
 

Viewers also liked (17)

Tessel. JavaScript на реальных устройствах.
Tessel. JavaScript на реальных устройствах. Tessel. JavaScript на реальных устройствах.
Tessel. JavaScript на реальных устройствах.
 
Пишем Google Extensions. Начальный уровень
Пишем Google Extensions. Начальный уровеньПишем Google Extensions. Начальный уровень
Пишем Google Extensions. Начальный уровень
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScript
 
доклад
докладдоклад
доклад
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in action
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern Javascript
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 

Similar to JavaScript-модули "из прошлого в будущее"

Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукАсинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукYandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.jsОмские ИТ-субботники
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptVasiliy Teliatnikov
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiAlexander Makarov
 
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...DrupalCamp MSK
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Noveo
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Ontico
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к AnsibleIvan Grishaev
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...Омские ИТ-субботники
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 

Similar to JavaScript-модули "из прошлого в будущее" (20)

Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукАсинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
 
WebAssembly
WebAssemblyWebAssembly
WebAssembly
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScript
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
 
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 

More from oelifantiev

Медиавозможности HTML5. WebRTC
Медиавозможности HTML5. WebRTCМедиавозможности HTML5. WebRTC
Медиавозможности HTML5. WebRTCoelifantiev
 
От 40 до 2 секунд
От 40 до 2 секундОт 40 до 2 секунд
От 40 до 2 секундoelifantiev
 
ES6. Генераторы
ES6. ГенераторыES6. Генераторы
ES6. Генераторыoelifantiev
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибокoelifantiev
 
Yarfrontend #2. Как мы делали гуя...
Yarfrontend #2. Как мы делали гуя...Yarfrontend #2. Как мы делали гуя...
Yarfrontend #2. Как мы делали гуя...oelifantiev
 
Yarfrontend #2. Useful services
Yarfrontend #2. Useful servicesYarfrontend #2. Useful services
Yarfrontend #2. Useful servicesoelifantiev
 
Основы Git
Основы GitОсновы Git
Основы Gitoelifantiev
 
Облачные технологии и виртуализация
Облачные технологии и виртуализацияОблачные технологии и виртуализация
Облачные технологии и виртуализацияoelifantiev
 

More from oelifantiev (8)

Медиавозможности HTML5. WebRTC
Медиавозможности HTML5. WebRTCМедиавозможности HTML5. WebRTC
Медиавозможности HTML5. WebRTC
 
От 40 до 2 секунд
От 40 до 2 секундОт 40 до 2 секунд
От 40 до 2 секунд
 
ES6. Генераторы
ES6. ГенераторыES6. Генераторы
ES6. Генераторы
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
 
Yarfrontend #2. Как мы делали гуя...
Yarfrontend #2. Как мы делали гуя...Yarfrontend #2. Как мы делали гуя...
Yarfrontend #2. Как мы делали гуя...
 
Yarfrontend #2. Useful services
Yarfrontend #2. Useful servicesYarfrontend #2. Useful services
Yarfrontend #2. Useful services
 
Основы Git
Основы GitОсновы Git
Основы Git
 
Облачные технологии и виртуализация
Облачные технологии и виртуализацияОблачные технологии и виртуализация
Облачные технологии и виртуализация
 

JavaScript-модули "из прошлого в будущее"

  • 1. JavaScript-модули “Из прошлого в будущее” Константин Ершов, frontend meetup, Ярославль, 10.12.2014
  • 3.
  • 4. Что дает модульная система? ● Ограничение области видимости ● Реиспользование частей приложения ● Структуризация приложения ● Наглядный код
  • 5.
  • 6. Простейшие модули ● Разделение на файлы ● Паттерн с самовызывающейся ф-цией ● Глобальная область видимости
  • 7. //iMath.js (function(myNameSpace){ function square(x){ return x*x; } myNameSpace.iMath = { square: square }; }(window.myNamespace = window.myNamespace || {})) //main.js (function(){ alert(window.myNamespace.iMath.square(2)); }())
  • 8. Плюсы: - ограничение области видимости - это уже почти модули
  • 9. Плюсы: - ограничение области видимости - это уже почти модули Минусы: - нет поддержки зависимостей - для асинхронной загрузки модуля нужно реализовывать обертку - нужно следить за порядком загрузки модулей
  • 11. - подход к организации модулей, который определяет API, следуя которому можно организовать асинхронную загрузку модулей и их зависимостей. Asynchronous Module Definition (AMD)
  • 12. Краткие характеристики ● работает без eval() или этапа компиляции, за счет синтаксиса; ● предназначен для асинхронной загрузки; ● преимущественно используется на стороне клиента.
  • 13. define для определения модуля require для загрузки
  • 14. define - определение модуля define( [module_name] /*опционально*/, [dependencies] /*зависимости - опционально*/, definition /*функция инстанцирования модуля или объект*/ );
  • 15. define('iMath', function(){ function square(x){ return x*x; } return { square: square }; }); define('anotherModule', ['iMath'], function(iMath){ alert(iMath.square(2)); });
  • 16. require - загрузка модулей require( [modules] /*список модулей*/, callback /*функция вызываемая при успешной загрузке модулей*/ errback /*функция вызываемая при ошибке загрузки модулей*/ );
  • 17. require( ['anotherModule', 'yetAnotherModule'], function(aM, yAM){ //do something with modules }, function(error){ console.error(error); } );
  • 18. Система плагинов require(['tpl!main'], function(tplFn){ var html = tplFn(data); }); //плагин 'tpl!' define('tpl', ['templateEngine'], function(templateEngine){ return { load: function(name, parentRequire, onload, config){ parentRequire(['text!' + name], function(text){ onload(templateEngine.createTemplate(text)); }); } }; });
  • 19. Почему AMD - это лучший выбор для написания модульного js на клиенте? ● Имеет четкое представление о том как нужно подходить к определению гибких модулей. ● Значительно чище и безопасней, чем использование глобального нэймспейса ● Определение модуля инкапсулировано, что помогает избежать загрязнения глобальной области видимости. ● Работает лучше чем альтернативные решения (например CommonJS, который мы рассмотрим позже) ● Не имеет проблем с кросс-доменностью, отладкой. Не нуждается в инструменте на стороне сервера. Большенство загрузчиков AMD поддерживают загрузку модулей без процесса сборки. ● Обеспечивает подход «transport» для включения нескольких модулей в один файл. ● Поддерживает ленивую загрузку, если необходимо.
  • 20.
  • 22. CommonJS - рабочая группа, работающая над разработкой и стандартизацией JavaScript API. На сегодняшний день они работают над ратификацией стандарта для модулей и пакетов. Модули предложенные CommonJS определяют простой API для работы js на стороне сервера.
  • 23. Краткие характеристики: ● компактный синтаксис; ● предназначен для синхронной загрузки; ● преимущественно используется на стороне сервера.
  • 24. require для загрузки импортов exports для публикации частей модуля
  • 25. //iMath.js function square(x){ return x*x; } exports.square = square; //anotherModule.js var iMath = require('./iMath'); console.log(iMath.square(2));
  • 26. //iMath.js define('iMath', function(){ function square(x){ return x*x; } return { square: square }; }); //anotherModule.js define('anotherModule', ['iMath'], function(iMath){ alert(iMath.square(2)); });
  • 27. Подходит ли CommonJS для браузера?
  • 28. Общие модули для клиента и сервера ● Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: ○ curl.js - загрузчик модулей на клиенте ○ cajon - загрузчик разработанный поверх require.js
  • 29. Общие модули для клиента и сервера ● Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: ○ curl.js - загрузчик модулей на клиенте ○ cajon - загрузчик разработанный поверх require.js ● Использование Browserify, утилиты которая позволяет запускать любые node.js модули в браузере
  • 30. Общие модули для клиента и сервера ● Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: ○ curl.js - загрузчик модулей на клиенте ○ cajon - загрузчик разработанный поверх require.js ● Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере ● Использование на сервере node-require (AMD на клиенте и на сервере)
  • 31. Общие модули для клиента и сервера ● Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: ○ curl.js - загрузчик модулей на клиенте ○ cajon - загрузчик разработанный поверх require.js ● Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере ● Использование на сервере node-require (AMD на клиенте и на сервере) ● Использование оберток для модулей
  • 32. ES6
  • 33. Стандарт ES6 module состоит из двух частей: ● декларативный синтаксис (для импорта и экспорта); ● программной загрузки (чтобы задать конфигурацию загрузки модулей и для условной загрузки модулей).
  • 34. Экспорт let notExported = 'abc'; export function square(x) { return x * x; } export const MY_CONSTANT = 123;
  • 35. Импорт import { square } from './iMath'; console.log(square(3));
  • 36. Импорт import { square } from './iMath'; console.log(square(3)); import { square, MY_CONSTANT } from './iMath';
  • 37. Импорт import { square } from './iMath'; console.log(square(3)); import { square, MY_CONSTANT } from './iMath'; import './iMath' as c; console.log(c.square(3));
  • 38. Импорт import { square } from './iMath'; console.log(square(3)); import { square, MY_CONSTANT } from './iMath'; import './iMath' as c; console.log(c.square(3)); import { square as squ } from './iMath'; console.log(squ(3));
  • 39. Экспорт по умолчанию // myapp/models/Customer.js export default class { // анонимный класс constructor(id, name) { this.id = id; this.name = name; } };
  • 40. Экспорт по умолчанию // myapp/models/Customer.js export default class { // анонимный класс constructor(id, name) { this.id = id; this.name = name; } }; // myapp/myapp.js import Customer from 'models/Customer'; let c = new Customer(0, 'Jane');
  • 41. API программной загрузки Позволяет делать две вещи: ● настраивать загрузку модулей ● программно работать с модулями и скриптами
  • 42. Цепь загрузки и компиляции модуля
  • 43. normalize System.normalize = function(moduleName, options){ //преобразуем 'core!superLib' --> 'core/lib/superLib.coffee' return moduleName };
  • 44. resolve System.resolve = function(moduleName, options){ // преобразуем 'core/lib/superLib.coffee' --> // '/var/www/myProject/resources/core/lib/superLib.coffee' return moduleName };
  • 45. fetch System.fetch = function(url, options){ //читаем с диска или грузим через сеть };
  • 46. translate System.translate = function(source, options){ return CoffeeScript.translate(source); };
  • 47. link System.link = function(jsSource, options){ //можем вернуть объект, с зависимостями и колбэком //можем вернуть модуль //можем вернуть undefined тогда система решит, что мы загрузили // настоящий ES6 модуль и предоставит наружу все что он экспортирует };
  • 48. Используем модули ECMAScript 6 ● ES6 Module Transpiler: позволяет писать свои модули, используя некую часть стандарта ECMAScript 6 (грубо говоря, ECMAScript 5 + экспорт + импорт), и компилирует их в модули AMD или CommonJS. Статья Райана Флоренца (Ryan Florence) детально объясняет этот подход. ● ES6 Module Loader: позволяет использовать API загрузки модулей ECMAScript 6 в современных браузерах.
  • 49. Ещё: ● require-hm: плагин для RequireJS, позволяющий загружать модули ECMAScript 6 (только ECMAScript 5 + экспорт + импорт). Статья Каолана Макмахона (Caolan McMahon) объясняет, как он работает. Предупреждение: плагин использует более старый синтаксис. ● Traceur (компилятор ECMAScript 6 в ECMAScript 5): частично поддерживает модули, возможно, в конечном счете будет поддерживать их полностью. ● TypeScript TypeScript (грубо говоря, ECMAScript 6 и поддержка статической типизации): компилирует модули из внешних файлов (которые могут использовать большую часть ECMAScript 6) в AMD или CommonJS.
  • 50.
  • 52. Материалы ● Статья про es6 модули на frontender.info ● Варианты использования es6 модулей - Иегуда Кац(Yehuda Katz) ● Блог Эдди Османи(Addy Osmani) ● Статья “Путь js модуля” - Михаил Давыдов (Mikhail Davydov)

Editor's Notes

  1. Изначально, когда javascript был диковинкой и использовался в основном лишь для того чтобы запустить падающие снежинки на странице или слегка модифицировать некоторые элементы, ни о каких модулях и речи быть не могло. Просто напросто никому это было не нужно. Ведь весь js код на странице умещался максимум в 50 строк, использование модулей увеличило бы объем кода в разы.
  2. Но время бежит и сложность приложений растет в геометрической прогрессии. Раньше я и представить не мог что web страница может содержать !!!тысячи!!! строк кода. Как со всем этим управляться?
  3. Все зрелые языки программирования предоставляют систему модулей. Модули позволяют ограничить область видимости, позволяют реиспользовать части приложения, делают приложение более структурированным и вообще делают код нагляднее. В текущем стандарте языка JS нет модульной системы и разработчики дабы облегчить себе жизнь изобретают собственные системы модулей. Некоторые решения были приняты сообществом frontend разработчиков и получили широкое распостранение. Именно о таких решениях мы поговорим в первой части моего доклада.
  4. В текущем стандарте языка JS нет модульной системы и разработчики дабы облегчить себе жизнь изобретают собственные системы модулей. Некоторые решения были приняты сообществом frontend разработчиков и получили широкое распостранение. Именно о таких решениях мы поговорим в первой части моего доклада.
  5. Первое решение - разделение js код на файлы, в которых использовался паттерн с самовызывающейся функцией (для ограничения области видимости), связь между модулями обеспечивалась через глобальную область видимости с использованием единого нэймспейса.
  6. Рассмотрим пример
  7. Краткие характеристики: работает без eval() или этапа компиляции, за счет использования синтаксиса, который часто многим кажется сложным или избыточным; предназначен для асинхронной загрузки; преимущественно используется на стороне клиента. Это решение имеет ряд явных приемуществ, являясь одновременно асинхронным и очень гибким, снижая связанность и обеспечивая переиспользование кода. Многие разработчики с удовольствием пользуются им. Можно рассматриваь это как надежную стартовую площадку к модульной системе, предложенной в ES6.
  8. Два основных концепта, которые необходимо усвоить, что бы понять идею AMD. Это метод define - для определения модуля и метод require - для загрузки.
  9. Имя модуля - опциональный параметр и зачастую необходим только если используются не-AMD средства для склеивания модулей в один файл, т.к. в основном (за исключением случаев с использованием плагинов) имя модуля соостветствует его расположению в файловой системе. Вторым аргументом метода является массив зависимостей, необходимых для работы описываемого модуля. Третий аргумент - функция инициализации модуля.
  10. require в основном используется для загрузки модулей в корневом js файле (для старта системы) или для динамической загрузки внутри какого-либо модуля.
  11. С AMD есть возможность загружать ресурсы практически любого вида, включая текстовые файлы и HTML. Это позволяет иметь в зависимостях ваших компонентов html-шаблоны, которые могут быть использованы в качестве разметки. Так же это можно использовать как инструмент для динамичекого построения страниц.
  12. РЕЖЕТ ГЛАЗ ТУТ НУЖНО КОРОЧЕ ОПИСАТЬ ВСЕ
  13. На данный момент основными инструментоми для работы с AMD модулями являются библиотеки require.js и curl.js
  14. На верхнем уровне CommonJS модули имеют две основные составляющие. Это переменная exports, которая содержит объекты, которые модуль хочет сделать доступными для других модулей(которые модуль хочет экспортировать). И функция require, которая используется для импортирования других модулей.
  15. Вот пример CommonJS модуля. exports служит для публикации частей модуля require - для загрузки модулей. Рассказать про поиск модуля Давайте рассмотрим аналогичный пример, но написанный с помощью AMD
  16. Если на серверно стороне используется node.js , то такой вопрос возникает из-за потребностей использовать один и тот же код на клиенте и сервере, дабы избежать дублирования кода
  17. Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  18. Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  19. Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  20. Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  21. Целью модулей ECMAScript 6 (ES6) было создание формата, удобного как для пользователей CJS, так и для пользователей AMD. В связи с этим они имеют такой же компактный синтаксис, как и модули CJS. С другой стороны, они не такие динамичные (например, вы не сможете условно загрузить модуль с помощью обычного синтаксиса). Это дает два основных преимущества: на этапе компиляции вы получите ошибки, если попытаетесь импортировать что-то, что не было предварительно экспортировано; вы можете легко осуществить асинхронную загрузку модулей ES6.
  22. Стандарт ES6 module состоит из двух частей: декларативный синтаксис (для импорта и экспорта); программной загрузки (чтобы задать конфигурацию загрузки модулей и для условной загрузки модулей).
  23. Ключевое слово export, стоящее перед объявлением переменной (посредством var, let, const), функции или класса экспортирует их значение в остальные части программы. Рассмотрим пример. Этот модуль экспортирует функцию square и значение MY_CONSTANT.
  24. Наш модуль ссылается на iMath.js посредством идентификатора модуля — строки «./iMath». По умолчанию интерпретацией идентификатора модуля является относительный путь к импортируемому модулю.
  25. Обратите внимание, что, при необходимости, вы можете импортировать несколько значений:
  26. Вы также можете импортировать модуль как объект, значениями свойств которого будут экспортированные значения:
  27. Если вам неудобно использовать имена, определенные в экспортируемом модуле, вы можете переименовать их при импорте:
  28. Иногда модуль экспортирует только одно значение (большой класс, например). В таком случае удобно определить это значение как экспортируемое по умолчанию:
  29. Синтаксис импорта таких значений аналогичный обычному импорту без фигурных скобок (для простоты запоминания: вы не импортируете что-либо с модуля, а импортируете сам модуль):
  30. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  31. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  32. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  33. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  34. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  35. API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  36. Наверное утомил