Использование модулей ES с модулями CommonJS в Node.js

Это не является исчерпывающим обзором модулей ES и модулей CommonJS - я не буду вдаваться в подробности о том, что это за модули и как они работают. Скорее, он предназначен для выделения различий между модулями ES и модулями CommonJS и того, как вы можете использовать их вместе.

Это вторая часть из четырех частей.

  1. Три различия между требованием и импортом в Node.js
  2. Использование модулей ES с модулями CommonJS в Node.js
  3. Использование модулей ES с модулями CommonJS в браузере
  4. Использование модулей 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 файл.

  1. Вы можете использовать только import и export в модуле ES. В частности, это означает, что вы можете использовать только import и export в .mjs файле или в .js файле, если "type": "module".
    Cannot use import statement outside a module
    Unexpected token ‘export’
  2. Вы не можете использовать require в модуле ES, вы должны использовать import.
    ReferenceError: require is not defined
  3. Вы не можете использовать require для загрузки модуля ES.
    Error [ERR_REQUIRE_ESM]: Must use import to load ES Module

Итак, что работает?

  1. Модуль 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.

Ресурсы