Я пытаюсь создать своего рода API. По этой причине есть случай, когда я пытаюсь импортировать основной файл (который предоставляет API), который включает в себя экспорт, из файла, откуда идет импортный вызов!
Смешение? Большой!
Структура проекта:
/
/src
/src/js
/src/js/modules
/src/js/modules/moduleA/index|actions|components|selectors
/src/js/modules/moduleB/index|actions|components|selectors
/src/js/modules/moduleC/index|actions|components|selectors
См. Пример ниже, где я раскрываю круговые зависимости, которые не работают!
Итак, вот как модульная предоставляет API (который легко работает при экспорте вне самого модуля):
// src/modules/foobar/index.js
import * as actions from './actions'
import * as components from './components'
import * as containers from './containers'
import * as constants from './constants'
import reducer from './reducer'
import * as selectors from './selectors'
export default { actions, components, containers, constants, reducer, selectors }
Здесь импорт:
// src/modules/foobar/containers/index.js
import API from '../index.js'
// this is undefined
console.log('API', API)
Цель?
ModuleAPI.actions.foobar()
ModuleAPI.containers.foobar()
Хотя я вижу, что это может быть плохая практика (и, честно говоря, кажется здравым смыслом, что файл не может импортировать сам), я хотел бы понять, почему это невозможно!
Совершенно возможно импортировать модуль верхнего уровня. Его просто невозможно синхронно использовать во время инициализации модуля контейнеров. Что происходит в основном
load foobar/index.js
initialise foobar/index.js:
load foobar/containers/index.js
initialise foobar/containers/index.js:
load foobar/index.js
it already getting initialised so don't wait
set up scope
execute module code: 'API' is still undefined in the log statement
finish initialisation of foobar/containers/index.js
set up scope
execute module code: 'API' is getting defined now
finish initialisation of foobar/index.js
Поэтому, как только вы поместите console.log(API)
в функцию и вызовите ее позже, она будет работать. Обратите внимание, что при циклических зависимостях вам нужно проявлять особую осторожность, чтобы вы всегда загружали модуль верхнего уровня, чтобы получить последовательный порядок оценки.