Использование загрузчика модуля ESM в узле: `import *` завершается неудачно

Я хочу использовать модуль ES2015 для проекта. Согласно документации узла, я включаю .esm загрузчик:

~\Code\spa-test $ node --experimental-modules                                                                           (node:8104) ExperimentalWarning: The ESM module loader is experimental.                                               

> import * as sapper from '@sapper/server';                                                                             Thrown:
import * as sapper from '@sapper/server';
       ^

SyntaxError: Unexpected token *

Я также попробовал:

import {middleware} from '@sapper/server';

Который не с SyntaxError: Unexpected token {

Как мне сделать так, чтобы node.js загружал @sapper/server Модуль ESM?

1 ответ

Вам нужно сохранить свой код в файле с расширением ".mjs", чтобы пометить его как модуль ES6.

В Node.js V12 также есть переключатель командной строки "--input-type=module" который может работать в случае интерактивного использования Node.js (REPL).

'@sapper/server' не является легальным путем к модулю в Node.js. Путь к имени файла модуля либо должен начинаться с '.' или же '..' и расширение файла должно быть '.mjs'таким образом, законное заявление на импорт было бы

import * as sapper from './@sapper/server.mjs';

Когда '@sapper' является не именем файла модуля, а именем пакета, а определение package.json содержит '"type": "module"', это также должно работать (я еще не проверял это).

См. Также документацию "Модули Node.js V12 ECMAScript" и "Модули Node.js V10 ECMAScript"

Как упомянул @michaeldrehner, это проблема, связанная с Sapper (я отредактировал заголовок, чтобы отразить это).

Моя проблема была

  • Файлы в src являются входными для сапера и не предназначены для непосредственной загрузки узлом.

  • npm build или sapper buildбудет Rollup сапера * и ( server.js в единый пучок. Этот вывод в `саперных/build/server/server.js

  • Этот пакет может быть загружен узлом node .\__sapper__\build\index.js без дополнительной магии - пакет преобразуется в соответствующий формат модуля, совместимого с узлами.

Спасибо разработчикам Sapper на Discord за их помощь в ответе на этот вопрос.

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