Запустите код 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.

--experimental-modules не поддерживает модули stdin (пока), это должно быть в Node 12. Вы можете попробовать использовать npmjs.com/package/esm, если вам действительно нужны модули ES.

Jamesernator 08.04.2019 09:58

@Jamesernator позволяет мне импортировать только встроенные модули, «npm i moment» не работает, «npm i -g moment» тоже не работает

Dee 23.05.2019 09:36

Да, только встроенные модули работают со стандартного ввода. Есть открытая проблема с той же проблемой в REPL, вероятно, та же причина: github.com/nodejs/узел/проблемы/19570

Jamesernator 24.05.2019 06:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
824
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Прежде всего
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' делают одно и то же, экспорт по умолчанию для встроенных модулей узла просто экспортирует весь модуль обратно.

Jamesernator 08.04.2019 10:16

@Adelin позволяет мне импортировать только встроенные модули, «npm i moment» не работает, «npm i -g moment» тоже не работает

Dee 23.05.2019 09:37
Ответ принят как подходящий

Обновлять:
Начиная с 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 превосходен! спасибо

Dee 10.04.2019 12:40

но последний node-nightly теперь НЕ ИМЕЕТ опции "--entry-type", проверено только что с помощью node-nightly v13.0.0-nightly2019042580c0b89bbb. Он показал эту ошибку: неверный вариант: --entry-type=module

Dee 26.04.2019 08:17

Несколько дней назад он был переименован в --input-type. Вы можете просто использовать Node 12 сейчас, а не по ночам.

Jamesernator 27.04.2019 09:48

Это все еще может измениться, хотя это продолжается обсуждение: github.com/nodejs/modules/issues/312

Jamesernator 27.04.2019 09:51

спасибо, теперь я могу использовать --input-type, надеюсь, это больше не изменится.

Dee 27.04.2019 10:39

он позволяет мне импортировать только встроенные модули, "npm i moment" не работает, "npm i -g moment" тоже не работает

Dee 23.05.2019 09:36

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