Обзор
До ES6 для реализации модульности использовались RequireJS или seaJS (это библиотеки модульности, основанные на спецификации AMD и спецификации CMD соответственно).
ES6 ввёл модульность с философией проектирования, заключающейся в определении зависимостей модулей и входных/выходных переменных на этапе компиляции.
Модульность ES6 делится на два модуля: export (@) и import.
Особенности
Модули ES6 автоматически включают строгий режим, независимо от того, добавляете ли вы его в начале модуля.use strict;。
Модули могут импортировать и экспортировать различные типы переменных, такие как функции, объекты, строки, числа, логические значения, классы и т. д.
Каждый модуль имеет собственный контекст. Переменные, объявленные в каждом модуле, являются локальными переменными и не загрязняют глобальную область видимости.
Каждый модуль загружается только один раз (он является синглтоном). Если тот же файл в том же каталоге загружается снова, он читается напрямую из памяти.
export и import
Базовое использование
Модули импортируют и экспортируют различные типы переменных, такие как строки, числа, функции и классы.
- Экспортируемые объявления функций и объявления классов должны иметь имена (команда export default рассматривается отдельно).
- Экспортировать можно не только объявления, но и ссылки (например, функции).
- Команда export может появляться в любом месте модуля, но она должна находиться на верхнем уровне модуля.
- Команда import поднимается в начало всего модуля и выполняется первой.
Рекомендуется использовать фигурные скобки, чтобы указать набор экспортируемых переменных, записанный в конце документа, для четкого определения экспортируемых интерфейсов.
И функции, и классы нуждаются в соответствующих именах. Экспорт в конце документа также позволяет избежать отсутствия соответствующих имен.
Использование as
Имена интерфейсов, экспортируемые командой export, должны иметь взаимно однозначное соответствие с переменными внутри модуля.
Имена импортируемых переменных должны совпадать с именами экспортируемых интерфейсов; порядок может быть другим.
Когда имена интерфейсов, экспортируемые разными модулями, дублируются, используйте as для переопределения имён переменных.
Особенности команды import
Свойство только для чтения: В скрипте, который загружает модуль, не разрешается перезаписывать ссылку на интерфейс. То есть можно изменять значения свойств импортированных переменных, имеющих объектный тип, но нельзя изменять значения импортированных переменных, имеющих примитивный тип.
Шаблон Singleton: Выполнение одного и того же оператора import несколько раз приведёт к выполнению только один раз, а не несколько. Импорт одного и того же модуля и объявление разных ссылок на интерфейс объявит соответствующие переменные, но импорт выполнится только один раз.
Особенность статического выполнения: import выполняется статически, поэтому выражения и переменные не могут использоваться.
Команда export default
- В файле или модуле может быть несколько операторов export и import, но только один export default.
- В export default, default — это соответствующая экспортируемая переменная интерфейса.
- При экспорте с помощью export необходимо добавлять { } при импорте; export default этого не требует.
- Члены, предоставляемые export default, можно принимать с помощью любой переменной.
Комбинированное использование
Примечание: import() — это предложение; мы пока не будем подробно на нём останавливаться.
export и import можно использовать в одном модуле со следующими особенностями:
- Можно переименовывать экспортируемые интерфейсы, включая default.
- Совмещение export и import также может экспортировать всё; интерфейсы, экспортируемые текущим модулем, переопределят унаследованные экспорты.