Код 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.
@Jamesernator позволяет мне импортировать только встроенные модули, «npm i moment» не работает, «npm i -g moment» тоже не работает
Да, только встроенные модули работают со стандартного ввода. Есть открытая проблема с той же проблемой в REPL, вероятно, та же причина: github.com/nodejs/узел/проблемы/19570
Это отличный вопрос, который многому меня научил! Спасибо, что спросили. Вот что я узнал:
Прежде всего
Bash heredoc для узла похож на простое выполнение узла, а затем ввод всего, что было введено в теге heredoc.
т.е.
node --experimental-modules <<HEREDOC
import fs from "fs";
...
HEREDOC
эквивалентно
node --experimental-modules
> import fs from "fs";
И выполнение такого узла открывает РЕПЛ из узла
во-вторых, синтаксис import
:
import fs from "fs"
В fs
нет "fs"
. Это не проблема для вас сейчас, но если бы импорт прошел, он не нашел бы это в модуле "fs"
. Вместо этого правильный синтаксис был бы, например:
import { readFile } from "fs";
Это, однако, дает:
SyntaxError: Unexpected token {
Наконец, проблема в том, что вся фича действительно экспериментальная.
Есть открытые вопросы по этому поводу:
Просто обратите внимание, что в реализации Node и import fs from 'fs'
, и import * as fs from 'fs'
делают одно и то же, экспорт по умолчанию для встроенных модулей узла просто экспортирует весь модуль обратно.
@Adelin позволяет мне импортировать только встроенные модули, «npm i moment» не работает, «npm i -g moment» тоже не работает
Обновлять:
Начиная с Node.js 14, флаг --experimental-modules
больше не нужен, он уже по умолчанию в Node.js для файлов .mjs
, а также для heredoc, но --input-type
по-прежнему нужен в CLI, потому что ES5 или ES6 по-прежнему предполагается указывать для вот документ:
node --input-type module <<HEREDOC
//example:
import fs from "fs";
HEREDOC
Старое руководство:
Посмотрев на это, 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.info(fs);
HEREDOC
Редактировать:
Как отметил @Jamesernator в комментариях, для node-nightly из v13 используйте «--input-type» вместо «--entry-type».
Причем поддерживаются только встроенные модули, т.е. 'import' не сможет найти модули в локальном каталоге, а также не сможет найти глобальные модули, установленные с флагом '-g'. Связанная проблема: https://github.com/nodejs/node/issues/19570
этот node-nightly превосходен! спасибо
но последний node-nightly теперь НЕ ИМЕЕТ опции "--entry-type", проверено только что с помощью node-nightly v13.0.0-nightly2019042580c0b89bbb. Он показал эту ошибку: неверный вариант: --entry-type=module
Несколько дней назад он был переименован в --input-type. Вы можете просто использовать Node 12 сейчас, а не по ночам.
Это все еще может измениться, хотя это продолжается обсуждение: github.com/nodejs/modules/issues/312
спасибо, теперь я могу использовать --input-type, надеюсь, это больше не изменится.
он позволяет мне импортировать только встроенные модули, "npm i moment" не работает, "npm i -g moment" тоже не работает
--experimental-modules не поддерживает модули stdin (пока), это должно быть в Node 12. Вы можете попробовать использовать npmjs.com/package/esm, если вам действительно нужны модули ES.