Понятие чанков и их автоматическое создание

Внутренняя модель сборки Rollup основана на преобразовании графа модулей в набор оптимизированных выходных файлов, называемых чанками. Понимание механизма формирования чанков является ключевым для управления архитектурой бандла, оптимизации загрузки и контроля разделения кода.

Чанк представляет собой самостоятельную единицу вывода, содержащую один или несколько модулей, объединённых в единый исполняемый файл. В отличие от входного модуля, который задаёт точку старта графа зависимостей, чанк формируется Rollup автоматически в процессе анализа импортов и экспорта.

Каждый чанк обладает собственным набором:

  • включённых модулей
  • локальных переменных и областей видимости
  • экспортируемых значений
  • ссылок на другие чанки

Основная задача чанка — представлять минимально связную группу кода, которая может быть загружена и выполнена независимо при сохранении корректной работы связей между модулями.

Формирование графа модулей

Перед созданием чанков Rollup строит граф зависимостей. Каждый модуль рассматривается как узел графа, а связи import и export формируют рёбра.

На этом этапе выполняются следующие действия:

  • анализируются все входные точки (input)
  • рекурсивно обходятся импортируемые модули
  • строится полная карта зависимостей
  • выявляются общие зависимости между разными ветками графа

Именно структура графа определяет, какие модули будут объединены в один чанк, а какие разделятся.

Автоматическое создание чанков

Автоматическое разбиение на чанки происходит в момент формирования output. Rollup использует правила:

  • каждый входной модуль формирует минимум один чанк
  • общие зависимости извлекаются в отдельные чанки при необходимости
  • динамические импорты приводят к созданию дополнительных чанков
  • оптимизация направлена на устранение дублирования кода

Если несколько входных точек используют одни и те же модули, Rollup стремится вынести их в отдельную общую единицу.

Основной чанк и вторичные чанки

В процессе сборки выделяются два основных типа чанков:

Основной чанк

Основной чанк формируется из входной точки и содержит:

  • стартовую логику приложения
  • модули, не разделённые с другими частями графа
  • точки подключения динамических импортов

Он является точкой запуска выполнения.

Вторичные чанки

Вторичные чанки создаются автоматически в следующих случаях:

  • наличие динамического импорта (import())
  • разделение общего кода между несколькими входами
  • вынесение повторяющихся зависимостей
  • применение code splitting

Такие чанки загружаются лениво и исполняются по мере необходимости.

Динамические импорты и разделение кода

Одним из ключевых механизмов создания чанков является динамический импорт. Конструкция:

import('./module.js')

инструктирует Rollup о необходимости создать отдельный чанк для указанного модуля.

При обработке динамического импорта происходит:

  • выделение модуля в отдельную единицу вывода
  • замена вызова на функцию загрузки чанка
  • формирование асинхронной точки входа
  • связывание с системой загрузки runtime

Таким образом, динамический импорт напрямую управляет количеством чанков в итоговой сборке.

Общие зависимости и извлечение в отдельные чанки

При наличии нескольких входных точек Rollup анализирует пересечение зависимостей. Если модуль используется в разных частях графа, он может быть вынесен в отдельный чанк.

Пример логики:

  • вход A использует модуль X
  • вход B также использует модуль X
  • модуль X не зависит от специфики входов

В этом случае модуль X становится отдельным shared-чанком.

Такое поведение снижает дублирование и уменьшает общий размер бандла.

Правила объединения модулей в чанки

Rollup использует несколько принципов группировки:

1. Статическая связанность

Модули, связанные только статическими импортами, стремятся объединяться в единый чанк.

2. Изолированность динамических веток

Каждый динамический импорт формирует отдельную область разделения.

3. Минимизация дублирования

Одинаковые зависимости не копируются, а выносятся в общие чанки.

4. Сохранение корректной области видимости

Каждый чанк должен сохранять семантику ES-модулей без конфликтов имён и побочных эффектов.

Именование чанков

Имена чанков формируются на основе конфигурации output:

  • manual chunks (если заданы)
  • имя входного файла
  • хеш содержимого
  • внутренние алгоритмы Rollup

При использовании параметра output.chunkFileNames можно управлять шаблоном именования, включая:

  • [name] — имя чанка
  • [hash] — хеш содержимого
  • [format] — формат вывода

Это позволяет контролировать структуру выходной директории.

Влияние tree-shaking на чанки

Tree-shaking оказывает прямое влияние на состав чанков. Перед формированием чанков Rollup удаляет неиспользуемые экспортируемые сущности.

Последовательность обработки:

  • анализ используется ли экспорт
  • удаление мёртвого кода
  • перераспределение оставшихся модулей
  • формирование финальных чанков

В результате размер каждого чанка уменьшается ещё до его создания как файла.

Связь чанков между собой

После разделения кода чанки не существуют изолированно. Они связаны системой импортов и runtime-механизмом Rollup.

Связи включают:

  • импорт других чанков через динамические загрузчики
  • общие runtime-функции
  • таблицы модулей
  • механизмы разрешения зависимостей

Это обеспечивает корректное выполнение даже при частичной загрузке приложения.

Оптимизация количества чанков

Избыточное количество чанков может ухудшить производительность из-за увеличения числа сетевых запросов. Rollup и разработчик могут влиять на этот процесс:

  • использование manualChunks для контроля разделения
  • минимизация избыточных динамических импортов
  • объединение логически связанных модулей
  • анализ графа зависимостей

Баланс между количеством чанков и их размером является важной задачей оптимизации сборки.

Поведение при нескольких входных точках

При наличии нескольких entry points Rollup формирует отдельные графы, которые затем пересекаются через общие зависимости.

Процесс включает:

  • построение независимых графов для каждого входа
  • выявление общих модулей
  • создание shared-чанков
  • распределение модулей по финальным файлам

Такой подход позволяет строить многостраничные приложения с эффективным переиспользованием кода.

Роль runtime в работе чанков

Каждый чанк работает в рамках runtime-среды Rollup, которая обеспечивает:

  • регистрацию модулей
  • загрузку зависимостей
  • выполнение кода в правильном порядке
  • разрешение экспортов и импортов

Runtime является связующим слоем между отдельными чанками и обеспечивает их совместимость.

Итоговая модель формирования чанков

Внутренняя логика Rollup сводится к последовательному процессу:

  • построение графа модулей
  • анализ зависимостей и экспортов
  • удаление неиспользуемого кода
  • разделение на статические и динамические области
  • выделение shared-зависимостей
  • формирование финальных чанков с учётом конфигурации вывода

Эта модель обеспечивает предсказуемое и оптимизированное разбиение кода, позволяя управлять структурой сборки на уровне архитектуры приложения.