最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Webpack ES6 modules circular dependencies when using index files - Stack Overflow

programmeradmin7浏览0评论

I have a big project, I try to refactor to ES6 modules right now.

To make further development easier, I wanted to introduce index files, which just export all modules within the directory:

index.js:

export { default as ModuleA } from './moduleA'
export { default as ModuleB } from './moduleB'
export { default as ModuleC } from './moduleC'

moduleA.js:

import { ModuleB } from './index'

moduleB.js:

import { ModuleC } from './index'

ModuleC.doSomething()

moduleC.js:

export default {
  doSomething: () => {}
}

Starting point is ModuleA.

The problem is, that in ModuleB ModuleC is undefined, so doSomething can't be executed.
I suspect some issues with circular dependencies, since moduleB tries to access the index again, which parses moduleB before moduleC.

Is it just not possible to do this, or is there another solution?

I have a big project, I try to refactor to ES6 modules right now.

To make further development easier, I wanted to introduce index files, which just export all modules within the directory:

index.js:

export { default as ModuleA } from './moduleA'
export { default as ModuleB } from './moduleB'
export { default as ModuleC } from './moduleC'

moduleA.js:

import { ModuleB } from './index'

moduleB.js:

import { ModuleC } from './index'

ModuleC.doSomething()

moduleC.js:

export default {
  doSomething: () => {}
}

Starting point is ModuleA.

The problem is, that in ModuleB ModuleC is undefined, so doSomething can't be executed.
I suspect some issues with circular dependencies, since moduleB tries to access the index again, which parses moduleB before moduleC.

Is it just not possible to do this, or is there another solution?

Share Improve this question asked Mar 5, 2018 at 18:09 tjweldetjwelde 3731 gold badge2 silver badges9 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 11

The issue here is that ModuleC has not been exported by the time that ModuleB is exported and runs, and since ModuleC is a requirement of ModuleB, it can't run. If I were you, I would just export each of them from their own files, and when you import them, import them from their own files instead of index.js.

Example

ModuleA.js:

import { ModuleB } from 'moduleB.js'
    export default {
      // Your code here
}

ModuleB.js

import { ModuleC } from 'moduleC.js'
moduleC.doSomething();

ModuleC.js

export default {
    doSomething: () => {
      // Your code
    }
}

And finally, since ModuleA is the entry point from index.js, just import it into index.js and run what you need to run.

Alright. Solved it.

The problem ist, that when ModuleB tries to import ModuleC from the index, the index will be parsed again and will see ModuleB before it can reach ModuleC.
It seems to work with only two modules, since the index file doesn't get reparsed, I think.

The solution:
Import modules, which try to load other modules from the index file at last.

So index.js should look like this:

export { default as ModuleA } from './moduleA'
export { default as ModuleC } from './moduleC'
export { default as ModuleB } from './moduleB'
发布评论

评论列表(0)

  1. 暂无评论