Hace tres días la herramienta empezó a guardar el peso de cada script, cada hoja de estilo y cada
fuente que sirve un sitio, y hace dos le pusimos una hoja en el
Excel. En los dos textos quedó
escrito lo mismo, con esas palabras: la hoja enseña el número y ninguna regla lo juzga. Nadie te
avisa de que ese bundle.js pesa demasiado.
La 0.10.0 cierra eso, y de paso otras tres cosas.
Lo que ahora se juzga
Un script de más de 250 KB, tal como se sirve, y una hoja de estilo de más de 100 KB. El listón del CSS es más bajo a propósito: bloquea la pintura, el navegador no enseña nada hasta tenerlo, así que los mismos bytes cuestan más. El del script está por encima de lo que ocupa un framework normal, para que lo que salte sea un paquete que nadie ha dividido y no la decisión de usar React.
Las dos reglas solo miran lo que sirve el sitio auditado. Un script pesado alojado en el CDN de otro
no es algo que el dueño pueda partir, y su tamaño nos llega de una petición HEAD y no de un cuerpo
descargado de verdad: afirmar sobre ese número sería juzgar un dato de otra calidad.
Un <iframe> que apunta a una URL tuya rota, que deja un hueco en blanco donde debería estar el
mapa. Y un formulario cuyo action no existe, que es la única regla de esta familia con
severidad crítica: un formulario que se rellena bien y se pierde al enviarlo cuesta clientes, y no
te enteras nunca, porque quien lo sufre se va sin decir nada.
Esa última tiene una limitación que preferimos declarar antes de que la descubras: solo se comprueban los formularios que se envían por GET, un buscador o un filtro de catálogo. Comprobar un POST exigiría enviar el formulario, y esta herramienta no envía formularios. El analizador ni siquiera guarda esos destinos: una fila que no se puede juzgar es peor que ninguna fila. Es el mismo criterio por el que un 403 de un servidor ajeno a una sonda no se reporta como enlace roto.
Curiosidad de arqueología: el <form> estaba en la lista de elementos del analizador desde el
primer día y no se emitía nunca. Por eso el intento anterior de esta regla era una regla falsa.
El puerto es parte del sitio
Hasta ahora, «mismo sitio» se decidía comparando el host. Auditando http://localhost:3000 —lo
normal cuando revisas antes de desplegar—, un enlace a http://localhost:8080 se rastreaba como si
fuera tuyo: sus páginas entraban en el recuento de internas, sus 404 salían como errores internos y
el grafo de enlaces mezclaba dos aplicaciones distintas. En producción es raro; en desarrollo es el
pan de cada día, y desarrollo es justo donde se usa el modo que audita la carpeta de salida antes de
publicarla.
Ahora el puerto cuenta. https://ejemplo.es y https://ejemplo.es:443 siguen siendo lo mismo,
porque el puerto por defecto del esquema se normaliza solo.
Ese cambio movió una pieza que no esperaba: el descubrimiento de sitemaps se calculaba su propio host, sin puerto, así que un sitemap del propio sitio servido en un puerto explícito pasó a descartarse entero por «fuera del sitio auditado». Lo cazó un test de autenticación básica que no tiene nada que ver con puertos ni con sitemaps, y que existía porque alguien quiso comprobar que un entorno de pruebas protegido se rastrea con sus credenciales.
El 24% que la prueba dejó pasar
Con todo verde, la verificación previa a publicar dio este número:
elementos/s 81169 · páginas/s 1980 · RSS 31.5 MB
La versión anterior daba 107.702. Un 24% menos, y la prueba de regresión pasó: su umbral está por debajo, para no fallar por el ruido de una máquina cargada. Un test que mide y no afirma lo suficiente deja pasar exactamente esto.
La primera explicación que se me ocurrió fue buena, razonable y falsa. Al meter el puerto, la comparación pasó a construir una cadena de texto por cada llamada, y esa función se llama una vez por cada enlace de cada página: millones de asignaciones en un rastreo grande. Lo arreglé para comparar sin construir nada, volví a medir y gané un 4%. No era eso.
Era esto:
QUERY PLAN
|--SCAN l
Las dos reglas nuevas de marco y formulario filtran por el tipo de elemento del enlace, y esa columna no tenía índice, así que cada una recorría la tabla de enlaces entera. En el sitio real donde lo medí son 145.191 filas; en un sitio grande, la pasada final se sienta a esperar. La migración 010 pone el índice y el número vuelve a su sitio:
elementos/s 108585 · páginas/s 2648 · RSS 32.3 MB
Los dos arreglos se quedan, el de la cadena también: era real aunque fuera pequeño. Y hay un test
nuevo que no mide tiempo sino que lee el plan de la consulta y falla si vuelve a aparecer ese
SCAN. Un test de tiempo mide también la máquina; uno de plan afirma sobre la decisión.
Lo que no está
El modo lista sigue tratando como interno solo el primer dominio del fichero, así que una lista que mezcla sitios audita el primero y comprueba el resto como ajenos. Podríamos haberlo cambiado hoy y habría sido el peor momento: es un cambio de significado en la misma versión que ya mueve hallazgos de lado. Está declarado en el manual, en los dos idiomas, hasta que se levante.
El balance: 63 reglas, 1.047 pruebas en verde, análisis estático limpio y el rendimiento por encima de donde estaba. Y la frase que arrastrábamos desde el lunes ya no hace falta: la hoja enseña el número y ahora hay una regla que dice si es demasiado.