SlideShare a Scribd company logo
JavaScript-модули
“Из прошлого в будущее”
Константин Ершов,
frontend meetup, Ярославль, 10.12.2014
Начало...
● легкая модификация DOM
● 50 строк кода
JavaScript-модули "из прошлого в будущее"
Что дает модульная система?
● Ограничение области видимости
● Реиспользование частей приложения
● Структуризация приложения
● Наглядный код
JavaScript-модули "из прошлого в будущее"
Простейшие модули
● Разделение на файлы
● Паттерн с самовызывающейся ф-цией
● Глобальная область видимости
//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» для включения нескольких модулей в один файл.
● Поддерживает ленивую загрузку, если необходимо.
JavaScript-модули "из прошлого в будущее"
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.
JavaScript-модули "из прошлого в будущее"
Вопросы?
Материалы
● Статья про es6 модули на frontender.info
● Варианты использования es6 модулей - Иегуда Кац(Yehuda Katz)
● Блог Эдди Османи(Addy Osmani)
● Статья “Путь js модуля” - Михаил Давыдов (Mikhail Davydov)

More Related Content

PDF
RequireJS і Magento 2
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
PPTX
Webpack integration
PDF
IT-инфраструктура. FAQ для разработчика
PPTX
RAD на Java: как устроена CUBA Platform?
PDF
non-blocking java script
PDF
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
PDF
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
RequireJS і Magento 2
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
Webpack integration
IT-инфраструктура. FAQ для разработчика
RAD на Java: как устроена CUBA Platform?
non-blocking java script
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...

What's hot (20)

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

Viewers also liked (17)

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

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

PDF
Frontend: Путешествие в мир модульных загрузчиков
PDF
Внутреннее устройство и оптимизация бандла webpack
PDF
Modules and assembling of JavaScript (in russian)
PDF
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
PDF
Современный фронтенд -- как не утонуть в море хайпа?
PDF
webpack: 7 бед - один ответ
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
JS Lab2017_Сергей Селецкий_System.js и jspm
PDF
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
PDF
Webpack для самых маленьких | Odessa Frontend Meetup #5
PPTX
What do you MEAN? или введение в Fullstack JavaScript
PDF
Современный фронтенд за 30 минут.
PPTX
Node JS проблемы надежности, и пути их решения
PDF
Introduction in Node.js (in russian)
PDF
Node.js Меньше сложности, больше надежности Holy.js 2021
PDF
Сергей Константинов — Что интересного готовит нам W3C
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PPT
Типичный стек технологий для использования с Node.js
PDF
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Frontend: Путешествие в мир модульных загрузчиков
Внутреннее устройство и оптимизация бандла webpack
Modules and assembling of JavaScript (in russian)
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Современный фронтенд -- как не утонуть в море хайпа?
webpack: 7 бед - один ответ
Node.js введение в технологию, КПИ #ITmeetingKPI
JS Lab2017_Сергей Селецкий_System.js и jspm
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Webpack для самых маленьких | Odessa Frontend Meetup #5
What do you MEAN? или введение в Fullstack JavaScript
Современный фронтенд за 30 минут.
Node JS проблемы надежности, и пути их решения
Introduction in Node.js (in russian)
Node.js Меньше сложности, больше надежности Holy.js 2021
Сергей Константинов — Что интересного готовит нам W3C
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
Типичный стек технологий для использования с Node.js
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"

More from oelifantiev (8)

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

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

  • 1. JavaScript-модули “Из прошлого в будущее” Константин Ершов, frontend meetup, Ярославль, 10.12.2014
  • 4. Что дает модульная система? ● Ограничение области видимости ● Реиспользование частей приложения ● Структуризация приложения ● Наглядный код
  • 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» для включения нескольких модулей в один файл. ● Поддерживает ленивую загрузку, если необходимо.
  • 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.
  • 52. Материалы ● Статья про es6 модули на frontender.info ● Варианты использования es6 модулей - Иегуда Кац(Yehuda Katz) ● Блог Эдди Османи(Addy Osmani) ● Статья “Путь js модуля” - Михаил Давыдов (Mikhail Davydov)

