Продакшен-сборка в Haunted требует особого подхода, так как библиотека ориентирована на легковесные Web Components с реактивной моделью. Основная цель — минимизировать размер итогового кода, оптимизировать производительность и обеспечить кроссбраузерную совместимость.
Haunted построен на основе стандартов Web Components и не требует больших runtime-бандлов. Однако при использовании в крупных приложениях рекомендуется объединять компоненты в один пакет. Для этого обычно используют сборщики типа Rollup или Webpack.
Пример конфигурации Rollup:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm',
sourcemap: true,
},
plugins: [
resolve(),
commonjs(),
terser({ module: true }) // минимизация для продакшена
]
};
Ключевой момент — включение terser с параметром
module: true, чтобы минимизировать код с учетом ES-модулей.
Это уменьшает размер итогового бандла и ускоряет загрузку страницы.
Haunted поддерживает tree shaking благодаря своей
модульной структуре. Функции html, component,
useState, useEffect можно импортировать
отдельно:
import { html, component, useState } from 'haunted';
При сборке с Rollup или Webpack неиспользуемые функции будут исключены из итогового бандла. Это позволяет избежать лишнего кода и поддерживать минимальный размер.
Компоненты Haunted часто используют встроенные стили через шаблон
html. Для продакшен-сборки рекомендуется:
<link>.Пример инлайн-стиля с минификацией:
const styles = html`
<style>
div{display:flex;align-items:center;justify-content:center}
p{margin:0;color:#333;font-size:14px}
</style>
`;
Даже простая минификация снижает вес страницы, что критично для продакшен-приложений.
Haunted поддерживает Server-Side Rendering (SSR)
через функцию render. Для продакшен-сборки полезно
генерировать HTML на сервере и отправлять готовую разметку, чтобы
ускорить первую загрузку.
Пример использования SSR:
import { render } from 'haunted/ssr';
import { myComponent } from './components/my-component.js';
const htmlString = render(myComponent, { prop: 'value' });
// htmlString можно отправлять в ответ сервера
После загрузки на клиенте компоненты автоматически гидратируются, сохраняя реактивность. Для продакшена это уменьшает время до интерактивности и снижает нагрузку на браузер.
Для крупных приложений критически важно использовать ленивую загрузку. Haunted компоненты можно динамически импортировать:
const loadComponent = async () => {
const module = await import('./components/heavy-component.js');
customElements.define('heavy-component', module.default);
};
Lazy loading уменьшает первоначальный бандл и ускоряет первую отрисовку страницы. Совместно с SSR это позволяет эффективно балансировать между размером загрузки и интерактивностью.
useEffect и другие хуки в Haunted вызываются при каждом
обновлении компонента. В продакшене стоит:
Пример правильного использования:
import { useEffect, useState } from 'haunted';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => setCount(c => c + 1), 1000);
return () => clearInterval(timer);
}, []); // Пустой массив зависимостей предотвращает лишние вызовы
}
Такой подход снижает нагрузку на браузер и уменьшает количество перерисовок, что критично для производительности продакшен-приложений.
Для продакшен-бандлов рекомендуется создавать минифицированный код с source maps, чтобы сохранять возможность отладки без утяжеления основного кода:
output: {
file: 'dist/bundle.min.js',
format: 'esm',
sourcemap: true
}
Также важно различать окружения:
if (process.env.NODE_ENV === 'production') {
// отключение логов и предупреждений
}
Haunted не добавляет лишние runtime-логгеры, но сторонние библиотеки, интегрированные с компонентами, могут потребовать таких проверок.
Эти практики позволяют создавать быстрые и лёгкие веб-приложения на Haunted без потери функциональности и реактивности.