Si simplemente optas por un enfoque AETH, y simplemente colocas hashes de contenido y todo, referencias de la forma habitual, entonces obtienes esta propiedad donde tienes un activo aquí, como una imagen, incluyes un hash de contenido, por lo que básicamente estás haciendo un hash del contenido, el nombre del archivo se basa en una imagen, ABC, con un hash. Eso significa que, porque AsyncChunk2 hace referencia en este caso, tenemos que incrustar la URL de este activo en AsyncChunk2. Y eso básicamente significa que el hash del activo se convierte en parte de AsyncChunk2. Y AsyncChunk2 también se hace un hash y obtiene un nombre, y eso básicamente sucede para todo.
Ahora lo importante, si algo cambió, como cambié este archivo de fuente para tener más subconjunto de fuentes, lo que sea, entonces este activo, por supuesto, cambia, obtiene la nueva URL, y el problema es ahora, la nueva URL necesita ser incrustada en AsyncChunk2, y eso significa que este fragmento también cambia y obtiene una nueva URL, y eso necesita ser incrustado en AsyncChunk1. Así que básicamente el problema es que el cambio se propaga por tus dependencias, tu gráfico de referencias en tu aplicación, y al final significa que todo el gráfico se invalidará solo porque cambiaste la hoja del gráfico. Y eso no es la propiedad que queremos, queremos algo más. Y Webpack tiene una solución para eso.
Entonces, lo que hacemos en Webpack es en lugar de poner referencias de fragmentos en otros fragmentos, simplemente sacamos todos los nombres de archivos, todas las URLs, todos los hashes de contenido de los fragmentos en un manifiesto, que se incrusta en el runtime de Webpack, y hacemos referencia a eso desde ahí. En nuestro gráfico se ve así, donde estás... Básicamente todos los hashes de fragmentos están en el manifiesto, por lo que los fragmentos no se referencian directamente entre sí, básicamente se están referenciando indirectamente en su lugar. Y eso cambia la propiedad donde, si cambias el activo, todavía se propaga a AsyncChunk2, pero luego deja de propagarse a todos los demás fragmentos. Básicamente solo se propaga al archivo del manifiesto que cambia, y HTML cambiará, lo cual siempre cambiará. Pero básicamente podemos mantener todos los fragmentos, los fragmentos no relacionados en caché, y eso da mucho beneficio para el hashing.
Pero todavía hay problemas con eso. Un ejemplo en una aplicación de varias páginas, donde si tienes muchos, quizás miles de archivos HTML, y quieres navegar del lado del cliente entre estos archivos, que es lo que usualmente quieres en un ejemplo en una aplicación de NextJS, necesitas un runtime, porque entonces quieres compartir modules entre todas esas cosas, y quieres mantener entre esas cosas. Así que básicamente tienes el problema de que tienes un solo archivo de manifiesto runtime, y ahora ves el problema. Todo está referenciado, todos los fragmentos en tus miles de páginas están haciendo referencia al archivo de manifiesto, y eso te da el problema, como, si tú, en la página B, cambias tu imagen, se propaga a AsyncChunk4 en este caso, y luego se propaga al manifiesto, y eso invalidará todos tus archivos HTML. Y eso está bien, funciona, y solíamos hacerlo durante, como, años, pero creo que podemos hacerlo mejor.
Así que pasé un poco de tiempo en este cambio muy obvio que puedes hacer aquí. En lugar de hacer un manifiesto global con todas estas cosas, simplemente haces un manifiesto por página. Y eso cambia la propiedad de que ahora tus páginas están aisladas entre sí, y no tienes dependencia de hash entre ellas. Ahora puedes cambiar una página, o cambiar un módulo en una página, y solo invalida uno de los archivos HTML. Ese es un cambio simple, pero tiene un gran impacto. Todavía tienes la propiedad de que, como, la carga de la página inicial es rápida y está en caché y con hash de contenido. Pero ahora tienes páginas independientes. Las páginas pueden ser independientes, no hay dependencias de hash entre ellas. Eso tiene beneficios para la caché a largo plazo, pero también tiene beneficios para la caché de compilación donde puedes simplemente cachear archivos HTML entre despliegues si no cambian. Pero hay un compromiso. Ahora tienes que hacer algo para la navegación del lado del cliente.
Comments