Haunted — это библиотека для создания веб-компонентов на основе Web Components с использованием реактивного подхода, похожего на React Hooks. Основное преимущество Haunted — минимальный размер и высокая производительность, однако при работе с крупными проектами важно правильно управлять бандлом, чтобы минимизировать время загрузки и потребление ресурсов.
1. Использование ES Modules Haunted полностью поддерживает ES Modules. Это позволяет подключать только необходимые функции, избегая импорта всего пакета. Например:
import { html, component, useState } from 'haunted';
Подключение через import Haunted from 'haunted';
приведет к включению всего пакета, что увеличивает размер бандла.
2. Tree Shaking Tree Shaking — процесс удаления неиспользуемого кода из бандла при сборке. Для Haunted достаточно использовать современные сборщики (Webpack, Rollup, Vite), поддерживающие ESM.
Пример настройки Rollup:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'esm',
},
plugins: [
resolve(),
commonjs(),
terser() // минификация
]
};
Для крупных приложений важно разделять код на части, загружаемые по необходимости. Haunted полностью совместим с динамическим импортом:
const loadComponent = async () => {
const { MyComponent } = await import('./components/my-component.js');
customElements.define('my-component', MyComponent);
};
Lazy Loading позволяет уменьшить первоначальный размер бандла и ускоряет первый рендер страницы.
1. Terser и другие минификаторы Минификация удаляет пробелы, комментарии и сокращает имена переменных. Для Haunted это особенно эффективно, так как библиотека сама по себе небольшая, и минимизация позволяет уменьшить вес проекта до нескольких килобайт.
2. Gzip/Brotli На стороне сервера рекомендуется включать сжатие Gzip или Brotli. Haunted и приложения на его основе отлично сжимаются, так как код сильно повторяемый и лаконичный.
1. Инлайнинг стилей Haunted часто используется с
шаблонами html и CSS в шаблоне. Инлайнинг критических
стилей уменьшает количество дополнительных запросов и ускоряет
отображение:
html`
<style>
:host { display: block; color: #333; }
</style>
<div>Контент компонента</div>
`
2. CSS-in-JS и разделение стилей Для больших
проектов стоит вынести общие стили в отдельные CSS-файлы и подключать их
через <link>, а уникальные для компонентов
инлайнировать. Это уменьшает повторение кода и размер JS-бандла.
1. Использование реактивных хуков правильно Haunted
использует хуки useState, useEffect и другие.
Избыточное обновление состояния увеличивает нагрузку на рендер, а значит
и на производительность.
const Counter = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(prev => prev + 1);
return html`<button @click=${increment}>${count}</button>`;
};
Важно избегать создания новых функций внутри шаблона без необходимости, так как это вызывает повторные рендеры.
2. Memoization шаблонов Можно кэшировать части шаблона, которые не зависят от состояния:
const staticTemplate = html`<p>Статический текст</p>`;
const Component = () => {
const [value, setValue] = useState(0);
return html`
${staticTemplate}
<span>${value}</span>
`;
};
Haunted поддерживает динамическое определение компонентов, что облегчает сплиттинг кода. В крупных приложениях целесообразно делить бандл на логические блоки:
Это снижает вес основного бандла и ускоряет время первого контента (First Contentful Paint).
Haunted имеет минимальные зависимости, но проект может использовать сторонние библиотеки. Для уменьшения размера бандла:
Эти подходы позволяют создавать быстрые, компактные и легко поддерживаемые веб-приложения с Haunted, максимально используя преимущества реактивного подхода и Web Components.