A fondo
Lo que queda fuera
Lo que Ascua no hace a propósito, y por qué. No son cosas pendientes.
Cada cosa que un framework hace la paga quien lo usa: en bytes, en conceptos o en comportamiento que no se ve. Estas se dejaron fuera después de pensarlas.
Vistas con varias raíces
Una plantilla tiene un único elemento raíz. Es lo que permite que montar,
desmontar e hidratar sean operaciones sobre un nodo, sin fragmentos que
recordar ni rangos que mantener. Donde los fragmentos hacen falta —el contenido
que recibe un componente, una rama de <Show>— sí están.
Insertar nodos con ${expr}
Un hueco es siempre texto. Distinguir por el tipo del valor —un string es texto, un nodo se inserta, un array se expande— exige adivinar la intención, y abre la puerta a inyectar HTML sin querer. Para componer árboles, un componente.
JSX, hooks y Server Components
No se busca compatibilidad con el ecosistema de React. JSX obliga a
className y a un paso de transformación que ya existe aquí para otra cosa; los
hooks son la respuesta a un modelo de re-render que Ascua no tiene; y los Server
Components resuelven un problema —mezclar componentes de servidor y cliente en
un mismo árbol— que las islas resuelven con menos maquinaria.
Delegación de eventos
on pone un listener en cada nodo. La alternativa —uno en la raíz que mira de
dónde vino el click— se probó y se descartó con números: construir 1.000 filas
cuesta 1,7 ms con un listener cada una y 1,5 ms delegando; con 5.000, 9,5
contra 7,2.
Dos décimas de milisegundo en una tabla grande no pagan los bytes que añadiría
al runtime ni la semántica prestada: un stopPropagation que ya no para nada,
o eventos que no existen en el nodo donde se escribieron.
Un contexto para compartir estado
No hay Provider ni useContext. Un signal es un valor: se comparte
exportándolo de un módulo o pasándolo por props, como cualquier otro. Lo que un
contexto añade —estado distinto por subárbol— se consigue pasando el signal a
ese subárbol.
Un store con proxies
Un signal guarda una referencia, y cambiar un objeto por dentro no avisa. Los
stores que interceptan cada propiedad con un Proxy resuelven eso a costa de
que leer un campo tenga un coste escondido y de que el objeto deje de ser lo
que parece. Aquí se escribe un valor nuevo —update((l) => [...l, x])— o se
pone un signal en el campo que cambia.