Как импортировать модуль ES в Node.js REPL? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть модуль ES6 right.mjs.Выполнение его в качестве параметра для node работает хорошо:

$ node --version
v8.10.0
$ node --experimental-modules right.mjs
(node:4492) ExperimentalWarning: The ESM module loader is experimental.
executing right module

executing right module - это выход модуля.

В отличие от этого, следующий вход в REPL ожидаетдальнейший ввод:

$ node --experimental-modules
> (node:4526) ExperimentalWarning: The ESM module loader is experimental.

> import 'right.mjs';
... 

Я не понимаю, почему.

То же самое с:

> import './right.mjs';
... 

Попытка require приводит к:

> require('./right.mjs');
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/xxx/right.mjs
    at Object.Module._extensions..mjs (module.js:686:11)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)

Итак, как импортировать модуль ES в Node.js REPL?

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Не совсем то, о чем спрашивали (на самом деле не REPL), но (используя node 12.6.0), можно выполнить код ESM из командной строки через --eval:

  1. Сначала, есливаши модули ES имеют расширение .js вместо .mjs, поместите "type": "module" в package.json (см. https://nodejs.org/api/esm.html#esm_enabling), чтобы разрешить узлу обрабатывать JS-файлы как модули
  2. Run node --experimental-modules --input-type=module --eval 'code here'

Вы можете использовать псевдоним как esmeval, например:

alias esmeval='node --experimental-modules --input-type=module --eval'

И затем вы можете использовать его как:

esmeval 'import { method } from "./path/to/utils.js"; console.log(method("param"))'

Если вы еще не можете использовать узел 12 в качестве основной версии, но можете установить при помощи nvm, укажите псевдоним установки v12:

alias esmeval='/c/software/nvm/v12.6.0/node.exe --experimental-modules --input-type=module --eval'

0 голосов
/ 20 февраля 2019

В настоящее время это невозможно.Предполагается, что модули ES импортируются из области действия модуля ES, а REPL не считается таковым.Это может улучшиться со временем, потому что поддержка модулей ES является экспериментальной.Использование require и import является взаимоисключающим в реализации модуля Node, REPL уже использует require.

. Поддержка динамического import ожидается в REPL, это не такпока поддерживается , последний выпуск узла 11 вызывает ошибку:

TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: динамический обратный вызов импорта не указан.

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