Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Суть бага в Webpack v1.12.11

Шаг 1

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

Шаг 2

Для воспроизведения бага необходимо два условия:

  1. Модуль B должен импортироваться третим модулем C. То есть именно модель С во всей цепочке вызовов должен первым импортировать модуль B.
  2. Модуль B через систему зависимостей также требует импорта модуля A. Который, как мы помним, напрямую испортирует модуль B.

Что в итоге получается? Модуль C импортирует модуль B. Модель B проинициализирован, но не загружен. Для его загрузки требуется модуль A. Который испортирует проинициализированный, но не загруженный модуль B. Загрузка модуля B скипается по условию if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports;. При попытке что-то вызвать в модуле A из незагруженного модуля B код падает.

@shamrin

This comment has been minimized.

Copy link

@shamrin shamrin commented Jan 13, 2016

Possibly related: webpack/webpack#1788

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment