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';