Общие модули JS:
- Синхронная загрузка: модули загружаются синхронно с помощью метода require().
- Динамический импорт: может при определенных условиях требовать модули во время выполнения.
- Кэширование на основе файлов: модули кэшируются после первой загрузки для повышения производительности.
- Циркулярные зависимости: обрабатывает циклические ссылки посредством частичного экспорта.
- Разрешение во время выполнения: пути к модулям разрешаются во время выполнения.
- Переменные верхнего уровня:
__dirname
,
__filename
,
module
,
exports
доступный
- Изменяемый экспорт: можно изменять экспортированные объекты после загрузки.
ES-модули (ESM):
- Статическая структура: операторы импорта/экспорта должны находиться на верхнем уровне.
- Асинхронная загрузка: модули по умолчанию загружаются асинхронно.
- Анализ во время компиляции: зависимости разрешаются перед выполнением.
- Неизменяемые привязки: импортированные значения доступны только для чтения.
- Строгий режим: всегда выполняется в строгом режиме.
- Нет переменных верхнего уровня: нет доступа к переменным, специфичным для CommonJS.
- Встряхивание деревьев: улучшенная поддержка устранения мертвого кода.
Ключевые отличия:
- Механизм загрузки: синхронный CommonJS и асинхронный ESM
- Синтаксис: require/module.exports vs import/export.
- Поднятие: импорт ESM поднимается, требования CommonJS — нет.
- Область: ESM имеет собственную область действия модуля, CommonJS использует глобальные переменные Node.js.
- Взаимодействие: ESM может импортировать CommonJS, но с ограничениями.
- Расширения файлов: для ESM требуется расширение .mjs или «тип»: «модуль» в package.json.
Итог
Ключевой вывод для интервью: Опишите различия между модулями commonjs и es в Node.js.