Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

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

  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. Наверное утомил