2016-02-06 2 views
31

Я использую webpack + babel. Я три модуля вида:Импорт Webpack возвращается неопределенным, в зависимости от порядка импорта

// 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 вместо модуля в первой версии? Что не так?

ответ

86

После почти полного рабочего дня сужения проблемы (стрижка AKA), я наконец понял, что у меня есть круговая зависимость.

Там, где указано // some other imports here, A импортирует другой модуль C, который, в свою очередь, импортирует B. A сначала импортируется в main.js, поэтому B заканчивается тем, что является последней ссылкой в ​​«круге», а Webpack (или любая среда, подобная CommonJS, если на то пошло, например Node) просто замыкает ее, возвращая Amodule.exports, который по-прежнему undefined. В конце концов, он становится равным some-const, но синхронный код в B заканчивается вместо undefined.

Устранение круговой зависимости, вытеснив код, который C зависит от B, разрешил проблему. Wish Webpack как-то предупредил бы меня об этом.

Edit: На последней ноте, как указал @cookie, there's a plugin for circular dependency detection, если вы хотите, чтобы избежать столкновения с этой проблемой [снова].

+2

Вы только что спасли меня большую часть дня. Если бы та же проблема, ваше решение решило ее за 5 минут! Спасибо – boatcoder

+0

только что разрешил мою проблему благодаря этому удивительному ответу. – egucciar

+9

есть плагин для webpack, который будет определять круговые зависимости: https://www.npmjs.com/package/circular-dependency-plugin – cookie

Смежные вопросы