node - экспериментальные модули, запрошенный модуль не предоставляет экспорт с именем

Я установил Node 8.9.1 (та же проблема возникает в v10.5.0).

Я пытаюсь использовать именованный импорт из пакетов npm в файл с .mjs

import { throttle } from lodash;

Я бегу:

node --experimental-modules index.mjs

и я получаю:

SyntaxError: Запрошенный модуль 'lodash' не обеспечивает экспорт с именем 'throttle'     в ModuleJob._instantiate (внутренний /modules/esm/module_job.js: 80: 21)

Предполагается, что --experimental-modules перестанет быть экспериментальным в v10 LTS, так почему же больше авторов модулей не запрыгнули на подножку?

Ответ 1

--experimental-modules пока не поддерживает именованный экспорт:

--experimental-modules не поддерживает импорт именованных экспортов из модуля commonjs (кроме собственных встроенных модулей узла).

Вот почему вы не можете использовать синтаксис:

 import { throttle } from 'lodash';

Вместо этого (по крайней мере, сейчас) вы должны уничтожить то, что вам нужно:

 import lodash from 'lodash';
 const { throttle } = lodash;

Предположительно, когда-нибудь Node добавит поддержку всех функций модуля ES.

Ответ 2

Вы должны использовать расширение .mjs.

Как только это будет установлено, файлы, заканчивающиеся на.mjs, будут загружаться в виде модулей ES.

ссылка: https://nodejs.org/api/esm.html

Обновить:

Похоже, вы еще не экспортировали этот метод.

Предположим, что у меня есть hello.mjs с контентом

export function sayHello() {
    console.log('hello')
}

я могу использовать его в index.mjs как это

import {sayHello} from './hello.mjs'
sayHello()

Ответ 3

Если lodash был написан как модули, а lodash/index.mjs экспортировал throttle: export const throttle =...; тогда вы сможете import { throttle } from lodash;

Проблема здесь в том, что в commonjs нет такой вещи как именованный экспорт. Это означает, что в модулях commonjs экспортируется только одно.

Поэтому подумайте, что lodash экспортирует объект, содержащий свойство с именем throttle.

Что касается второй части вопроса, я полагаю, что люди постепенно начнут внедрять ES-модули, когда они больше не будут экспериментальными. На момент написания этой статьи это все еще (Node.js v11.14).

Ответ 4

Для меня загрузка lodash как ES Library выполнила работу, вот пакет NPM для того же.

Библиотека Lodash экспортирована как ES-модули. https://www.npmjs.com/package/lodash-es

Затем вы можете импортировать утилит обычным способом.

import { shuffle } from 'lodash-es';