ES6 - модули
Поговорим о ECMAScript 2015
Предыдущий
Обзор
Сегодня у нас есть несколько способов создавать модули, экспортировать и импортировать их. В JavaScript пока нет встроенного загрузчика модулей. Грядущий стандарт ECMAScript 2015 дает нам повод сделать людей счастливыми. Наконец-то ;)
У нас есть стандарты сторонних производителей: CommonJS и AMD. Самые популярные, но, к сожалению, несовместимые стандарты для загрузчиков модулей.
CommonJS известен от Node.js. Он в основном предназначен для серверов и поддерживает синхронную загрузку. Он также имеет компактный синтаксис, ориентированный на ключевые слова export и require.
AMD и самая популярная реализация - RequireJS предназначены для браузеров. AMD поддерживает асинхронную загрузку, но имеет более сложный синтаксис, чем CommonJS.
Целью ES6 было (было) смешать эти два стандарта и сделать счастливыми обе группы пользователей.
ES6 дает нам простой синтаксис и поддержку асинхронной и настраиваемой загрузки модулей.
Асинхронная модель - код не выполняется, пока запрошенные модули не будут доступны и обработаны.
Именованный экспорт
Модули могут экспортировать несколько объектов, которые могут быть простыми переменными или функциями.
export function multiply (x, y) { return x * y; };
Мы также можем экспортировать функцию, хранящуюся в переменной, но мы должны заключить переменную в фигурные скобки.
var multiply = function (x, y) { return x * y; }; export { multiply };
Мы даже можем экспортировать много объектов и, как в приведенном выше примере - мы должны заключить экспортированные операторы в набор фигурных скобок, если мы используем одно ключевое слово экспорта.
export hello = 'Hello World'; export function multiply (x, y) { return x * y; }; // === OR === var hello = 'Hello World', multiply = function (x, y) { return x * y; }; export { hello, multiply };
Давайте представим, что у нас есть файл modules.js со всеми экспортированными операторами. Чтобы импортировать их в другой файл (в том же каталоге), мы используем синтаксис… import {..} from ..:
import { hello } from 'modules';
Мы можем опустить расширение .js, как и в CommonJS и AMD.
Мы даже можем импортировать множество операторов:
import { hello, multiply } from 'modules';
Импорт также может иметь псевдоним:
import { multiply as pow2 } from 'modules';
.. и используйте подстановочный знак (*) для импорта всех экспортированных состояний:
import * from 'modules';
Экспорт по умолчанию
В нашем модуле у нас может быть много именованных экспортов, но также может быть экспорт по умолчанию. Это потому, что наш модуль может быть большой библиотекой, и при экспорте по умолчанию мы можем импортировать тогда весь модуль. Это также может быть полезно, когда наш модуль имеет одно значение или модель (класс / конструктор).
Один экспорт по умолчанию на модуль.
export default function (x, y) { return x * y; };
На этот раз нам не нужно использовать фигурные скобки для импорта, и у нас есть возможность назвать импортированный оператор по своему усмотрению.
import multiply from 'modules'; // === OR === import pow2 from 'modules'; // === OR === ...
Модуль может иметь как именованный экспорт, так и экспорт по умолчанию.
// modules.js export hello = 'Hello World'; export default function (x, y) { return x * y; }; // app.js import pow2, { hello } from 'modules';
Экспорт по умолчанию - это просто именованный экспорт со специальным именем по умолчанию.
// modules.js export default function (x, y) { return x * y; }; // app.js import { default } from 'modules';
API
Кроме того, есть программный API, который позволяет:
- Программно работать с модулями и скриптами
- Настроить загрузку модуля
SystemJS - универсальный загрузчик динамических модулей - загружает модули ES6, AMD, CommonJS и глобальные скрипты в браузере и на NodeJS. Работает как с Traceur, так и с Babel.
Загрузчик модулей должен поддерживать:
- Динамическая загрузка
- Изоляция глобального пространства имен
- Вложенная виртуализация
- Крючки для компиляции
Следующий
Нравится? Рекомендую!
Вся серия также доступна в виде электронной книги. Я опубликовал это на Leanpub.com
Будущее светлое!