Em projetos pessoais estou usando lit-html (https://lit.dev/docs/libraries/standalone-templates/) puro, só para renderizar jsx, bind de propriedades e ações.
Daí combino com webcomponents.
ex
import {render} from '<cdn>'
class Component extends HTMLElement {
constructor() {
super({});
}
connectedCallback() {
render(this.template())
}
template() {
throw Error('not implemented')
}
}
import {html} from 'cdn';
class MyPage extendes Component {
constructor() {
super();
}
teste(){
console.log('teste');
}
template() {
return html`<div>
<button @click=${ e => this.teste()}> Teste </button>
`;
}
}
customElements.define('app-my-page', MyPage)
Daí é só importar a o componente na página que for utilizar.