Есть модуль 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