EDIT: для получения дополнительной информации см. обсуждение на ES Обсудить.
У меня есть три модуля A
, B
и C
. A
и B
импортировать экспорт по умолчанию из модуля C
, а модуль C
импортирует значение по умолчанию из A
и B
. Однако модуль C
не зависит от значений, импортированных из A
и B
во время оценки модуля, только во время выполнения в какой-то момент после оценки всех трех модулей. Модули A
и B
действительно зависят от значения, импортированного из C
во время их оценки модуля.
Код выглядит примерно так:
// --- Module A
import C from 'C'
class A extends C {
// ...
}
export {A as default}
.
// --- Module B
import C from 'C'
class B extends C {
// ...
}
export {B as default}
.
// --- Module C
import A from 'A'
import B from 'B'
class C {
constructor() {
// this may run later, after all three modules are evaluated, or
// possibly never.
console.log(A)
console.log(B)
}
}
export {C as default}
У меня есть следующая точка входа:
// --- Entrypoint
import A from './app/A'
console.log('Entrypoint', A)
Но на самом деле происходит то, что сначала проверяется модуль B
, и он не удается с этой ошибкой в Chrome (используя собственные классы ES6, а не транслировать):
Uncaught TypeError: Class extends value undefined is not a function or null
Это означает, что значение C
в модуле B
, когда оценивается модуль B
, равно undefined
, поскольку модуль C
еще не был оценен.
Вы должны иметь возможность легко воспроизводить, создавая эти четыре файла и запуская файл точки входа.
Мои вопросы (могу ли я задать два конкретных вопроса?): Почему порядок загрузки? Как записывать циркулярно-зависимые модули так, чтобы они работали так, чтобы значение C
при оценке A
и B
не было undefined
?
(я бы подумал, что среда ES6 Module может разумно обнаружить, что ей нужно будет выполнить тело модуля C
, прежде чем он сможет выполнить тела модулей A
и B
.)