Есть модуль A
, который импортирует модуль B
В процессе первого(!) импорта модуля B
происходит его инициализация, которая в коде вебпака происходит следующим образом:
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
То есть модуль в процессе импорта на момент вызова modules[moduleId].callmodules[moduleId].call
уже проинициализирован (добавлен в installedModules), но еще не загружен (loaded: false).
Для воспроизведения бага необходимо два условия:
- Модуль
B
должен импортироваться третим модулемC
. То есть именно модельС
во всей цепочке вызовов должен первым импортировать модульB
. - Модуль
B
через систему зависимостей также требует импорта модуляA
. Который, как мы помним, напрямую испортирует модульB
.
Что в итоге получается?
Модуль C
импортирует модуль B
. Модель B
проинициализирован, но не загружен. Для его загрузки требуется модуль A
. Который испортирует проинициализированный, но не загруженный модуль B
. Загрузка модуля B
скипается по условию if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports;
. При попытке что-то вызвать в модуле A
из незагруженного модуля B
код падает.
Possibly related: webpack/webpack#1788