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)

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

  • 1.
    JavaScript-модули “Из прошлого вбудущее” Константин Ершов, frontend meetup, Ярославль, 10.12.2014
  • 2.
  • 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.
    Плюсы: - ограничение областивидимости - это уже почти модули Минусы: - нет поддержки зависимостей - для асинхронной загрузки модуля нужно реализовывать обертку - нужно следить за порядком загрузки модулей
  • 10.
  • 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){ returnx*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){ //dosomething with modules }, function(error){ console.error(error); } );
  • 18.
    Система плагинов require(['tpl!main'], function(tplFn){ varhtml = 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» для включения нескольких модулей в один файл. ● Поддерживает ленивую загрузку, если необходимо.
  • 21.
  • 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){ returnx*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.
  • 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.
    Используем модули ECMAScript6 ● 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.
  • 51.
  • 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 Наверное утомил