Использование модулей ES с модулями CommonJS в Node.js
Это не является исчерпывающим обзором модулей ES и модулей CommonJS - я не буду вдаваться в подробности о том, что это за модули и как они работают. Скорее, он предназначен для выделения различий между модулями ES и модулями CommonJS и того, как вы можете использовать их вместе.
Это вторая часть из четырех частей.
- Три различия между требованием и импортом в Node.js
- Использование модулей ES с модулями CommonJS в Node.js
- Использование модулей ES с модулями CommonJS в браузере
- Использование модулей ES с модулями CommonJS с webpack
Ознакомьтесь с полными примерами кода здесь: https://github.com/arcticmatt/javascript_modules/tree/master/node.
Что такое модуль?
Модуль - это всего лишь один файл JavaScript.
package.json
“type
”поле
Это поле определяет, будут ли файлы JavaScript, то есть файлы, заканчивающиеся на .js
, обрабатываться как модули ES или модули CommonJS.
Пример
См. последнее поле. Допустимые значения:
"module"
"commonjs"
Если он не указан, неявно по умолчанию используется "commonjs"
.
{ "name": "es_module_playground", "version": "1.0.0", "description": "Testing ES Modules", "main": "module1.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "type": "commonjs" }
"commonjs"
Поведение
.cjs
файлы рассматриваются как модули CommonJS.js
файлы рассматриваются как модули CommonJS.mjs
файлы рассматриваются как модули ES
"module"
Поведение
.cjs
файлы рассматриваются как модули CommonJS.js
файлы рассматриваются как модули ES.mjs
файлы рассматриваются как модули ES
Как видите, разница в том, как обрабатываются .js
файлы.
Смешивание модулей ES и модулей CommonJS
Вот общие правила в отношении того, что не работает, с соответствующими ошибками. «Не работает» означает, что при запуске кода с node
из командной строки возникает ошибка.
Помните, что если "type": "module"
, то ES-модуль - это любой .js
или .mjs
файл. Если "type": "commonjs"
, то ES-модуль - это любой .mjs
файл.
- Вы можете использовать только
import
иexport
в модуле ES. В частности, это означает, что вы можете использовать толькоimport
иexport
в.mjs
файле или в.js
файле, если"type": "module"
.Cannot use import statement outside a module
Unexpected token ‘export’ - Вы не можете использовать
require
в модуле ES, вы должны использоватьimport
.ReferenceError: require is not defined
- Вы не можете использовать
require
для загрузки модуля ES.Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
Итак, что работает?
- Модуль ES может импортировать экспорт из модуля CommonJS. Что касается микширования, то все.
Например, если "type": "commonjs"
, то этот пример работает, т.е. node module1.mjs
будет работать без ошибок.
// module1.mjs console.log("require module1"); import obj from "./module2.js"; console.log(`module2 = ${obj.module2}`); // module2.js console.log("require module2"); exports.module2 = "require module2";
Если "type": "module"
, то этот пример работает, т.е. node module1
будет работать без ошибок.
// module1.js console.log("require module1"); import obj from "./module2.cjs"; console.log(`module2 = ${obj.module2}`); // module2.cjs console.log("require module2"); exports.module2 = "require module2";
Напоминаем, что полные примеры кода для этих правил можно найти здесь: https://github.com/arcticmatt/javascript_modules/tree/master/node.