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.)