Bundle-анализ — это процесс изучения итогового JavaScript-файла (или набора файлов), который получается после сборки приложения. Для Inferno, как и для других UI-фреймворков, критично понимать, какие модули попадают в бандл, почему они там оказываются и каков их реальный вклад в размер.
Inferno изначально спроектирован как минималистичный фреймворк, но даже при этом итоговый размер может быстро расти за счёт:
Анализ начинается не с оптимизаций, а с прозрачности структуры сборки.
На практике Inferno почти всегда используется вместе с Webpack, Rollup или Vite. Каждый из этих сборщиков имеет собственные инструменты визуализации.
Webpack
webpack-bundle-analyzerstats.json + анализ через сторонние сервисыПодключение анализатора:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
};
Результат — интерактивная карта бандла, показывающая:
Rollup
rollup-plugin-visualizerПример:
import visualizer from 'rollup-plugin-visualizer';
export default {
plugins: [
visualizer({ open: true })
]
};
Vite Использует Rollup под капотом, поэтому совместим с теми же плагинами визуализации.
Inferno предоставляет несколько пакетов, каждый из которых решает конкретную задачу:
infernoinferno-create-elementinferno-componentinferno-compatinferno-routerНеправильный выбор пакета приводит к резкому увеличению размера.
Критически важно: inferno-compat
добавляет слой совместимости с React и тянет за собой большое количество
лишнего кода. Его использование оправдано только при миграции.
Inferno хорошо поддерживает tree shaking, но только при корректных ES-модулях.
Неправильный импорт:
import Inferno from 'inferno';
Правильный импорт:
import { render } from 'inferno';
Или:
import { Component } from 'inferno-component';
Причины:
Даже небольшой Inferno-проект выигрывает от ленивой загрузки.
Динамический импорт
const LazyPage = () =>
import('./pages/HeavyPage');
Webpack и Rollup автоматически создают отдельный chunk.
Типичные кандидаты на разделение:
inferno-router относительно лёгкий, но неправильная
архитектура маршрутов может свести выгоду на нет.
Распространённая ошибка:
Предпочтительная схема:
import().Это позволяет:
Inferno активно использует проверки окружения.
Обязательное условие:
process.env.NODE_ENV === 'production'
В production-режиме:
Для Webpack:
mode: 'production'
Для Rollup:
replace({
'process.env.NODE_ENV': JSON.stringify('production')
})
Inferno хорошо оптимизируется при использовании:
Пример настройки Terser:
terserOptions: {
compress: {
pure_getters: true,
passes: 2
}
}
Это особенно эффективно для удаления:
Автоматическое подключение полифиллов часто становится главным источником лишнего веса.
Типичные проблемы:
core-js целиком,Решение:
@babel/preset-env с
useBuiltIns: 'usage',presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
При анализе бандла часто обнаруживается:
Причины:
package.json,Методы борьбы:
resolutions (Yarn),dedupe в Rollup,alias в Webpack.Пример alias:
resolve: {
alias: {
'inferno': path.resolve('./node_modules/inferno')
}
}
Inferno часто выбирают ради минимального размера, но этот эффект легко теряется при подключении неподходящих библиотек.
Примеры замены:
moment → dayjslodash → точечные импорты или нативные методыInferno не требует обёрток для большинства утилит, что упрощает замену.
Ключевая метрика — размер первого загружаемого чанка.
Оптимальный состав:
Всё остальное должно загружаться позже.
Практика:
Оптимизация размера теряет смысл без правильного кэширования.
Рекомендуется:
Webpack:
output: {
filename: '[name].[contenthash].js'
}
Это снижает повторную загрузку Inferno-кода при изменении бизнес-логики.
Размер бандла должен рассматриваться как регрессионная метрика.
Подходы:
Inferno позволяет удерживать очень малый footprint, но только при постоянном контроле структуры сборки и зависимостей.