Stencil — это современный компилятор для создания веб-компонентов на основе стандартов Web Components. Он объединяет преимущества реактивного программирования и нативных браузерных технологий, обеспечивая высокую производительность и модульность. Компоненты Stencil компилируются в легковесный код, совместимый с любыми современными браузерами, без необходимости подключения большого фреймворка в runtime.
Ключевые особенности Stencil:
@Prop,
@State) для автоматического обновления интерфейса.Stencil разделяет код на несколько уровней:
@Prop) и состояния (@State) создают
реактивные связи.componentWillLoad, componentDidLoad,
componentShouldUpdate управляют стадиями инициализации и
обновления.@Prop — свойства, передаваемые родительским компонентом. Изменение значения автоматически триггерит перерисовку:
@Component({ tag: 'my-component', styleUrl: 'my-component.css' })
export class MyComponent {
@Prop() title: string;
render() {
return <h1>{this.title}</h1>;
}
}
@State — локальное состояние компонента. Используется для внутренних изменений, которые не затрагивают родителя:
@Component({ tag: 'counter-component' })
export class CounterComponent {
@State() count = 0;
increment() {
this.count += 1;
}
render() {
return <button onCl ick={() => this.increment()}>{this.count}</button>;
}
}
@Watch — позволяет отслеживать изменения свойств и выполнять действия при обновлении:
@Watch('title')
onTitleChange(newValue: string, oldValue: string) {
console.log(`Title changed from ${oldValue} to ${newValue}`);
}
Stencil предоставляет несколько методов жизненного цикла:
Эти методы помогают контролировать поведение компонентов и оптимизировать производительность.
При разработке с Stencil важно учитывать потенциальные уязвимости:
XSS (Cross-Site Scripting) JSX в Stencil по
умолчанию экранирует данные, но прямое использование
innerHTML может привести к уязвимостям:
@Prop() htmlContent: string;
render() {
return <div innerHTML={this.htmlContent}></div>; // опасно без очистки
}
Решение: использовать библиотеки для безопасной очистки HTML или избегать прямого вставления пользовательского ввода.
Injection атак на свойства Передача
неконтролируемых данных через @Prop может быть опасной,
если данные используются для формирования запросов к серверу или
динамических скриптов.
Проблемы с CSP (Content Security Policy) Использование inline-скриптов или стилей может нарушать политики безопасности. Stencil поддерживает генерацию стилей и скриптов через отдельные файлы, что облегчает соблюдение CSP.
Lazy Loading и контроль зависимостей Подгружаемые динамически компоненты могут включать небезопасный код. Важно проверять сторонние зависимости и использовать проверенные пакеты.
Shadow DOM и инкапсуляция стилей Shadow DOM защищает компонентные стили и структуру, но уязвимости могут появляться при взаимодействии с глобальными скриптами или unsafe HTML.
node_modules.innerHTML, eval,
document.write.Эти подходы снижают риск внедрения уязвимостей и делают архитектуру компонентов Stencil безопасной и устойчивой.