Запустите код 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 {
Наконец, проблема заключается в том, что вся функция действительно экспериментальная.
Есть открытые вопросы по этому поводу: