170 похожих чатов

Не могу разобраться с загрузкой ES6 модуля. В пакете в

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

4 ответов

11 просмотров

попробуй так: import { default: { A, B } } from 'mymodule'

Evgeny-Chesnokov Автор вопроса

я же говорю, я могу придумать как выковырять нужные функции из модуля, но я хочу понять, почему не импортится так, как должно

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

Evgeny-Chesnokov Автор вопроса

о, это то что нужно, спасибо огромное

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
17
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
или вы считаете муит дает знание?
супер_лох_3000 альфа версия
12
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
А кто такой мужчина в твоем понимании Азиз?
who?です 🐈
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Ну значит тебе повезло, мы же про транк говорим оба?
Александр (Rouse_) Багель
11
https://habr.com/ru/companies/domclick/articles/500978/ Добрый день, подскажите, пожалуйста, насколько хорошая практика сделать вот такую структуру эксчейнджей и очередей для...
Sergey
5
Карта сайта