
Última actualización: 28 de mayo de 2026
Quire (53 992 líneas, 1620 KB de Dart) se creó en 2014 con Dart tanto en el cliente como en el servidor, y usó DQuery y Bootjack en lugar de AngularDART o Polymer.dart para controlar mejor el DOM. Las decisiones clave (tipado fuerte en todo el stack, modelos de datos compartidos entre cliente y servidor, bucle de eventos en el servidor y tree shaking para generar JS) siguen vigentes en 2026.
Quire no es la primera aplicación web escrita en Dart ni será la última, pero podría ser la primera que depende tanto de Dart, tanto en el cliente como en el servidor.

Es un divertido gestor de tareas con estructura de árbol en su esencia. El proyecto tiene 53992 líneas y 1620 KB de código Dart, y está construido con algunas bibliotecas de código abierto de la comunidad.
Antes de empezar este proyecto, éramos entusiastas de Dart conocidos como el equipo de Rikulo, y habíamos publicado varias bibliotecas de Dart, entre ellas un framework de interfaz, una biblioteca de interfaz, un servidor web, un servidor de mensajería y un cliente de base de datos.
Cuando Dart se lanzó en 2011, nos entusiasmó el valor de su futuro y enseguida empezamos a usarlo en pequeñas partes de proyectos. Con el tiempo pasamos a crear una aplicación completa hecha en su mayor parte con Dart. Aquí queremos compartir con humildad parte de nuestra experiencia, con la esperanza de aportarte información sobre cómo es desarrollar en Dart.
Hay muchísimas razones para elegir Dart. Las más importantes para nosotros son:
Elegir Dart también tiene contras:
Gracias al soporte de tipado fuerte, escribir en Dart es mucho más fiable que hacerlo en JavaScript. Además, Dart es menos verboso que Java y, a veces (por ejemplo, con las expresiones de función), incluso menos que JavaScript puro. En general, trabajar con Dart es cómodo, salvo por algunas cosas:
Hasta que la máquina virtual de Dart llegue a Chrome, lo normal es entregar el producto compilándolo a JavaScript. Hay muchísimos lenguajes que compilan a JavaScript, pero Dart destaca por algunas ventajas adicionales.
Dart en el servidor nunca fue un tema candente en la comunidad de Dart, pero lo consideramos un candidato sólido como lenguaje de servidor, porque:
Relacionado: Quire obtiene la certificación ISO para proteger tus datos — el mismo énfasis en la robustez y la seguridad del servidor aparece años después en la certificación formal de protección de datos de Quire.
Quire se construye con alrededor de 30 importaciones de bibliotecas, de las cuales 10 vienen de la comunidad y el resto las publica el equipo de Dart. Si eres experto en Dart, quizá supongas que están AngularDART y Polymer.dart, pero en realidad ninguno de los dos está presente.
No usamos AngularDART, porque:
Tampoco usamos Polymer.dart, porque:
Las piedras angulares de nuestro stack de cliente son DQuery y Bootjack, dos proyectos de código abierto publicados por el equipo de Rikulo:
Construimos nuestro stack de aplicación de este modo para aprovechar nuestros conocimientos y habilidades del mundo JavaScript.
Stream es nuestro servidor web, escrito en Dart puro y equipado con enrutamiento, filtros, MVC del lado del servidor, etc. Stream funciona sin fricciones con el modelo de bucle de eventos. Escribir un controlador de solicitudes consiste simplemente en encadenar una secuencia de rutinas no bloqueantes.
Es más productivo y también más agradable que el modelo tradicional de multihilo. Además, escalamos nuestro servicio web y gestionamos HTTPS con nginx, y delegamos las solicitudes en Stream. Con esta arquitectura podemos iniciar y detener máquinas virtuales de Dart de forma individual y actualizar el servidor sin interrumpir la actividad de los usuarios.
Trabajar con Dart ha sido una experiencia agradable, y esperamos con ilusión nuevos avances en la comunidad de Dart. Por último, si tienes curiosidad por lo que puedes lograr con Dart, ven a probar nuestra aplicación, Quire. ¡Es gratis!
Más información sobre cómo se reimaginó y se reconstruyó Quire como Mark II.

