Порядок обработки точек входа в Webpack определяется внутренним
механизмом построения графа зависимостей и тем, как сборщик
интерпретирует конфигурацию entry. Несмотря на кажущуюся
простоту объявления точек входа, фактический процесс их обработки
включает несколько стадий: нормализацию входных данных, создание
начальных модулей, построение связей между чанками и последующую
оптимизацию результирующего графа.
На первом этапе Webpack преобразует значение entry к
унифицированному внутреннему виду. Конфигурация может быть задана в
нескольких формах: строка, массив строк или объект с именованными
точками входа.
Строковое значение рассматривается как единственная точка входа:
entry: "./src/index.js"
Массив трактуется как объединённая точка входа, где все модули загружаются последовательно в один чанк:
entry: ["./src/polyfill.js", "./src/index.js"]
Объектная форма используется для создания нескольких независимых графов:
entry: {
app: "./src/app.js",
admin: "./src/admin.js"
}
После нормализации Webpack преобразует каждую запись в структуру,
содержащую идентификатор, абсолютный путь и набор дополнительных
параметров, если они заданы через объектную форму с
dependOn, import, runtime.
Каждая точка входа преобразуется в так называемый entry module. Этот модуль становится корнем подграфа зависимостей.
При запуске компиляции происходит резолвинг пути через систему resolver’а Webpack. В этот момент учитываются:
resolve.aliasresolve.extensionsnode_modulesexports и main в
package.jsonРезультатом становится абсолютный путь к исходному модулю, который затем передаётся в модульный граф.
После этого создаётся объект Module, содержащий:
После создания entry-модулей Webpack начинает рекурсивный обход импортов. Каждый импорт в исходном коде становится ребром графа.
Пример:
import utils from "./utils";
import api from "./api";
Каждый импорт добавляет новый модуль в очередь обработки. Этот процесс называется dependency graph traversal.
Особенность заключается в том, что Webpack использует стратегию обхода в ширину с элементами приоритетной очереди. Это позволяет параллелизировать обработку модулей и оптимизировать сборку.
Если несколько entry точек используют один и тот же модуль, он не создаётся заново, а переиспользуется через систему module graph deduplication.
После построения графа Webpack начинает группировать модули в чанки. Каждая entry точка создаёт отдельный initial chunk.
При этом учитываются следующие правила:
runtime sharingoptimization.splitChunksВ случае нескольких entry точек возможна следующая структура:
Webpack поддерживает явное указание зависимостей между entry через
dependOn. Это влияет на порядок выполнения и структуру
runtime.
Пример:
entry: {
shared: "./src/shared.js",
app: {
import: "./src/app.js",
dependOn: "shared"
},
admin: {
import: "./src/admin.js",
dependOn: "shared"
}
}
В этом случае сначала формируется chunk shared, затем он
становится зависимостью для app и admin.
Runtime гарантирует, что общий код будет загружен до исполнения
зависимых точек входа.
После формирования чанков Webpack генерирует runtime-код, который управляет загрузкой модулей. Порядок выполнения entry точек определяется следующим образом:
Если entry точки независимы, порядок их выполнения не гарантируется и зависит от порядка подключения в HTML или загрузчике.
При использовании dependOn или общего runtime порядок
становится детерминированным.
Если несколько entry точек используют одинаковые модули, Webpack применяет механизм deduplication:
Это особенно важно при больших приложениях, где shared зависимости составляют значительную часть кода.
Оптимизация через splitChunks.cacheGroups влияет на то,
как модули распределяются между чанками.
Приоритет групп определяет, в какой chunk попадёт модуль, если он используется в нескольких entry точках.
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /node_modules/,
chunks: "all"
}
}
}
}
В этом случае сначала формируются entry chunks, затем анализируются общие зависимости, которые могут быть выделены в vendor chunk.
Динамические импорты:
import("./module")
не участвуют напрямую в порядке обработки entry, но влияют на расширение графа во время выполнения. Такие чанки создаются лениво и загружаются по требованию, что разрывает строгую последовательность формирования графа.
Webpack внутренне использует очереди задач для модулей:
Это позволяет минимизировать блокировки при построении графа и ускорять сборку при большом количестве точек входа.
Режим mode влияет на порядок и глубину оптимизации:
В production порядке формирования чанков может отличаться от декларативного порядка entry, поскольку Webpack оптимизирует структуру исходя из стоимости кода и повторного использования модулей.
Порядок обработки entry точек не всегда гарантирован между разными запусками сборки. На него могут влиять:
Для стабилизации используется deterministic chunk ids и module ids, что уменьшает вариативность итогового порядка, но не полностью устраняет её в сложных конфигурациях.