index.js примерно следующее:
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.A = A;
exports.B = B;
пишу импорты в своем коде:
import { A, B } from 'mymodule'
и нода плюется, что
The requested module 'mymodule' does not provide an export named 'A'
ну и аналогично для импорта B тоже. Из любопытства загружаю и печатаю весь модуль:
import * as all from 'mymodule'
console.log("ALLS: " + all)
И вижу такую структуру:
[Module] {
default: {
A: [Function: A],
B: [Function: B]
}
}
Мне не хватает понимания того как работают ES6 и commonjs пакеты, чтобы понять, в чем тут собственно разногласие и почему импорт не срабатывает так, как мне надо. Я понимаю, что могу импортнуть по-другому, типа, использовать all.A и all.B, но хочу понять, что сейчас не так. Подскажите, в чем дело? Заранее спасибо.
попробуй так: import { default: { A, B } } from 'mymodule'
я же говорю, я могу придумать как выковырять нужные функции из модуля, но я хочу понять, почему не импортится так, как должно
Вот здесь есть описание `When importing CommonJS modules, the module.exports object is provided as the default export. Named exports may be available, provided by static analysis as a convenience for better ecosystem compatibility.` `The ECMAScript Module Namespace representation of a CommonJS module is always a namespace with a default export key pointing to the CommonJS module.exports value.` `The detection of named exports is based on common syntax patterns but does not always correctly detect named exports. In these cases, using the default import form described above can be a better option.` https://nodejs.org/api/esm.html#esm_commonjs_namespaces Там же дана ссылка на их лексер с примерами когда он фейлит https://github.com/guybedford/cjs-module-lexer/tree/1.2.2 Видимо, при разработке ES модулей было требование, чтобы имена всех импортов и экспортов были известны без выполнения кода. Поэтому они используют статический анализ для cjs файлов. А в cjs можно экспортировать объекты с генерируемыми на лету именами, поэтому иногда анализ даёт сбой. Предполагаю, что это сделано для всяких сборщиков, чтобы им было проще вырезать ненужный код.
о, это то что нужно, спасибо огромное
Обсуждают сегодня