Модули и загрузчики модулей
Модуль - это просто файл JavaScript, написанный с использованием синтаксиса модуля. Модули экспортируют значения, которые затем могут быть импортированы другими модулями.
Файлы JavaScript CommonJS и AMD являются модулями.
Загрузчик модулей позволяет динамически загружать модули, а также отслеживает все загруженные модули в реестре модулей.
Обычно в производственной среде реестр модулей заполняется исходным скомпилированным набором модулей. Позже в состоянии страницы может потребоваться динамическая загрузка нового модуля. Затем этот модуль может совместно использовать зависимости с исходным пакетом страниц без необходимости перезагружать какие-либо зависимости.
Код модуля обрабатывается иначе, чем скрипты, из-за природы экспорта и импорта. Вот почему тег ‹script type =” module ”› введен, чтобы отличать код сценария от кода модуля.
Имена модулей и baseURL
Имена модулей аналогичны идентификаторам модулей в RequireJS. Неотносительные имена модулей (не начинающиеся с.) Преобразуются в URL по следующему правилу:
URL = absolutePath(baseURL, ModuleName + '.js')
Относительные имена модулей могут быть записаны как «./local-module» для загрузки относительно имени их родительского модуля. .. Синтаксис также поддерживается, что позволяет легко переносить модули.
Синтаксис модуля ES6
Экспорт
Синтаксис модуля ES6 больше всего похож на шаблон exports.method = function () {} в NodeJS для создания нескольких именованных экспортов.
В CommonJS можно написать:
exports.someMethod = function() { }; exports.another = {};
В ES6 такой же код будет написан:
exporter.js:
export function someMethod() { } export var another = {};
Обратите внимание, что имя функции, класса или переменной используется как имя экспорта.
Импорт
При импорте мы импортируем любые нужные нам объекты экспорта по имени, а также можем переименовать их:
importer.js:
import { someMethod, another as newName } from './exporter'; someMethod(); typeof newName == 'object';
Импорт и экспорт по умолчанию
Иногда вообще не хочется писать имя импорта. Для этого мы можем использовать экспорт по умолчанию:
экспорт-default.js:
export default function foo() { console.log('foo'); }
import-default.js:
import customName from './export-default'; customName(); // -> 'foo'
Весь поддерживаемый синтаксис
Существует несколько других вариантов синтаксиса модуля, полный список поддерживаемых операторов приведен ниже.
import 'jquery'; // import a module without any import bindings import $ from 'jquery'; // import the default export of a module import { $ } from 'jquery'; // import a named export of a module import { $ as jQuery } from 'jquery'; // import a named export to a different name export var x = 42; // export a named variable export function foo() {}; // export a named function export default 42; // export the default export export default function foo() {}; // export the default export as a function export { encrypt }; // export an existing variable export { decrypt as dec }; // export a variable as a new name export { encrypt as en } from 'crypto'; // export an export from another module export * from 'crypto'; // export all exports from another module import * as crypto from 'crypto'; // import an entire module instance object
Обратите внимание, что любое действительное объявление можно экспортировать. В ES6 это включает class (как в примере выше), const и let.