Понимание круговых зависимостей в ES6

1

Я пытаюсь создать своего рода 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()

Хотя я вижу, что это может быть плохая практика (и, честно говоря, кажется здравым смыслом, что файл не может импортировать сам), я хотел бы понять, почему это невозможно!

Теги:
ecmascript-6

1 ответ

2
Лучший ответ

Совершенно возможно импортировать модуль верхнего уровня. Его просто невозможно синхронно использовать во время инициализации модуля контейнеров. Что происходит в основном

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) в функцию и вызовите ее позже, она будет работать. Обратите внимание, что при циклических зависимостях вам нужно проявлять особую осторожность, чтобы вы всегда загружали модуль верхнего уровня, чтобы получить последовательный порядок оценки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню