Почему нельзя использовать оба экспорта require ('foo') и ECMAScript в одном проекте? - PullRequest
0 голосов
/ 05 августа 2020

Просто набираю скорость с JavaScript, и я сталкиваюсь с проблемой, которую не могу объяснить. Я просто пытаюсь понять различные варианты импорта.

У меня есть:

main.js
utils.js
package.json

utils. js

// this is simply an exemple from the node.js docs
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question("What is your name ? ", function(name) {
    rl.question("Where do you live ? ", function(country) {
        console.log(`${name}, is a citizen of ${country}`);
        rl.close();
    });
});
export {rl}

package. json

{
  "name": "sandbox",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
   "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-preset-env": "^1.7.0",
    "babel-register": "^6.26.0"
  }
}

main. js

import {rl} from './utils.js'

// do stuff with rl, but the import fails

С кодом, как указано выше, require(...) is not defined, если я пытаюсь запустить utils. js напрямую. Мне нужно удалить оператор экспорта & "type": "module". Если я переименую utils. js в utils.m js, я получаю «require is not defined». Таким образом, я не могу одновременно требовать (...) и использовать экспорт.

Если я запускаю main. js, тогда он говорит, что utils. js не предоставляет экспорт с именем rl (но это так!).

Почему синтаксис "type": "module" & require (...) не может сосуществовать? Если я использую пакет, который уже использует синтаксис require (), значит ли это, что остальная часть моего проекта не может использовать экспорт ECMAScript?

1 Ответ

2 голосов
/ 05 августа 2020

Почему синтаксис "type": "module" & require (...) не может сосуществовать?

Они могут . В модуле ESM (синтаксис JavaScript import / export) вы можете импортировать из модуля CJS (более старая модульная система Common JS). Вы также можете использовать createRequire, если вам нужны функции, которые не доступны иным образом (например, импорт JSON).

Если я использую пакет, который уже использует синтаксис require (), значит ли это, что остальная часть моего проекта не может использовать экспорт ecmascript?

Нет, это все еще возможно, хотя жизнь намного проще, если вы полностью конвертируете в ESM (или вообще не используйте ESM - например, если вы избегаете использовать оба сразу). Параметр type в ближайшем package.json определяет, использует ли что-то импортируемое ESM или CJS по умолчанию. Вы могли бы (например) иметь каталог для старых вещей с минимальным package.json в нем, который имеет "type": "commonjs", в то время как ваш основной package.json проекта имеет "type": "module".

project_root/
+ package.json w/"type": "module"
+ foo.js - ESM module
+ bar.js - ESM module
+ legacy/
  + package.json w/"type": "commonjs"
  + baz.js - CJS module

В качестве альтернативы вы может иметь "type": "commonjs" (или вообще не type) в вашем основном package.json и использовать расширение файла .mjs в ваших модулях ESM. (Я не фанат этого, но Node.js поддерживает это.)

Подробнее в Node.js документации ESM .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...