Запустите код ES6 в терминале Bash с помощью Bash heredoc.

Код ES5 можно легко запустить с помощью Bash heredoc в терминале:

node <<HEREDOC
  var fs = require("fs");
  ...
HEREDOC

Но код ES6 не запускается, даже с правильным флагом --experimental-modules:

node --experimental-modules <<HEREDOC
  import fs from "fs";
  ...
HEREDOC

Показанная ошибка:

(node:4130) ExperimentalWarning: The ESM module loader is experimental.
[stdin]:1
import fs from "fs";
       ^^

SyntaxError: Unexpected identifier
    at new Script (vm.js:83:7)
    at createScript (vm.js:267:10)
    at Proxy.runInThisContext (vm.js:319:10)
    at Object.<anonymous> ([stdin]-wrapper:6:22)
    at Module._compile (internal/modules/cjs/loader.js:722:30)
    at evalScript (internal/bootstrap/node.js:670:27)
    at ReadStream.<anonymous> (internal/bootstrap/node.js:340:15)
    at ReadStream.emit (events.js:187:15)
    at endReadableNT (_stream_readable.js:1098:12)
    at process.internalTickCallback (internal/process/next_tick.js:72:19)

Это действительно показывает эту информацию "ExperimentalWarning: загрузчик модуля ESM является экспериментальным." Это означает, что Node.js работает правильно с функцией модуля ES6, однако importКлючевое слово просто не работает.

Как запустить встроенный код ES6 в терминале с помощью Bash heredoc? Я знаю, что могу написать код в файл для загрузки в качестве модуля ES6 в обычном режиме, но это короткий временный код, если он будет лучше в heredoc.

2 ответа

Решение

Изучив его, Node 11 вообще не поддерживает модули ES из stdin, если вы хотите использовать модули в Node 11, вам нужно поместить их в файл.

С Node 12 (в настоящее время не выпущен, но вы можете попробовать его, используя npm i -g node-nightly), вы можете использовать флаг --entry-type=module использовать стандартный ввод в качестве модуля.

С node-nightly следующие работали просто отлично:

node-nightly --experimental-modules --entry-type=module <<HEREDOC
  import fs from 'fs'
  console.log(fs)
HEREDOC

Редактировать:

Как отмечает @Jamesernator в комментариях, для ночных узлов от v13 используйте "--input-type" вместо "--entry-type".

И поддерживаются только встроенные модули, т.е. 'import' не сможет найти модули в локальном каталоге, а также не сможет найти глобальные модули, установленные с флагом '-g'. Связанная проблема: https://github.com/nodejs/node/issues/19570

Это отличный вопрос, который многому меня научил! Спасибо, что спросили. Вот что я узнал:

Прежде всего
Bred heredoc для узла - это все равно, что просто выполнить узел и затем ввести то, что было введено в теге heredoc.

IE

node --experimental-modules <<HEREDOC
  import fs from "fs";
  ...
HEREDOC

эквивалентно

node --experimental-modules
> import fs from "fs";

И выполнение такого узла открывает REPL от узла

Во-вторых, import синтаксис:

import fs from "fs"

Здесь нет fs в "fs", Это не проблема для вас сейчас, но если импорт прошел, он не найдет это в "fs" модуль. Вместо этого, то, что было бы правильным синтаксисом, было бы, например:

import { readFile } from "fs";

Это, однако, дает:

SyntaxError: Unexpected token {

Наконец, проблема заключается в том, что вся функция действительно экспериментальная.

Есть открытые вопросы по этому поводу:

Другие вопросы по тегам