Stencil предоставляет гибкий механизм компиляции компонентов,
позволяющий адаптировать процесс сборки под специфические требования
проекта. Основой кастомизации является конфигурационный файл
stencil.config.ts, где задаются опции компилятора, плагины
и инструменты трансформации кода.
Основной объект конфигурации имеет тип Config и включает
ключевые параметры:
import { Config } from '@stencil/core';
export const config: Config = {
namespace: 'my-components',
outputTargets: [
{ type: 'dist' },
{ type: 'www' }
],
globalStyle: 'src/global/app.css',
tsconfig: 'tsconfig.json'
};
Ключевые моменты:
namespace — пространство имен, которое используется при
генерации тегов веб-компонентов.outputTargets — массив целей сборки, где каждая цель
описывает формат вывода: dist для библиотек,
www для веб-приложений.globalStyle — глобальные стили, подключаемые к каждому
компоненту.tsconfig — путь к TypeScript-конфигурации, позволяющий
контролировать строгую типизацию и поддерживаемые версии
ECMAScript.Stencil поддерживает расширение компиляции через плагины, реализующие
интерфейс CompilerPlugin. Плагин может модифицировать AST,
добавлять или удалять файлы, выполнять трансформации стилей и
шаблонов.
Пример плагина для автоматической генерации документации:
import { CompilerPlugin, CompilerCtx, BuildContext } from '@stencil/core/internal';
export const docPlugin: CompilerPlugin = {
name: 'doc-plugin',
async load(config, compilerCtx: CompilerCtx, buildCtx: BuildContext) {
buildCtx.components.forEach(component => {
console.log(`Генерация документации для: ${component.tagName}`);
});
}
};
Плагины подключаются в конфигурации через массив
plugins:
export const config: Config = {
namespace: 'my-components',
plugins: [docPlugin]
};
Stencil использует собственный JSX-препроцессор. Компиляция JSX управляется через опции:
jsx — режим генерации кода: preserve,
react или react-jsx.hydrateClientSide — включение гидратации компонентов на
стороне клиента.sourceMap — генерация карты исходников для
отладки.export const config: Config = {
namespace: 'my-components',
tsconfig: 'tsconfig.json',
buildEs5: true,
sourceMap: true,
copy: [{ src: 'assets', dest: 'build/assets' }]
};
Stencil позволяет настраивать обработку стилей на уровне компонентов:
scoped — использовать scoped CSS вместо Shadow
DOM.shadow — включить Shadow DOM для изоляции стилей.styleUrl и styles — указание внешних и
встроенных стилей для компонента.Пример:
@Component({
tag: 'my-button',
styleUrl: 'my-button.css',
shadow: true
})
export class MyButton {
render() {
return <button class="btn">Нажми меня</button>;
}
}
Stencil позволяет внедрять кастомные трансформации TypeScript и HTML:
transformers — массив функций для модификации AST перед
генерацией кода.Stencil предоставляет API для программного управления сборкой:
import { build } from '@stencil/core';
build({
config: { namespace: 'custom-build' },
devMode: false
}).then(() => console.log('Сборка завершена'));
Через API можно:
Компилятор Stencil позволяет управлять оптимизациями:
minifyJs и minifyCss — минификация кода и
стилей.hashedFileNames — добавление хешей к именам файлов для
кэширования.rollupPlugins — подключение дополнительных плагинов
Rollup для трансформации и оптимизации бандла.export const config: Config = {
namespace: 'my-components',
minifyJs: true,
minifyCss: true,
hashedFileNames: true
};
Использование этих возможностей обеспечивает гибкую и точную кастомизацию процесса компиляции компонентов, позволяя интегрировать Stencil в любые архитектуры проектов и поддерживать высокое качество и производительность веб-компонентов.