¿Cómo optimizar el tiempo de compilación del paquete web utilizando la herramienta prefetchPlugin & Analysis?

96

Investigación previa:

Como dice la wiki de webpack, es posible utilizar la herramienta de análisis para optimizar el rendimiento de la construcción:

de: https://github.com/webpack/docs/wiki/build-performance#hints-from-build-stats

Sugerencias de estadísticas de construcción

Existe una herramienta de análisis que visualiza su compilación y también proporciona algunas pistas sobre cómo se pueden optimizar el tamaño y el rendimiento de la compilación .

Puede generar el archivo JSON requerido ejecutando webpack --profile --json> stats.json


Genero el archivo de estadísticas ( disponible aquí ), lo cargué en la herramienta de análisis de webpack
y en la pestaña Sugerencias le dije que usara el prefetchPlugin:

de: http://webpack.github.io/analyse/#hints

Cadenas de construcción de módulos largas

Utilice la captación previa para aumentar el rendimiento de la compilación. Obtenga previamente un módulo de la mitad de la cadena .


Busqué en la web de adentro hacia afuera para encontrar la única documentación disponible en prefechPlugin es esta:

de: https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

Una solicitud de un módulo normal, que se resuelve y construye incluso antes de que ocurra una solicitud. Esto puede mejorar el rendimiento. Intente perfilar la construcción primero para determinar puntos de precarga inteligentes .



Mis preguntas:

  • ¿Cómo utilizar correctamente prefetchPlugin?
  • ¿Cuál es el flujo de trabajo adecuado para usarlo con la herramienta Analizar?
  • ¿Cómo sé si el prefetchPlugin funciona? como puedo medirlo
  • ¿Qué significa captar previamente un módulo de la mitad de la cadena ?

Realmente apreciaré algunos ejemplos

Ayúdenme a hacer de esta pregunta un recurso valioso para el próximo desarrollador que quiera usar prefechPlugin y las herramientas de análisis. Gracias.

Asaf Katz
fuente
¿Cómo se supone que usemos la herramienta de análisis de estadísticas? Cuando hago clic en cargar, no pasa nada y no hay ningún botón de envío. Solo "use ejemplo"
TetraDev
La salida de la consola dice Uncaught SyntaxError: Unexpected token r in JSON at position 0al cargar cualquier stats.json
TetraDev
1
@TetraDev esto significa que tiene un error en su archivo JSON. Intente abrirlo con un editor de texto y vea si hay algo que no parezca JSON válido. (Tengo el mismo problema con la salida de depuración de Webpack en la primera línea).
maufl
Los documentos tienen, > stats.jsonpero eso escribe unas pocas líneas adicionales en la parte superior que rompen el analizador
Alex Riina

Respuestas:

35

Sí, la documentación del complemento de búsqueda previa es prácticamente inexistente. Después de descubrirlo por mí mismo, es bastante simple de usar y no tiene mucha flexibilidad. Básicamente, se necesitan dos argumentos, el contexto (opcional) y la ruta del módulo (relativa al contexto). El contexto en su caso sería /absolute/path/to/your/project/node_modules/react-transform-har/asumir que la tilde en su captura de pantalla se refiere a node_modulesla resolución node_module del paquete web .

Idealmente, el módulo de captación previa real no debería tener más de tres dependencias de módulo. Por lo que en su caso isFunction.jses el módulo con la cadena larga acumulación e idealmente debe ser precargados engetNative.js

Sin embargo, sospecho que hay algo extraño en su configuración, porque las dependencias de su cadena de compilación se refieren a dependencias de módulos, que deberían ser optimizadas automáticamente por webpack. No estoy seguro de cómo lo consiguió, pero en nuestro caso, no vemos ninguna advertencia sobre cadenas de compilación largas en node_modules. La mayoría de nuestras cadenas de compilación largas se deben a componentes de reacción profundamente anidados que requieren scss. es decir:

ingrese la descripción de la imagen aquí

Independientemente, querrá agregar un nuevo complemento para cada una de las advertencias, así:

plugins: [
    new webpack.PrefetchPlugin('/web/', 'app/modules/HeaderNav.jsx'),
    new webpack.PrefetchPlugin('/web/', 'app/pages/FrontPage.jsx')
];

El segundo argumento debe ser una cadena a la ubicación relativa del módulo. Espero que esto tenga sentido.

4m1r
fuente
Estoy tratando de reducir algunas de mis compilaciones e incluso después de la explicación todavía estoy realmente confundido sobre cómo usar esta herramienta. ¿Puede explicar qué significa exactamente "contexto" y cuáles deben ser cada uno de los parámetros en la captación previa? No estoy seguro de qué se está haciendo exactamente en el complemento
ThrowsException
No he usado esto en un tiempo, pero probablemente siga siendo el mismo. Solo debería haber dos argumentos para el complemento. Uno, contexto, que es el contexto del módulo, por ejemplo app/components/module.jsx, sería 'app'y creo que el segundo debería ser la ubicación relativa, es decir'components/module.jsx'
4m1r
1
Ok, tendré otra oportunidad. Probé al menos dos docenas de arreglos de PrefetchPlugin y nada parece eliminarlo de mi larga cadena de compilación. Tengo el mismo problema que tenía el póster donde tengo un módulo de nodo que en realidad está en mi cadena de compilación larga y estoy tratando de obtenerlo previamente. No sé si quizás Webpack no sepa cómo manejar esta situación.
ThrowsException
Usé el complemento de captación previa para aumentar considerablemente el rendimiento de mi proyecto que usa handlebars.js. Aquí está la sintaxis que funcionó para mí:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre
Además, si lo que desea obtener previamente no es un paquete (es decir, no está en node_modules), puede simplemente pasar la cadena de solicitud . Tenga en cuenta que el primer argumento, contexto , es opcional.
natchiketa
2

La mitad de su cadena probablemente se encuentra react-transform-hmr/index.jsya que comienza aproximadamente a la mitad. Puede intentar PrefetchPlugin('react-transform-hmr/index')volver a ejecutar su perfil para ver si ayuda a acelerar el tiempo total de creación.

Aaron Jensen
fuente
solo que peor ... de 2351ms a 2361ms, también arroja un errorEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz
4
bueno, una diferencia de 10 ms no es peor, la diferencia es estadísticamente insignificante. Jugaría en torno w / cosas diferentes, react-transform-hmro react-transform-hmr/index.jsetc
Aaron Jensen