Одна из самых распространённых проблем — некорректная настройка
проекта. Stencil требует строгого соответствия структуре каталогов и
конфигурации stencil.config.ts. Часто ошибки появляются
при:
src/components@stencil/core,
typescript)Решения:
npm init stencil для
автоматической генерации структуры.tsconfig.json на корректность путей и
целевых версий.Stencil использует TypeScript и Rollup, поэтому частыми являются ошибки сборки:
Cannot find module при импортах компонентов@Prop(),
@State(), @Event())Решения:
npm run build -- --debug для вывода
подробного лога.@Prop() и @State().Stencil активно использует реактивность через @State и
@Prop. Частые проблемы:
Решения:
this.items = [...this.items, newItem];
this.obj.prop = value), вместо этого создавать новый
объект:this.obj = { ...this.obj, prop: value };
@EventОшибки с пользовательскими событиями:
detail всегда пустойРешения:
{ bubbles: true, composed: true } при
создании события:@Event({ bubbles: true, composed: true }) myEvent: EventEmitter<string>;
this.myEvent.emit(data) для передачи
данных.Stencil по умолчанию использует Shadow DOM, что иногда вызывает проблемы со стилями:
Решения:
:host для стилизации корневого элемента
компонента::host {
display: block;
color: red;
}
@import в global.css или
:host-context() для контекста::host-context(.theme-dark) {
background: black;
}
::part и ::slotted.Stencil поддерживает ленивую загрузку компонентов и встроенный роутер. Частые проблемы:
custom element not definedРешения:
const lazyComponent = await import('./my-component');
export в index.ts.Ошибки производительности возникают при:
Решения:
@State и @Prop,
объединяя связанные данные.shouldComponentUpdate для контроля
перерендеров:shouldComponentUpdate(newValue, oldValue) {
return newValue !== oldValue;
}
Stencil легко интегрируется с React, Angular, Vue, но типичные ошибки:
Решения:
react-wrapper или
defineCustomElements(window).Тестирование компонентов Stencil через Jest и E2E часто сталкивается с:
Решения:
newSpecPage для юнит-тестов:const page = await newSpecPage({
components: [MyComponent],
html: `<my-component></my-component>`
});
page.find('selector') с учётом
Shadow DOM.slot и shadowRoot правильно,
чтобы элементы были доступны для тестов.Эти подходы и практики позволяют минимизировать распространённые ошибки при разработке с использованием Stencil и обеспечивают стабильность компонентов при масштабировании проекта.