¿Qué es CRP?
CRP
También conocida como ruta de renderización crítica, para citar MDN
su explicación:
❝La ruta de representación crítica se refiere a la secuencia de pasos en los que el navegador convierte HTML, CSS y JavaScript en píxeles en la pantalla. La optimización de la ruta de representación crítica puede mejorar el rendimiento de la representación. La ruta de representación crítica incluye el modelo de objetos de documento (DOM), el modelo de objetos CSS (CSSOM), el árbol de representación y el diseño.
❞
La optimización de la ruta de renderización crítica puede mejorar el tiempo de renderización de la primera pantalla. Comprender y optimizar la ruta de renderización crítica es esencial para garantizar que el reflujo y el redibujado se puedan realizar a 60 fotogramas por segundo, para garantizar una interacción del usuario de alto rendimiento y evitar una renderización sin sentido.
¿Cómo combinar la CRP
optimización del rendimiento?
Creo que todo el mundo no es ajeno a la optimización del rendimiento, ya sea un trabajo normal o una entrevista, es un tema común.
Si solo hablamos de algunos puntos en general, creo que no es muy riguroso.
Hoy combinamos una pregunta de entrevista muy clásica: 从输入URL到页面展示,这中间发生了什么?
hablemos en profundidad desde algunos de los enlaces 前端性能优化 CRP
.
Desde ingresar la URL hasta mostrar la página, ¿qué sucedió?
No necesito decir más sobre el nivel clásico de esta pregunta. Aquí utilizo una imagen para ordenar su proceso general: este proceso se puede describir a grandes rasgos de la siguiente manera:
1, análisis URI
2. Resolución DNS (servidor DNS)
3. Protocolo de enlace de tres vías TCP (establezca un canal de conexión entre el cliente y el servidor)
4. Enviar solicitud HTTP
5. Procesamiento y respuesta del servidor
6. TCP saludó cuatro veces (cierre la conexión entre el cliente y el servidor)
7. Análisis y renderización del navegador
8. La página está cargada.
En este artículo, explicaré la optimización del rendimiento del proceso de renderizado del navegador, el almacenamiento en caché y la optimización de DNS.
Proceso de renderizado del navegador
Construye el árbol DOM
DOM
El proceso general de construcción de un árbol se resume en la siguiente figura:
Tomamos el siguiente fragmento de código como ejemplo para el análisis:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="style.css" rel="stylesheet">
<title>构建DOM树</title>
</head>
<body>
<p>森林</p>
<div>之晨</div>
</body>
</html>
Primero, el navegador lee HTML
bytes sin procesar del disco o de la red y los codifica de acuerdo con el archivo especificado para convertirlos en caracteres.
Word luego se convertirá en el flujo de bytes Token
en Token
(es decir, token) generado al mismo tiempo, otro proceso también consumirá el token y se convertirá en HTML head
el objeto de nodo, indicará el inicio y el final del token entre nodos relación.
Cuando se consumen todos los tokens, se convierte a DOM
(Modelo de objeto de documento).
La DOM
estructura final es la siguiente:
Construye el árbol CSSOM
DOM
El árbol está construido y el siguiente paso es CSSOM
construir el árbol.
De manera similar a HTML
la conversión, el navegador identificará los CSS
tokens correctos y luego convertirá estos tokens en CSS
nodos.
❝El nodo hijo heredará las reglas de estilo del nodo padre, que corresponde a las reglas en cascada y las hojas de estilo en cascada.
❞
DOM
El proceso general de construcción de un árbol se puede resumir en la siguiente figura:
Usamos lo anterior como HTML
ejemplo aquí , asumiendo que tiene el siguiente CSS:
body {
font-size: 16px;
}
p {
font-weight: bold;
}
div {
color: orange;
}
Entonces, el CSSOM
árbol finalmente construido es el siguiente:
Con DOM
y CSSOM
, puede sintetizar el árbol de diseño (Render Tree).
Construye el árbol de renderizado
Y así sucesivamente DOM
y CSSOM
luego tienes que construir un buen motor de renderizado de diseño que se construirá en árbol. La estructura del árbol de diseño es una estructura de árbol sustancialmente replicada DOM
, excepto que los DOM
árboles no muestran que los elementos estén filtrados, como los display:none
atributos de los elementos, las head
etiquetas, las script
etiquetas y similares.
Después de copiar una buena estructura de árbol de diseño básico, el motor de renderizado para el correspondiente DOM
selecciona la información de estilo correspondiente a los elementos, este proceso es el cálculo de estilo.
Cálculo de estilo
El cálculo del estilo del objeto consiste en calcular el DOM
estilo específico del nodo de cada elemento, esta etapa se puede dividir en tres pasos para completar.
Convierta CSS en una estructura que el navegador pueda entender
Y los HTML
archivos, el navegador no entiende directamente el CSS
estilo de texto sin formato , por lo que cuando el motor de renderizado recibe un CSS
texto, realiza una operación de conversión, el CSS
navegador de estructura de conversión de texto es comprensible - styleSheets
.
Convierta los valores de los atributos en la hoja de estilo para estandarizar
Ahora que hemos convertido el texto CSS existente en una estructura que el navegador pueda entender, el siguiente paso es estandarizar los valores de sus atributos.
¿Qué es la estandarización del valor de atributo? Veamos este párrafo CSS
:
body {
font-size: 2em;
}
div {
font-weight: bold;
}
div {
color: red;
}
Puede ver el CSS
texto anterior , hay muchos valores de propiedad, como 2em, negrita, rojo, los valores de estos tipos no son fácilmente entendidos por el motor de renderizado, es necesario convertir todos los valores para que sean fácilmente entendidos por el motor de renderizado, se calcula el valor normalizado, el proceso es Estandarización de valores de atributos.
¿Cómo se ve el valor del atributo normalizado?
Como puede ver en la figura, se 2em
analizó 32px
, bold
analizó 700
y red
analizó en rgb(255,0,0)
...
Calcule el estilo específico de cada nodo en el árbol DOM
La propiedad de estilo Now se ha estandarizado, entonces necesita calcular el DOM
árbol en los atributos de estilo de cada nodo, y ¿cómo calcularlo?
Esto involucra dos puntos: la 继承规则
suma de CSS 层叠规则
.
Dado que este no es el enfoque de este artículo, explicaré brevemente:
CSS
La herencia es que cadaDOM
nodo contiene un estilo padreEstá laminado
CSS
a una característica básica, es un valor de propiedad que define cómo fusionar algoritmos de múltiples fuentes. EsCSS
el núcleo,CSS
el nombre completo "Hojas de estilo en cascada" precisamente para enfatizar este punto.
Una vez completado el cálculo de estilo, el motor de renderizado también necesita calcular la posición geométrica de cada elemento en el árbol de diseño. Este proceso es para calcular el diseño.
Diseño de cálculo
Ahora, tenemos DOM
árboles y DOM
elementos de estilo en el árbol, pero no lo suficiente para mostrar la página, porque no conocemos DOM
la posición geométrica del elemento de información. Entonces necesitas calcular la DOM
posición geométrica de los elementos visibles del árbol, ponemos este cálculo se llama 布局
.
dibujar
La construcción del árbol de diseño final se completa mediante el cálculo de estilo y el cálculo de diseño. Después de eso, es el momento de las operaciones de dibujo posteriores.
En este punto, el proceso de renderizado del navegador básicamente ha terminado, resuelto a través de la siguiente imagen:
En este punto, hemos resuelto el proceso completo de análisis y renderizado del navegador, entonces, ¿dónde podemos optimizar el rendimiento?
Puntos de optimización que se pueden realizar desde el proceso de renderización del navegador
Por lo general, una página tiene tres etapas: etapa de carga, etapa interactiva y etapa de cierre.
Fase de carga, es a partir de la solicitud para renderizar una página completa del proceso, los principales factores que afectan esta etapa es que existe una red y
JavaScript
scripts.Etapa interactiva, destacando la finalización del proceso de integración desde la página para cargar la interacción del usuario, el principal factor que incide en esta etapa es el
JavaScript
guión.En la fase de cierre, son principalmente las operaciones de limpieza realizadas por la página después de que el usuario emite una instrucción de cierre.
Aquí debemos enfocarnos 加载阶段
y 交互阶段
, debido a que los factores que afectan nuestra experiencia se encuentran principalmente en estas dos etapas, analicemos en detalle uno por uno.
Fase de carga
Primero analicemos cómo optimizar sistemáticamente la página en la fase de carga y observemos una canalización de renderizado típica, como se muestra en la siguiente figura:
Al analizar el proceso de representación del navegador en la cara de nuestro conocimiento JavaScript
, la primera solicitud del HTML
archivo de recursos, CSS
el archivo que se bloquea por primera vez se procesará, porque el DOM
proceso de construcción requiere HTML
y los JavaScript
documentos, durante la construcción del árbol de representación necesitan utilizar el CSS
archivo.
Estos recursos que pueden bloquear la primera representación de una página web se denominan 关键资源
. Basándonos en los recursos clave, podemos continuar refinando tres factores centrales que afectan la primera representación de la página:
关键资源个数
. Cuantos más recursos clave, mayor será el tiempo de carga de la primera página.关键资源大小
. En circunstancias normales, cuanto menor sea el contenido de todos los recursos clave, menor será el tiempo de descarga de todo el recurso y menor el tiempo de bloqueo de procesamiento.请求关键资源需要多少个RTT(Round Trip Time)
.RTT
Es un indicador de rendimiento importante en la red. Representa el retardo de tiempo total experimentado desde el final del envío de datos hasta el final de recepción de la confirmación del extremo receptor.
Después de comprender varios factores centrales que afectan el proceso de carga, podemos considerar sistemáticamente el plan de optimización. El principio general es la optimización 减少关键资源个数
, 降低关键资源大小
, 降低关键资源的 RTT 次数
:
¿Cómo reducir la cantidad de recursos clave? Una forma es
JavaScript
y seCSS
forma en línea, como el mapaJavaScript
yCSS
, si se cambia el modo en línea, el número reducido de recursos críticos de tres a uno. De otra forma, si elJavaScript
código no esDOM
uCSSOM
operaciones, se puede cambiarsync
odefer
propiedades¿Cómo reducir el tamaño de los recursos críticos? Puede comprimir
CSS
yJavaScript
recursos, eliminarHTML
,CSS
,JavaScript
el contenido del archivo en algunos de los comentarios¿Cómo reducir los recursos clave
RTT
el número? Esto se puede lograr reduciendo la cantidad de recursos clave y reduciendo el tamaño de los recursos clave. Además, también se puede utilizarCDN
para reducir laRTT
duración.
Fase interactiva
A continuación, hablemos de la fase interactiva después de que se cargue la página y cómo optimizarla.
Primero echemos un vistazo a la canalización de renderizado en la fase interactiva: de hecho, hay aproximadamente los siguientes puntos que se pueden optimizar:
避免DOM的回流
. Es decir, trate de evitarlo重排
y重绘
operarlo.减少 JavaScript 脚本执行时间
. A veces,JavaScript
el tiempo de ejecución de una función puede ser de varios cientos de milisegundos, lo que ocupa seriamente el tiempo del hilo principal para realizar otras tareas de renderizado. Ante esta situación, podemos adoptar las siguientes dos estrategias:-
Una es descomponer la función ejecutada una vez en múltiples tareas, de modo que cada tiempo de ejecución no sea demasiado largo.
El otro es adoptar
Web Workers
.
DOM操作相关的优化
. Navegadores渲染引擎
y, porJS引擎
lo tanto, cuando se usa laJS
operaciónDOM
, los dos motores entre sí a través de una interfaz de "comunicación" y, por lo tanto, cada operaciónDOM
(incluidas las únicasDOM
propiedades de acceso ), debe resolverse entre la sobrecarga del motor a menudo se dice que se reduce Manipulación DOM. En resumen, los siguientes puntos:-
Almacene en caché algunas propiedades calculadas, como
let left = el.offsetLeft
.Por
DOM
elclass
centralizar cambiar el estilo, en lugar destyle
modificar un bar.Operaciones de lectura y escritura separadas. Los navegadores modernos tienen un mecanismo de cola de renderizado.
DOM
La era del abandono de las operaciones tradicionales , basadavue/react
envirtual dom
el marco adoptado por otros
合理利用 CSS 合成动画
. La animación sintética se realiza directamente en el hilo sintético, este diseño y operación, como el dibujo ejecutado en el hilo principal diferente, si el hilo principalJavaScript
o alguna ocupación de tareas de diseño, laCSS
animación aún podía continuar. Así que trate de hacer un buen uso deCSS
la animación sintética, si hacemosCSS
la animación, en la medida de lo posible para queCSS
funcione.CSS选择器优化
. Sabemos que laCSS引擎
búsqueda coincide de derecha a izquierda. Entonces, en base a esto, existen las siguientes soluciones de optimización:-
Trate de no usar comodines
Utilice los selectores de etiquetas con moderación
Utilice la herencia de atributos tanto como sea posible
CSS属性优化
. Cuando el navegador representar imágenes,CSS
el coste se calcula propiedades, algunas propiedades requieren una gran cantidad de cálculo de navegador, que pertenece a las propiedades caras (box-shadows
,border-radius
,transforms
,filters
,opcity
,:nth-child
, etc.), estos atributos a menudo se utilizan en el desarrollo de todos los días, por lo que no quiere decir No use estos atributos, pero en desarrollo, si hay otras soluciones simples y factibles, puede dar preferencia a soluciones sin atributos costosos.避免频繁的垃圾回收
. Sabemos que alJavaScript
usar la recolección automática de basura, si crea un objeto temporal en alguna función con frecuencia, el recolector de basura acudirá a la política de recolección de basura con frecuencia. De esta forma, cuando se produzca la operación de recolección de basura, ocupará el hilo principal, lo que afectará la ejecución de otras tareas, y en casos graves, hará que el usuario sienta que el marco se cae y no es suave.
Cache
Se puede decir que el almacenamiento en caché es un método de optimización simple y eficiente en la optimización del rendimiento. Una excelente estrategia de almacenamiento en caché puede acortar la distancia de los recursos de solicitud de la página web, reducir la latencia y, dado que los archivos almacenados en caché se pueden reutilizar, también puede reducir el ancho de banda y la carga de la red. La siguiente figura es el diagrama de flujo de búsqueda de la caché del navegador : todavía hay muchos puntos de conocimiento relacionados con la caché del navegador. Aquí he compilado una imagen: Para una introducción detallada a la caché del navegador, puede consultar mi artículo anterior , aquí No entraré en detalles.
Optimización relacionada con DNS
DNS
Nombre completo Domain Name System
. Es la "libreta de direcciones" de Internet, que registra el ip
mapeo entre los nombres de dominio y las direcciones reales . Cada vez que visitamos un sitio web, debemos DNS
consultar el servidor del sitio web a través de servidores en todos los niveles ip
, y luego podemos acceder al servidor.
DNS
La optimización relacionada generalmente implica dos puntos: el DNS
almacenamiento en caché del navegador y DNS
el análisis previo.
DNS
Cache
Una imagen vale mas que mil palabras:
El navegador primero verificará la caché del navegador (la caché del navegador tiene un límite de tamaño y tiempo). Si el tiempo es demasiado largo, puede hacer que la
IP
dirección cambie y no resuelva laIP
dirección correcta . Si es demasiado corto, el navegador resolverá repetidamente el nombre de dominio, generalmente en unos minutos.Si el caché del navegador no tiene un nombre de dominio correspondiente, buscará en el caché del sistema operativo.
Si no se ha encontrado, el nombre de dominio se enviará al servidor de nombres de dominio en la región (generalmente proporcionado por proveedores de Internet, como China Telecom, China Unicom), y generalmente se puede encontrar en el servidor de nombres de dominio en la región.
Por supuesto, es posible que tampoco se encuentre el servidor de nombres de dominio local, y el servidor de nombres de dominio local iniciará la búsqueda recursiva.
En términos generales, los navegadores DNS
requieren análisis 20-120ms
, por lo que hay DNS
pocas optimizaciones para el análisis. Sin embargo, hay un escenario en el que hay muchas imágenes en el sitio web con diferentes nombres de dominio. Si el nombre de dominio que se puede usar después de la página de inicio de sesión se resuelve con anticipación, el resultado de la resolución se almacenará en caché, lo que acorta el DNS
tiempo de resolución y mejora el acceso general al sitio web. Acelera, eso es todo DNS预解析
.
DNS
Preanálisis
Eche un vistazo a DNS预解析
la definición de MDN :
❝❞
X-DNS-Prefetch-Control
El cabezal controla laDNS
función de lectura previa del navegador .DNS
La lectura previa es una iniciativa para hacer que el navegador realice la función de resolución de nombres de dominio, y su alcance incluye todo el documento vinculado, ya sean imágenes,CSS
yJavaScript
otros usuarios pueden hacer clicURL
.
Debido a que la lectura previa se realizará en segundo plano, por DNS
lo que es posible que se haya resuelto antes de que el enlace correspondiente aparezca completo. Esto puede reducir la demora cuando los usuarios hacen clic en el enlace.
Veamos brevemente cómo hacerlo aquí DNS预解析
:
Agregue el encabezado de la página para que el navegador analice previamente toda la página
<meta http-equiv="x-dns-prefetch-control" content="on">
Agregue manualmente el nombre de dominio que se resolverá a través de la etiqueta del enlace, por ejemplo:
<link rel="dns-prefetch" href="//img10.360buyimg.com"/>
referencia
Li Bing "Principio de funcionamiento y práctica del navegador"
"Ver y reenviar" es el mayor apoyo