В экосистеме современных фронтенд-сборщиков одним из ключевых
механизмов оптимизации является подмена тяжёлых зависимостей на более
лёгкие аналоги без изменения прикладного кода. Parcel предоставляет
встроенную поддержку алиасов модулей, что позволяет заменить
react и react-dom на preact и
preact/compat на уровне сборки.
Основная идея заключается в том, что код приложения продолжает импортировать привычные модули:
import React from "react";
import ReactDOM from "react-dom";
но в процессе сборки Parcel перенаправляет эти импорты на альтернативную реализацию, уменьшающую размер итогового бандла.
Parcel поддерживает поле alias в
package.json, которое позволяет переопределять пути
модулей:
{
"alias": {
"react": "preact/compat",
"react-dom": "preact/compat",
"react/jsx-runtime": "preact/jsx-runtime"
}
}
Такое сопоставление делает возможной прозрачную замену React на Preact без модификации исходного кода компонентов.
Ключевой компонент здесь — preact/compat, который
реализует слой совместимости API React, включая хуки, контекст и базовые
методы жизненного цикла.
Библиотека preact/compat выступает адаптером между React
API и ядром Preact. Она обеспечивает:
useState, useEffect,
useMemo, useCallbackcreateContextВ результате приложение, написанное под React 17–18, в большинстве случаев может работать без изменений.
Одной из основных причин использования Preact является значительное уменьшение размера итогового JavaScript-бандла.
React и ReactDOM вместе могут занимать десятки килобайт даже в минифицированном виде, тогда как Preact core и compat-слой обычно существенно легче.
Parcel при сборке выполняет:
В комбинации с Preact это даёт дополнительный выигрыш, так как библиотека изначально компактнее и менее многословна по внутренней реализации.
Parcel v2 использует декларативный подход к конфигурации. Помимо
package.json, алиасы могут быть определены через
.parcelrc или через поле alias.
Пример конфигурации для проекта:
{
"name": "app",
"dependencies": {
"preact": "^10.0.0"
},
"alias": {
"react": "preact/compat",
"react-dom": "preact/compat",
"react/jsx-runtime": "preact/jsx-runtime"
}
}
После этого Parcel автоматически подменяет импорты на этапе резолвинга модулей, до этапа трансформации кода.
Современные версии React используют новый JSX runtime, который больше не требует явного импорта React в каждом файле. Однако при переходе на Preact важно учитывать соответствие runtime.
Для этого используется:
{
"alias": {
"react/jsx-runtime": "preact/jsx-runtime",
"react/jsx-dev-runtime": "preact/jsx-dev-runtime"
}
}
Это позволяет сохранить корректную трансформацию JSX без дополнительных полифиллов.
Parcel автоматически подхватывает эти алиасы и направляет трансформированный код в нужный runtime.
Использование Preact косвенно влияет и на скорость сборки.
Parcel применяет параллельную обработку модулей, и более лёгкие зависимости уменьшают:
Дополнительно оптимизация достигается через:
Parcel использует файловый кэш, который сохраняет результаты трансформации модулей. При повторных сборках изменяются только затронутые файлы.
Изменения в коде пересобираются локально без полной перестройки бандла.
Parcel автоматически разбивает код на чанки:
const Page = import("./Page");
Это позволяет загружать Preact-приложение по частям, снижая начальную нагрузку.
Помимо размера бандла важна производительность выполнения кода в браузере.
Preact отличается более лёгкой виртуальной DOM-реализацией, что влияет на:
Parcel не изменяет runtime напрямую, но способствует более эффективной упаковке кода, уменьшая количество вспомогательных полифиллов и обёрток.
При замене React на Preact основной риск связан с несовместимостью библиотек, которые жёстко завязаны на React internals.
Parcel позволяет локально переопределять такие зависимости:
{
"alias": {
"react": "preact/compat",
"react-dom": "preact/compat"
}
}
Однако в сложных случаях требуется точечная настройка:
externalParcel выполняет статический анализ импортов и удаляет неиспользуемые части модулей. При использовании Preact эффект усиливается за счёт меньшего числа экспортов.
Пример:
import { useState } from "react";
После алиасинга становится:
import { useState } from "preact/hooks";
Это уменьшает глубину зависимостей и упрощает граф модулей.
В production-режиме Parcel выполняет дополнительные оптимизации:
При использовании Preact итоговый результат становится ещё более компактным, поскольку базовая библиотека изначально менее громоздкая.
React ориентирован на расширяемую экосистему и включает множество внутренних абстракций. Preact стремится к минимализму и совместимости.
Parcel, выступая как нейтральный сборщик, позволяет переключаться между этими моделями без изменения архитектуры сборки.
Ключевые различия в контексте сборки:
Несмотря на прозрачность замены, существуют технические нюансы:
react-dom/client могут
требовать дополнительных алиасовParcel не решает эти ограничения автоматически, но предоставляет инфраструктуру для точечной корректировки резолвинга модулей.
Эффективность связки Parcel + Preact увеличивается при соблюдении архитектурных принципов:
Parcel при этом обеспечивает стабильную модульную графовую модель, где каждый чанк может оптимизироваться независимо.