Модули в ES Modules работают на основе статического анализа импортов и экспортов. Браузер или среда выполнения парсит JavaScript-файлы, определяет зависимости между модулями до выполнения кода и создает граф зависимостей.
Принципы работы:
- Статический анализ: Импорты и экспорты определяются до выполнения кода, что позволяет оптимизировать загрузку и выявлять ошибки на ранних стадиях.
- Однозначное связывание: Каждый импорт связывается с конкретным экспортом в другом модуле.
- Одиночный экземпляр: Модуль выполняется лишь один раз при первом импорте. Все последующие импорты получают ссылку на тот же экземпляр.
Жизненный цикл модуля:
- Конструирование: Парсится исходный код модуля, выявляются импорты и экспорты. Создается оболочка модуля.
- Загрузка: Загружаются все импортируемые модули. Если зависимость не кеширована, происходит запрос к сети или файловой системе.
- Связывание: Связываются импорты и экспорты. Переменные и функции из импортируемых модулей становятся доступны для использования. Если импорт не может быть разрешен, выбрасывается ошибка.
- Выполнение: Выполняется код модуля. Все экспортируемые значения становятся доступны для импортирующих модулей.
Примеры:
javascript
javascript
Отличия от CommonJS:
| Особенность | ES Modules | CommonJS |
|---|
| Связывание | Статическое | Динамическое |
| Загрузка | Асинхронная (в браузере) | Синхронная (по умолчанию) |
| Экспорт | export ключевое слово | module.exports |
| Импорт | import ключевое слово | require функция |
| Использование | В браузере и Node.js (экспериментально) | В Node.js |