Итак, после предыдущего поста возник закономерный вопрос:
Как вообще уживаются вместе
.cjs, .mjs и .js файлы в одном проекте? 🤔 Почему где-то используется
require, а где-то import? И что за магия в поле "type" в package.json — обязательно ли его указывать?💡 Давайте разбираться!
---
📚 Для начала предлагаю погрузиться чуть в документацию:
https://nodejs.org/api/packages.html#type
Вот краткая выжимка:
🔹 Тип:
string 🔹 Поле
"type" в package.json определяет, как Node.js будет трактовать .js файлы:-
"type": "module" — .js файлы считаются ES-модулями-
"type": "commonjs" или поле отсутствует — .js файлы считаются CommonJS(независимо от значения
"type")-
.mjs — всегда ES-модуль -
.cjs — всегда CommonJS ---
🧐 Если заглянете в
package.json вашего проекта — скорее всего, поля "type" там нет. А в конфиге, например, Webpack’а — увидите привычный
require и module.exports, то есть commonjs.Но при этом в самом приложении вы спокойно пишете
import/export (es-modules) — и всё работает 🎉Почему так?
Потому что Webpack сам умеет разбирать модули. Он не зависит от
"type" в package.json и прекрасно парсит как import, так и require, по-своему собирая ваш код.---
🔧 То есть:
- Конфиги (которые запускает Node.js напрямую) — требуют правильного формата (
.cjs, .mjs, или "type").- Код внутри фронта — обрабатывается Webpack’ом, и на поле
"type" ему все равно.---
Вот и вся магия 💫