Recientemente estoy trabajando en algunos trabajos de optimización de sitios web, y empiezo a usar la división de código en el paquete web usando una declaración de importación como esta:
import(/* webpackChunkName: 'pageB-chunk' */ './pageB')
Que crean correctamente los páginaB-chunk.js , ahora digamos que quiero precargar este trozo en páginaA, puedo hacerlo por añadir esta declaración en páginaA:
import(/* webpackChunkName: 'pageB-chunk' */ /* webpackPrefetch: true */ './pageB')
Lo que resultará en un
<link rel="prefetch" href="pageB-chunk.js">
si se agrega a la cabeza de HTML, el navegador lo captará previamente, hasta ahora todo bien.
El problema es que la declaración de importación que uso aquí no solo capta previamente el archivo js, sino que también evalúa el archivo js, significa que el código de ese archivo js se analiza y compila en bytecodes, se ejecuta el código de nivel superior de ese JS.
Esta es una operación que consume mucho tiempo en un dispositivo móvil y quiero optimizarla, solo quiero la parte de captación previa , no quiero la parte de evaluar y ejecutar , porque más tarde, cuando sucedan algunas interacciones del usuario, activaré el análisis y evaluarme
↑↑↑↑↑↑↑↑ Solo quiero activar los primeros dos pasos, las imágenes provienen de https://calendar.perfplanet.com/2011/lazy-evaluation-of-commonjs-modules/ ↑↑↑↑↑↑↑↑ ↑↑
Claro que puedo hacer esto agregando el enlace de captación previa yo mismo, pero esto significa que necesito saber qué URL debo poner en el enlace de captación previa, webpack definitivamente conoce esta URL, ¿cómo puedo obtenerla de webpack?
¿Webpack tiene alguna manera fácil de lograr esto?
fuente
if (false) import(…)
- Dudo que webpack haga análisis de código muerto?import
debe ir el código dinámico .Respuestas:
ACTUALIZAR
Puede usar preload-webpack-plugin con html-webpack-plugin , le permitirá definir qué precargar en la configuración e insertará automáticamente etiquetas para precargar su fragmento
tenga en cuenta que si está utilizando webpack v4 a partir de ahora, tendrá que instalar este complemento utilizando
preload-webpack-plugin@next
ejemplo
ACTUALIZACIÓN 2
si no quieres precargar todo el fragmento asíncrono pero solo específico una vez que puedes hacerlo también
puede usar el complemento babel de migcoder o con los
preload-webpack-plugin
siguientesprimero tendrá que nombrar ese fragmento asíncrono con ayuda de
webpack magic comment
ejemploy luego en la configuración del complemento use ese nombre como
En primer lugar, veamos el comportamiento del navegador cuando especificamos
script
etiqueta olink
etiqueta para cargar el scriptscript
etiqueta, la cargará, la analizará y la ejecutará de inmediatoasync
ydefer
etiquetar solo hasta elDOMContentLoaded
eventolink
)ahora hay alguna otra forma de hackey no recomendada : si envía su script completo
string
ocomment
(porque el tiempo de evaluación del comentario o cadena es casi insignificante) y cuando necesita ejecutar eso, puede usarloFunction() constructor
oeval
no se recomiendan ambosOtro trabajador de servicio de aproximación : (esto preservará su evento de caché después de recargar la página o el usuario se desconecta después de cargar la caché)
En el navegador moderno, puede usar
service worker
para buscar y almacenar en caché un recurso (JavaScript, imagen, css cualquier cosa) y cuando la solicitud del hilo principal para ese recurso puede interceptar esa solicitud y devolver el recurso de la caché de esta manera, no está analizando y evaluando el script cuando lo está cargando en la memoria caché lea más sobre los trabajadores de servicios aquíejemplo
como puede ver, esto no depende del paquete web , está fuera del alcance del paquete web; sin embargo, con la ayuda del paquete web, puede dividir su paquete, lo que ayudará a utilizar mejor al trabajador del servicio
fuente
Actualizaciones: ¡Incluyo todas las cosas en un paquete npm, échale un vistazo! https://www.npmjs.com/package/webpack-prefetcher
Después de unos días de investigación, termino escribiendo un complemento Babel personalizado ...
En resumen, el complemento funciona así:
Prefetcher es una clase auxiliar que contiene el manifiesto de salida del paquete web y puede ayudarnos a insertar el enlace de captación previa:
Un ejemplo de uso:
El detalle de este complemento se puede encontrar aquí:
Prefetch: toma el control del paquete
Una vez más, esta es una forma realmente hacky y no me gusta, si quieres que el equipo webpack implemente esto, vota aquí:
Característica: captura previa importación dinámica bajo demanda
fuente
Suponiendo que entendí lo que está tratando de lograr, desea analizar y ejecutar un módulo después de un evento determinado (por ejemplo, haga clic en un botón). Simplemente podría poner la declaración de importación dentro de ese evento:
fuente