Проблема циклической зависимости при экспорте из одного файла с использованием babel-module-resolver - PullRequest
0 голосов
/ 14 сентября 2018

Я работал над собственным реактивным проектом, и пока выполняющееся приложение горячей перезагрузки переходит в циклическую рекурсию, результатом чего является превышение максимального стека вызовов.Подробнее об этой проблеме можно узнать здесь

Отсюда я понял, что что-то не так, и создаются круговые зависимости.

Я решил попробовать madge и посмотреть, что происходит в проекте.После запуска команды я увидел довольно много циклических зависимостей.

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

Я создал папку utils, в которой у меня есть 4 файла: -

  1. utils / index.js
  2. utils / device-helper.js
  3. utils / init.js
  4. index.js

Для импорта я использую babel-module-resolver

utils / init.js

import {deviceInfo} from "utils";

export const init = () => {
  // initialising app and calling backend API with device info
};

utils / device-helper.js

import DeviceInfo from "react-native-device-info";

const API_LEVEL = "v0";

export const deviceInfo = () => {
  try {
    return Object.assign({}, {
      apiLevel: API_LEVEL,
      deviceId: DeviceInfo.getUniqueID(),
      device: DeviceInfo.getDeviceName(),
      model: DeviceInfo.getModel(),
      osVersion: DeviceInfo.getSystemVersion(),
      product: DeviceInfo.getBrand(),
      country: DeviceInfo.getDeviceCountry(),
      appVersion: DeviceInfo.getVersion(),
      manufacturer: DeviceInfo.getManufacturer(),
      userAgent: DeviceInfo.getUserAgent(),
      buildNumber: DeviceInfo.getBuildNumber(),
      bundleId: DeviceInfo.getBundleId()
    });
  } catch (e) {
    //  TODO: Report to Bugsnag
    return {};
  }
};

utils / index.js

export * from "./init";
export * from "./device-info-helper";

index.js

export * from "./utils"; 

После выполнения команды madge я получаю следующее: -

tests-MBP:madge-test harkirat$ madge --circular  index.js
Processed 4 files (684ms)

✖ Found 1 circular dependency!

1) utils/index.js > utils/init.js

Однако, если я изменю utils / init.js напосле этого работает: -

utils / init.js

import {deviceInfo} from "./device-helpers";


export const init = () => {
  // initialising app and calling backend API with device info
};

Я не могу понять причину этой круговой зависимости.Может кто-нибудь помочь, пожалуйста?

Здесь - ссылка на репозиторий.

1 Ответ

0 голосов
/ 21 сентября 2018

Я не вижу .babelrc в репо, но вот что я думаю:

  1. В utils/init.js вы импортируете, используя:

import {deviceInfo} from "utils";

То же, что и:

import {deviceInfo} from "./utils/index";

  1. В utils/index.js вы делаете export * from "./init". Этот export from в основном сначала импортирует все содержимое ./utils/init и реэкспортирует его.

Итак:

  • utils/init.js импорт из ./utils/index
  • ./utils/index.js импорт из ./utils/init

Есть ваша круговая зависимость.

...