Editor's Notes

  • #3: Изначально, когда javascript был диковинкой и использовался в основном лишь для того чтобы запустить падающие снежинки на странице или слегка модифицировать некоторые элементы, ни о каких модулях и речи быть не могло. Просто напросто никому это было не нужно. Ведь весь js код на странице умещался максимум в 50 строк, использование модулей увеличило бы объем кода в разы.
  • #4: Но время бежит и сложность приложений растет в геометрической прогрессии. Раньше я и представить не мог что web страница может содержать !!!тысячи!!! строк кода. Как со всем этим управляться?
  • #5: Все зрелые языки программирования предоставляют систему модулей. Модули позволяют ограничить область видимости, позволяют реиспользовать части приложения, делают приложение более структурированным и вообще делают код нагляднее. В текущем стандарте языка JS нет модульной системы и разработчики дабы облегчить себе жизнь изобретают собственные системы модулей. Некоторые решения были приняты сообществом frontend разработчиков и получили широкое распостранение. Именно о таких решениях мы поговорим в первой части моего доклада.
  • #6: В текущем стандарте языка JS нет модульной системы и разработчики дабы облегчить себе жизнь изобретают собственные системы модулей. Некоторые решения были приняты сообществом frontend разработчиков и получили широкое распостранение. Именно о таких решениях мы поговорим в первой части моего доклада.
  • #7: Первое решение - разделение js код на файлы, в которых использовался паттерн с самовызывающейся функцией (для ограничения области видимости), связь между модулями обеспечивалась через глобальную область видимости с использованием единого нэймспейса.
  • #8: Рассмотрим пример
  • #13: Краткие характеристики: работает без eval() или этапа компиляции, за счет использования синтаксиса, который часто многим кажется сложным или избыточным; предназначен для асинхронной загрузки; преимущественно используется на стороне клиента. Это решение имеет ряд явных приемуществ, являясь одновременно асинхронным и очень гибким, снижая связанность и обеспечивая переиспользование кода. Многие разработчики с удовольствием пользуются им. Можно рассматриваь это как надежную стартовую площадку к модульной системе, предложенной в ES6.
  • #14: Два основных концепта, которые необходимо усвоить, что бы понять идею AMD. Это метод define - для определения модуля и метод require - для загрузки.
  • #15: Имя модуля - опциональный параметр и зачастую необходим только если используются не-AMD средства для склеивания модулей в один файл, т.к. в основном (за исключением случаев с использованием плагинов) имя модуля соостветствует его расположению в файловой системе. Вторым аргументом метода является массив зависимостей, необходимых для работы описываемого модуля. Третий аргумент - функция инициализации модуля.
  • #17: require в основном используется для загрузки модулей в корневом js файле (для старта системы) или для динамической загрузки внутри какого-либо модуля.
  • #19: С AMD есть возможность загружать ресурсы практически любого вида, включая текстовые файлы и HTML. Это позволяет иметь в зависимостях ваших компонентов html-шаблоны, которые могут быть использованы в качестве разметки. Так же это можно использовать как инструмент для динамичекого построения страниц.
  • #20: РЕЖЕТ ГЛАЗ ТУТ НУЖНО КОРОЧЕ ОПИСАТЬ ВСЕ
  • #21: На данный момент основными инструментоми для работы с AMD модулями являются библиотеки require.js и curl.js
  • #25: На верхнем уровне CommonJS модули имеют две основные составляющие. Это переменная exports, которая содержит объекты, которые модуль хочет сделать доступными для других модулей(которые модуль хочет экспортировать). И функция require, которая используется для импортирования других модулей.
  • #26: Вот пример CommonJS модуля. exports служит для публикации частей модуля require - для загрузки модулей. Рассказать про поиск модуля Давайте рассмотрим аналогичный пример, но написанный с помощью AMD
  • #28: Если на серверно стороне используется node.js , то такой вопрос возникает из-за потребностей использовать один и тот же код на клиенте и сервере, дабы избежать дублирования кода
  • #29: Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  • #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: Есть несколько путей решения задачи использования одного и того же кода на сервере и клиенте Загрузчики и фреймворки поддерживащие CommonJS модули в браузере: curl.js - загрузчик модулей на клиенте cajon - загрузчик разработанный поверх require.js Использование Browserify, утилиты которая позволяет запускать дюбые node.js модули в браузере Использование на сервере node-require (AMD на клиенте и на сервере) Использование оберток для модулей
  • #33: Целью модулей ECMAScript 6 (ES6) было создание формата, удобного как для пользователей CJS, так и для пользователей AMD. В связи с этим они имеют такой же компактный синтаксис, как и модули CJS. С другой стороны, они не такие динамичные (например, вы не сможете условно загрузить модуль с помощью обычного синтаксиса). Это дает два основных преимущества: на этапе компиляции вы получите ошибки, если попытаетесь импортировать что-то, что не было предварительно экспортировано; вы можете легко осуществить асинхронную загрузку модулей ES6.
  • #34: Стандарт ES6 module состоит из двух частей: декларативный синтаксис (для импорта и экспорта); программной загрузки (чтобы задать конфигурацию загрузки модулей и для условной загрузки модулей).
  • #35: Ключевое слово export, стоящее перед объявлением переменной (посредством var, let, const), функции или класса экспортирует их значение в остальные части программы. Рассмотрим пример. Этот модуль экспортирует функцию square и значение MY_CONSTANT.
  • #36: Наш модуль ссылается на iMath.js посредством идентификатора модуля — строки «./iMath». По умолчанию интерпретацией идентификатора модуля является относительный путь к импортируемому модулю.
  • #37: Обратите внимание, что, при необходимости, вы можете импортировать несколько значений:
  • #38: Вы также можете импортировать модуль как объект, значениями свойств которого будут экспортированные значения:
  • #39: Если вам неудобно использовать имена, определенные в экспортируемом модуле, вы можете переименовать их при импорте:
  • #40: Иногда модуль экспортирует только одно значение (большой класс, например). В таком случае удобно определить это значение как экспортируемое по умолчанию:
  • #41: Синтаксис импорта таких значений аналогичный обычному импорту без фигурных скобок (для простоты запоминания: вы не импортируете что-либо с модуля, а импортируете сам модуль):
  • #43: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #44: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #45: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #46: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #47: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #48: API загрузки модулей предоставляет очень гибкую настройку загрузку модулей. Таким образом можно расширить базовый функционал загрузки и компиляции модулей. Вот несколько настройка отображения идентификатора модуля; проверка валидности модуля при импорте (к примеру, посредством KSLint или JSHint); автоматическая трансляция модулей при импорте (они могут содержать код CoffeeScript или TypeScript); использовать существующие модули (AMD, Node.js). Вы должны сами реализовать эти вещи.
  • #51: Наверное утомил