Webpack 가져 오기는 가져 오기 순서에 따라 정의되지 않은 것을 반환합니다.


78

나는 webpack + babel을 사용하고 있습니다. 다음과 같은 세 개의 모듈이 있습니다.

// A.js

// some other imports here
console.log('A');
export default 'some-const';

// B.js

import someConst from './A';
console.log('B', someConst);
export default 'something-else';

// main.js

import someConst from './A';
import somethingElse from './B';
console.log('main', someConst);

main.js가 실행 되면 다음이 표시됩니다.

B undefined
A
main some-const

나는에서 수입 바꿀 경우 main.js, B첫 번째가되기를, 내가 얻을 :

A
B some-const
main some-const

어떻게 올 B.js얻을 undefined대신 첫 번째 버전의 모듈로? 뭐가 문제 야?

답변:


181

거의 하루 종일 문제를 좁히고 (일명 머리카락 잡아 당기기), 마침내 순환 의존성이 있다는 것을 깨달았습니다.

그것이 말하는 곳에 // some other imports here, A다른 모듈을 가져오고 C, 차례로 가져옵니다 B. A에서 처음으로 수입됩니다 main.js, 그래서 B은 "원"의 마지막 연결되는 끝, 그리고 웹팩 (또는 CommonJS 같은 환경, 노드와 같은 그 문제에 대해) 반환하여 단지 단락을 Amodule.exports, 아직도이다 undefined. 결국는 같게 some-const되지만의 동기 코드는 결국 대신 B처리하게 undefined됩니다.

코드 밖으로 이동함으로써, 순환 종속성을 제거 C받음에 따라이 B문제를 해결하고있다. Wish Webpack은 어떻게 든 나에게 이것에 대해 경고합니다.

편집 : 마지막 메모에서 @cookie가 지적했듯이 순환 종속성 감지를위한 플러그인 이 있습니다.이 문제를 [다시] 피하고 싶다면.


19
순환 종속성을 감지하는 webpack 용 플러그인이 있습니다. npmjs.com/package/circular-dependency-plugin
cookie

4
당신은 끔찍한 영웅입니다. Webpack은 그런 쓰레기통입니다 .-- 이것은 내 vue.js 사이트를 날려 버렸습니다. 컴포넌트 X가 vuex 상태 Y + js 모듈 Z를 가져오고 Y와 Z가 모두 동일한 JSON FILE을 가져 오면 어떻게 든 순환 종속성을 구성합니다. 그것을 고치지 않았을 것이지만 이것을 위해.
Paul Gowder

3
그래서 ... 웹팩이 순환 의존성을 지원하지 않기 때문에 깨진 코드를 내 보낸다면 (저는 그것이 나쁜 디자인을 지원해야한다고 주장하지 않습니다), 우리에게 문제가 있다는 것을 알려주는 플러그인이 왜 필요합니까?
joonas.fi

2
@ joonas.fi : 동의합니다. 이 IMO JS 에코 시스템은 일반적으로 내려 온다 jwz.org/doc/worse-is-better.html
johncip

덕분에 불가능한 버그를 수정하여 많은 시간을 절약했습니다. :-*
Wazime
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.