Ingeniería de navegadores web (2021)
(browser.engineering)- Web Browser Engineering cubre desde redes hasta JavaScript y propone crear tú mismo un navegador web básico pero completo con varios miles de líneas en Python
- El recorrido de aprendizaje va desde la carga de páginas hasta la visualización de documentos, la ejecución de aplicaciones y funciones de navegadores modernos, conectando en orden HTTP, HTML, CSS, DOM, seguridad y el pipeline de renderizado
- La parte inicial se enfoca en la implementación de fundamentos del navegador, como URL y solicitudes HTTP, creación de ventanas y dibujo en canvas, además de ajuste de línea y espaciado entre líneas de texto
- La parte media y avanzada incluye construcción del árbol HTML, layout, aplicación de estilos, envío de formularios, respuesta a eventos, cookies e inicio de sesión, además de XSS y CSRF
- La parte final abarca composición, event loop, animaciones con GPU, árbol de accesibilidad, iframe, invalidación y precisión en la edición, ofreciendo una mirada amplia a los elementos de implementación de los navegadores modernos
Aprender la estructura del navegador implementándolo directamente
- Web Browser Engineering está organizado para entender cómo funciona un navegador web mediante la implementación directa de un navegador básico pero completo
- El lenguaje de implementación es Python y el tamaño total de la implementación es de varios miles de líneas
- El alcance va desde redes hasta JavaScript
- El libro impreso se puede comprar en Bookshop, B&N y Amazon
- Hay ediciones traducidas en Hanbit para coreano y O’Reilly para japonés
- Las actualizaciones se pueden seguir en el blog, Mastodon y Twitter, y también hay un foro de discusión en GitHub
Flujo del índice
-
Introducción
-
Part 1: Loading Pages
- Downloading Web Pages: URL y solicitudes HTTP
- Drawing to the Screen: creación de ventanas y dibujo en canvas
- Formatting Text: ajuste de palabras y espaciado entre líneas
-
Part 2: Viewing Documents
- Constructing an HTML Tree: parsing y modificación de HTML
- Laying Out Pages: layout inline y de bloque
- Applying Author Styles: parsing y aplicación de CSS
- Handling Buttons and Links: hipervínculos y chrome del navegador
-
Part 3: Running Applications
- Sending Information to Servers: envío de formularios y servidor web
- Running Interactive Scripts: cambios del DOM y respuesta a eventos
- Keeping Data Private: cookies, inicio de sesión, XSS, CSRF
-
Part 4: Modern Browsers
- Adding Visual Effects: blending, clipping y composición
- Scheduling Tasks and Threads: event loop y pipeline de renderizado
- Animating and Compositing: animaciones fluidas usando GPU
- Making Content Accessible: entrada por teclado, zoom y árbol de accesibilidad
- Supporting Embedded Content: imágenes, iframe y scripting
- Reusing Previous Computation: invalidación, edición y precisión
-
Cierre y apéndices
1 comentarios
Opiniones de Hacker News
Algo bueno de este libro es que dedica una parte aparte a “lo que no hizo”.
El layout es realmente difícil, e incluso manejar solo tablas sin CSS ya es complicado. Si además entra CSS, el layout se vuelve tan complejo que es casi imposible.
Me pregunto si hay alguien capaz de tener en la cabeza toda la especificación de CSS y sus comportamientos relacionados. El CSS+HTML+JavaScript actual se ha acercado más a un lenguaje de tecnología de páginas dinámicas (PDL), y probablemente sea uno de los softwares más complejos de hoy.
Además, la decodificación de video se descarga al hardware, así que ya no consume tanta batería como antes.
Por ejemplo, este archivo solo implementa contextos de bloque/inline; tiene algo de boilerplate de Rust, pero la mayor parte es lógica real que aborda varias partes de la especificación. Hay una carpeta llena de archivos así: https://github.com/servo/servo/blob/main/components/layout/f...
Aun así, implementar un motor de layout es posible. CSS no es magia: hay una especificación que puede trasladarse cuidadosamente a código. Mostrar este tipo de código a quienes se frustran porque CSS parece arbitrario ayuda a entender que también hay lógica en el entorno de ejecución.
Claro, no es algo en lo que uno vaya a hacer clic seguido como cuando revisa la implementación de una biblioteca, pero en ese sentido no creo que sea muy distinto de algo como React.
Primero, las partes más centrales del layout, como CSS 2, fueron diseñadas de forma bastante desprolija, y funciones raras interactúan entre sí de maneras raras. Cosas como float y clearance, o el colapso de márgenes. Parte de este núcleo se pensó para usarse de forma universal en todos los modos de layout, pero no encaja bien con otros modos. Por ejemplo, margin y padding no tienen un propósito claro en elementos grid.
Segundo, no está bien modularizado como las API de JavaScript. Las API de JavaScript suelen implementarse de forma independiente, pero los módulos de layout pueden anidarse de muchas maneras, así que todos se afectan entre sí. Las especificaciones más nuevas, como grid, intentan ser más estrictas, pero existe el problema fundamental de que varios modos de layout tienen que compartir un recurso común: una pantalla 2D real.
No puedo ser el único que quiere un lenguaje de layout más simple que CSS, pero que incorpore las lecciones de los últimos 20 años para maximizar el producto entre simplicidad y expresividad. Me pregunto si hay algún proyecto que esté diseñando algo así en serio, o si todos aceptaron CSS3 y están esperando un backend LLVM, o simplemente volvieron al texto plano.
https://github.com/facebook/yoga
El layout no tiene por qué ser tan complejo. Hay decenas de frameworks GUI con sistemas de layout más simples, y para las aplicaciones que usa la gente son suficientes.
Se ve genial. Hace unos 15 años empecé a crear un navegador headless y lo mantuve durante varios años.
Usaba SpiderMonkey como intérprete de JavaScript e implementé el DOM por mi cuenta. Ejecutaba todo el JavaScript moderno de la época, AJAX y demás, y más tarde incluso agregué un runtime Flash personalizado. Era un proyecto que hacía casi todo excepto dibujar en pantalla, así que fue muy divertido.
Tengo muchas ganas de leer este libro.
Me alegra que la ingeniería de navegadores parezca estar volviéndose una tendencia
El ecosistema está, en la práctica, en un estado bastante pobre, definido solo por Google, Apple y Mozilla. Me gustaría ver un futuro con más motores de navegador independientes
El área interesante son las tecnologías de UI/documentos no basadas en HTML. Typst, en otro hilo, es como un LaTeX mejorado, y Markdown también tuvo un gran impacto. Hay mucho espacio para crear “HTML, pero mejor”. Ni siquiera tiene que ser necesariamente un formato de marcado. Typst y React HTML difuminan la frontera entre código y datos, y Jetpack Compose muestra cómo las capacidades de DSL de Kotlin permiten crear algo que parece una descripción de UI, pero que en realidad es código
Claro que para eso habría que distribuir un ‘navegador’ para ese formato, o encontrar una forma de mostrarlo en los navegadores existentes. Aun así, compilar a JavaScript/HTML/WASM es posible. También se puede usar un toolkit de GUI portable como JavaFX, y obtener accesibilidad. Incluso se pueden hacer ambas cosas
Si defines tu propio lenguaje de UI, puedes intentar muchas cosas que HTML no hace bien. Un ejemplo claro es la separación entre contenido y estilo. HTML lo intentó, pero nunca terminó de lograrlo bien, y XSL:T lo intentó con más empeño, pero era un lenguaje funcional puro extraño que usaba sintaxis XML. React es bastante bueno para convertir JSON en cajas, pero el protocolo subyacente siempre termina siendo algo añadido de forma improvisada, por lo que es difícil construir herramientas útiles encima
Otra idea posible sería un formato que, por defecto, sea inmune a XSS
Dicho eso, sí quiero una alternativa a HTML. Si yo hiciera un navegador, creo que me enfocaría en reemplazar HTML porque no lo soporto, y también querría cambiar JavaScript porque su runtime es pesado
Por ejemplo, sería bastante gracioso un navegador que casi no tenga runtime de JavaScript y solo ejecute WASM
Soy uno de los autores de este libro. Gracias por los comentarios positivos; si tienen preguntas, puedo responderlas
Me da curiosidad cómo llegaron a elegir Python como lenguaje de implementación del navegador. Me parece que JavaScript vía Node quizá habría ofrecido una experiencia de programación más relacionada
Un texto donde el autor explica por qué eligieron Python: https://browserbook.substack.com/p/why-python
Parece que parte de eso compila Python a JavaScript, de modo que ahora también se ejecuta dentro del navegador, es decir, “dentro del propio libro”
https://browserbook.substack.com/p/compiling-python-to-js
Espero poder volver después de leerlo y decir algo más significativo
Me emociona mucho ver que se creen materiales como este
Los navegadores parecen cajas negras misteriosas e indescifrables, y probablemente a Google le convenga que se los perciba así. Pero al ver el esfuerzo y los resultados de proyectos como Ladybird, esa pared se está resquebrajando
Algún día me gustaría meterme de lleno y contribuir a romper ese foso defensivo, y este libro parece un excelente punto de partida
Firefox ya existe. Pero casi nadie lo usa, y cuando los usuarios encuentran un sitio web que no funciona en Firefox, simplemente aprendieron a abrir Chrome
Puede ser divertido contribuir a motores de navegador como Ladybird con la esperanza de romper el foso, pero es difícil decir que eso por sí solo contribuya a romperlo. Me gustaría saber qué ayudaría de verdad
Al contrario, la gente que trabaja en Chrome, Firefox, Safari y Ladybird parece muy entusiasmada por hablar de los navegadores y de cómo funcionan. El mundo del desarrollo de navegadores es más pequeño de lo que parece, y los ingenieros también se mueven con frecuencia entre empresas, así que creo que sería difícil sostener cualquier “conspiración”
Dicho eso, sí es cierto que faltan materiales educativos. Por eso escribimos este libro, y también falta un vocabulario común para hablar de las partes internas del navegador en etapas clave como layout y rasterización. Chris y yo queríamos que este libro ayudara a crear esa base
Estaba buscando un proyecto interesante para empezar, y ya estoy disfrutando muchísimo este libro. Me gusta especialmente lo interesante que está escrito
Este cómic que explica cómo funciona Chrome también es un buen material para empezar: https://www.google.com/googlebooks/chrome/med_00.html
Estoy aprendiendo la arquitectura interna de los navegadores, y este libro es excelente
Ayuda a construir una intuición sobre cómo funciona un navegador sin tener que meterse en los millones de líneas de código de Chrome
Me pregunto si hay algún código promocional para HN.
Hace tiempo usé HTMLUnit [1] junto con Jython [2] con buenos resultados, y me interesa mucho un futuro en el que se puedan generar automáticamente partes del código del navegador mediante generación de código y técnicas de verificación. Respeto herramientas como Playwright/Cypress/Selenium, pero nunca me resultaron tan cómodas como HTMLUnit.
[1] https://htmlunit.sourceforge.io/
[2] https://www.jython.org/
Es un buen libro. Recomiendo dividir el capítulo 9 en dos capítulos.
Sería bueno dejar la parte de ejecutar JavaScript con Duktape como un capítulo, y la parte de interacción con el DOM y los eventos como otro capítulo separado más adelante.
Hacia el final, los capítulos se vuelven más largos y tratan temas más avanzados, y recomiendo ir siguiendo también el código mientras se lee el libro.