Циклические зависимости возвращают неопределенное значение

#javascript #ecmascript-6 #dependencies #babeljs

#javascript #ecmascript-6 #зависимости #babeljs

Вопрос:

Я хотел провести рефакторинг своего приложения Nodejs / Babel 7. Это приложение GraphQL с Bookshelf.js модели для управления базой данных. Итак, я разделил свой код на несколько фрагментов:

  • index.js, server.js и несколько других «бесплатных» файлов, которые в основном являются точками входа в приложение
  • каталог с моделями, завершенный своего рода индексным файлом, который пересылает экспорт (пример ниже)
  • каталог с типами GQL, с аналогичным индексным файлом
  • каталог с запросами GQL, снова с аналогичным индексным файлом
  • каталог со службами, аналогичный индексный файл

Пока все хорошо. До рефакторинга модули просто импортировали некоторые другие модули напрямую, поэтому a хотел иметь хороший однострочный импорт как таковой:

 import {Contact, Product, Set, Content, User} from 'models/Models'
  

Но … вот проблема. мои модули сильно зависят друг от друга. Под этим я подразумеваю, что модель иногда импортирует сервис или тип, сервис может импортировать модели и так далее. Когда я запускаю код, я обнаружил кучу ошибок «ожидал чего-то, но нашел неопределенное». Я исследовал этот вопрос и выяснил, что это из-за циклических зависимостей — мои индексные файлы загружены не полностью, и из-за этого они возвращают неопределенное значение. Забавно, что до того, как я реорганизовал код, все работало (так что реальной проблемы с циклическими зависимостями нет, их можно решить с помощью transpiler, но когда я использую файлы «index» для структурирования импорта, это невозможно).

Очевидным решением было бы вернуться к предыдущей структуре и просто жить с ней, но это лишь краткосрочное решение. Как я могу решить эту проблему?

Пример файла «index» (обрезанный):

 export { default as Contact } from 'models/ancestor/Contact'
export { default as Content } from 'models/ancestor/Content'

export { default as UserData } from 'models/mega/UserData'

export { default as Action } from 'models/organization/Action'
export { default as Connection } from 'models/organization/Connection'
  

Комментарии:

1. Да, я проверил и это, ошибка осталась в основном той же. Я думаю об одном другом возможном решении — изменении порядка импорта в индексных файлах. Хотя я не знаю, может ли это вообще сработать.

2. Но это работает, посмотрите на пример: codesandbox.io/s/p9yzxn2njq . Они не являются несколькими значениями по умолчанию — я беру экспорт по умолчанию из разных файлов, затем присваиваю им имена и «пересылаю» экспорт вместе.