Tanto el lenguaje Dart como el código de Quire han evolucionado mucho desde que se escribió este artículo. Dart 2.0 (sistema de tipos sólido) llegó en 2018, Dart 3.0 (null safety, records, patrones) en 2023, y Flutter cambió el panorama de la interfaz multiplataforma (el propio equipo móvil de Quire se pasó a él). Pero las decisiones de arquitectura que se documentan arriba resisten mejor de lo que cabría esperar.
El tipado fuerte en cliente y servidor sigue compensando. Los errores de ejecución que un sistema de tipos fuerte detecta en compilación siguen siendo los mismos. JavaScript avanzó en parte hacia el tipado con TypeScript, pero un stack totalmente tipado de punta a punta sigue siendo raro. La clase de errores que mencionó Simon (incontables errores pequeños) es la misma que un stack sin tipos lleva a producción.
Compartir modelos de datos entre cliente y servidor sigue ahorrando trabajo. El problema del modelo duplicado (uno en JS, otro en Python, desajustándose en silencio) es el mismo en 2026 que en 2014. La solución (un solo lenguaje de punta a punta) también. Los equipos de TypeScript sobre Node construyen arquitecturas al estilo de Quire por esta misma razón.
El bucle de eventos sigue ganando al multihilo en los servidores web. Node, Deno, Bun y el propio patrón Stream de Dart coinciden en esto. El argumento se ha vuelto a discutir cada pocos años y siempre llega a la misma conclusión.
El tree shaking importa más, no menos. En 2014, el compilador de Dart con tree shaking era un factor diferenciador. En 2026, es lo mínimo exigible a cualquier pipeline de compilación que genere JS. Webpack, Rollup, esbuild y Vite lo hacen. La lección sigue en pie; las herramientas se pusieron al día.
Las preocupaciones de 2014 sobre ShadowDOM quedaron en su mayoría resueltas. Polymer.dart quedó obsoleto. Los Web Components maduraron. Las razones que dio Simon para evitar Polymer (inyección de estilos, colaboración con frameworks) acabaron resolviéndose en la propia plataforma. El principio general (evitar los frameworks de vanguardia para el núcleo de una aplicación en producción) sigue vigente en 2026 para el framework «emocionante» del momento.
Relacionado: Así se hizo: una cronología móvil basada en Flutter — un vistazo a cómo el equipo móvil de Quire usó Flutter para crear una vista de cronología.
Elegir el stack de lenguajes de una aplicación a varios años es una de las pocas decisiones de ingeniería que resultan caras de revertir. Cuando los equipos se equivocan, se repiten cuatro patrones.
1. Elegir por defecto el lenguaje con la comunidad más grande. JavaScript tiene la comunidad más grande, pero «la más grande» no equivale a «la que mejor encaja con tu problema». Un lenguaje con un sistema de tipos fuerte, buenas herramientas y una comunidad más pequeña puede superar a un ecosistema enorme con garantías débiles. El tamaño de la comunidad importa, pero no es lo único que importa.
2. Elegir un stack que separa los lenguajes de cliente y servidor. Cada modelo de datos duplicado es un error en potencia. Los equipos que usan Ruby en el servidor y JS en el cliente arrastran ese coste para siempre. Los que comparten un único lenguaje en ambas capas (Dart, TypeScript, Kotlin) evitan toda una categoría de errores.
3. Adoptar lo más novedoso antes de que se estabilice. El equipo de Quire evitó AngularDART y Polymer.dart en 2014 porque ambos tenían cuestiones de arquitectura abiertas. AngularDART dio un giro brusco y Polymer quedó obsoleto. La regla general (deja que un framework se demuestre en producción a gran escala antes de apostar por él el núcleo de tu aplicación) sigue vigente en 2026 para el framework «emocionante» del momento.
4. Prescindir del sistema de tipos por velocidad a corto plazo. Los lenguajes sin tipos parecen más rápidos en la primera semana. Al sexto mes, el tiempo ahorrado se paga con creces en depuración. Los equipos de ingeniería que han vivido a escala tanto stacks sin tipos como con tipos casi nunca vuelven atrás por voluntad propia.
La apuesta de 2014 del equipo de Quire por Dart parece razonable en retrospectiva, no porque Dart se haya vuelto dominante (no lo hizo), sino porque los criterios de fondo (tipado, cliente y servidor compartidos, bucle de eventos, tree shaking) se convirtieron en consenso de la industria durante la década siguiente.
Lo que envejeció bien fueron los principios de ingeniería de fondo, no las herramientas concretas. Ese patrón suele cumplirse en cualquier elección de lenguaje hecha con incertidumbre: elige por principios que puedas defender dentro de una década, no por una popularidad que puedes medir hoy.
Dart, tanto en el cliente como en el servidor. La aplicación tiene alrededor de 54 000 líneas de código Dart, con unas 30 importaciones de bibliotecas.
Tipado fuerte, un modelo de herencia basado en clases y un solo lenguaje en cliente y servidor. Dart también ofrecía algunas funciones modernas antes de que JavaScript las admitiera de forma generalizada.
El equipo quería un control del DOM más fino que el que permitía el enlace de AngularDART, y los patrones de arquitectura de Quire no encajaban con la lógica de Angular. Se evitó Polymer.dart porque, en aquel momento, ShadowDOM chocaba con los selectores al estilo de Bootstrap. Más tarde Polymer quedó obsoleto, lo que validó la decisión.
Bibliotecas de código abierto del equipo de Rikulo (el equipo de ingeniería de Quire). DQuery es un port parcial de jQuery a Dart centrado en la delegación de eventos. Bootjack es un port completo de Bootstrap 3 con CSS y API casi idénticos.
El servidor web de Quire, escrito en Dart puro y basado en el modelo de bucle de eventos. Incluye enrutamiento, filtros y MVC del lado del servidor. Quire ejecuta Stream detrás de nginx, que se encarga del escalado y de HTTPS.