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 ответов

27 просмотров

попробуй так: 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 Автор вопроса

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта