Haunted — это библиотека для создания веб-компонентов на основе функциональных компонентов в стиле React. Она минималистична, что делает её гибкой, но требует тщательной настройки инструментов сборки для работы в современных проектах. Понимание того, как интегрировать Haunted с инструментами вроде Vite, Webpack или Rollup, критически важно для производительности и масштабируемости приложений.
Haunted не накладывает строгих ограничений на структуру проекта. Обычно структура включает следующие папки:
src/
components/
utils/
index.js
public/
index.html
package.json
Файл index.js является точкой входа. В нём
регистрируются веб-компоненты и создаются основные точки монтирования.
Для работы с Haunted необходимы следующие зависимости:
"dependencies": {
"haunted": "^5.0.0"
},
"devDependencies": {
"vite": "^4.0.0",
"rollup-plugin-terser": "^7.0.0"
}
Haunted поддерживает современные ES-модули, поэтому сборка должна
быть настроена на работу с import и
export.
Vite обеспечивает мгновенную перезагрузку модулей и минимальную конфигурацию. Для Haunted важно включить поддержку веб-компонентов и JSX (если используется).
Пример базового vite.config.js:
import { defineConfig } from 'vite';
export default defineConfig({
build: {
target: 'esnext',
rollupOptions: {
output: {
format: 'esm'
}
}
}
});
Ключевые моменты:
target: 'esnext' позволяет использовать нативные
ES-модули без транспиляции.esm обеспечивает корректное подключение
компонентов в браузере.Haunted компоненты можно импортировать напрямую:
import { html, render } from 'haunted';
import './components/my-component.js';
const root = document.getElementById('app');
render(html`<my-component></my-component>`, root);
Для больших проектов часто используется Webpack, так как он позволяет более тонко управлять сборкой и загрузкой модулей. Основные шаги:
npm install webpack webpack-cli babel-loader @babel/core @babel/preset-env --save-dev
webpack.config.js:const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
};
Важно: Haunted использует современные возможности JavaScript, поэтому настройка Babel позволяет корректно транспилировать код для старых браузеров, если это необходимо.
Rollup подходит для создания переиспользуемых
библиотек на Haunted. Он минимизирует размер и позволяет экспортировать
компоненты как ES-модули. Пример rollup.config.js:
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'
},
plugins: [
resolve(),
commonjs(),
terser()
]
};
Преимущества:
terser.resolve и
commonjs.Haunted не имеет встроенного CSS-in-JS. Для интеграции стилей применяются стандартные подходы:
html:import { html, component } from 'haunted';
function myComponent() {
return html`
<style>
p { color: blue; }
</style>
<p>Hello Haunted</p>
`;
}
customElements.define('my-component', component(myComponent));
import './style.scss';
Rollup и Webpack также поддерживают загрузку CSS через
соответствующие плагины (rollup-plugin-postcss,
css-loader).
Для производственных сборок важно минимизировать размер и ускорить загрузку:
dynamic import() для ленивой загрузки компонентов.Пример динамической загрузки компонента с Haunted:
const loadComponent = async () => {
const module = await import('./components/my-component.js');
document.body.appendChild(document.createElement('my-component'));
};
loadComponent();
После настройки инструментов сборки важно проверить:
Haunted, будучи легковесной библиотекой, позволяет гибко комбинировать современные инструменты сборки, обеспечивая высокую производительность и модульность проектов.