Comment optimiser le temps de construction de Webpack à l'aide de l'outil prefetchPlugin & Analysis?

96

Recherche précédente:

Comme le dit le wiki de Webpack, il est possible d'utiliser l'outil d'analyse pour optimiser les performances de construction:

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

Astuces des statistiques de construction

Il existe un outil d'analyse qui visualise votre build et fournit également des conseils sur la manière dont la taille et les performances de build peuvent être optimisées .

Vous pouvez générer le fichier JSON requis en exécutant webpack --profile --json> stats.json


Je génère le fichier de statistiques ( disponible ici )
et je l'ai téléchargé sur l'outil d'analyse de webpack et sous l' onglet Astuces, j'ai dit d'utiliser le prefetchPlugin:

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

Longues chaînes de construction de modules

Utilisez la prélecture pour augmenter les performances de compilation. Prérécupérez un module au milieu de la chaîne .


J'ai fouillé le Web pour trouver la seule documentation disponible sur prefechPlugin est la suivante:

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

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

Une demande pour un module normal, qui est résolu et construit avant même qu'une demande ne se produise. Cela peut améliorer les performances. Essayez d'abord de profiler la construction pour déterminer les points de prélecture intelligents .



Mes questions:

  • Comment utiliser correctement prefetchPlugin?
  • Quel est le bon flux de travail pour l'utiliser avec l'outil d'analyse?
  • Comment savoir si le prefetchPlugin fonctionne? comment puis-je le mesurer?
  • Qu'est-ce que cela signifie de pré-extraire un module du milieu de la chaîne ?

J'apprécierai vraiment quelques exemples

Aidez-moi à faire de cette question une ressource précieuse pour le prochain développeur qui souhaite utiliser prefechPlugin et les outils d'analyse. Je vous remercie.

Asaf Katz
la source
1
Comment sommes-nous censés utiliser l'outil d'analyse des statistiques? Lorsque je clique sur télécharger, rien ne se passe et il n'y a pas de bouton d'envoi. Seulement "use example"
TetraDev
La sortie de la console indique Uncaught SyntaxError: Unexpected token r in JSON at position 0lors du téléchargement de stats.json
TetraDev
1
@TetraDev cela signifie que vous avez une erreur dans votre fichier JSON. Essayez de l'ouvrir avec un éditeur de texte et voyez s'il y a quelque chose qui ne ressemble pas à un JSON valide. (J'ai le même problème avec la sortie de débogage de Webpack sur la première ligne).
maufl
La documentation a > stats.jsonmais cela écrit quelques lignes supplémentaires en haut qui cassent l'analyseur
Alex Riina

Réponses:

35

Ouais, la documentation du plugin de pré-extraction est quasiment inexistante. Après l'avoir compris par moi-même, c'est assez simple à utiliser et il n'y a pas beaucoup de flexibilité. Fondamentalement, il prend deux arguments, le contexte (facultatif) et le chemin du module (par rapport au contexte). Le contexte dans votre cas /absolute/path/to/your/project/node_modules/react-transform-har/supposerait que le tilde dans votre capture d'écran se réfère à node_modulesla résolution node_module du webpack .

Le module de prélecture proprement dit ne devrait idéalement pas comporter plus de trois dépendances de module. Donc, dans votre cas isFunction.jsest le module avec la longue chaîne de construction et idéalement, il devrait être pré-récupéré àgetNative.js

Cependant, je soupçonne qu'il y a quelque chose de génial dans votre configuration, car vos dépendances de chaîne de construction font référence aux dépendances de module, qui devraient être automatiquement optimisées par webpack. Je ne sais pas comment vous avez obtenu cela, mais dans notre cas, nous ne voyons aucun avertissement concernant les longues chaînes de construction dans node_modules. La plupart de nos longues chaînes de construction sont dues à des composants de réaction profondément imbriqués qui nécessitent scss. c'est à dire:

entrez la description de l'image ici

Quoi qu'il en soit, vous voudrez ajouter un nouveau plugin pour chacun des avertissements, comme ceci:

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

Le deuxième argument doit être une chaîne de l'emplacement relatif du module. J'espère que cela a du sens.

4m1r
la source
J'essaie de réduire certaines de mes versions et même après l'explication, je ne sais toujours pas comment utiliser cet outil. Pouvez-vous nous expliquer ce que signifie exactement le «contexte» et ce que chacun des paramètres de la prélecture doit être? Je ne suis pas sûr de ce qui est exactement fait dans le plugin
ThrowsException
Je ne l'ai pas utilisé depuis un moment, mais c'est probablement toujours le même. Il ne devrait y avoir que deux arguments dans le plugin. Un, le contexte, qui est le contexte du module, par exemple app/components/module.jsx, 'app'et je pense que le second devrait être l'emplacement relatif, c'est'components/module.jsx'
4m1r
1
Ok, mauvais avoir un autre laissez-passer. J'ai essayé au moins deux douzaines d'arrangements PrefetchPlugin et rien ne semble le supprimer de ma longue chaîne de construction. J'ai le même problème que celui de l'affiche où j'ai un module de nœud qui est en fait dans ma longue chaîne de construction et j'essaye de le pré-lire. Je ne sais pas si Webpack ne sait peut-être pas comment gérer cette situation.
ThrowsException
J'ai utilisé le plugin prefetch pour augmenter considérablement les performances de mon projet qui utilise handlebars.js. Voici la syntaxe qui a fonctionné pour moi:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre
De plus, si l'élément que vous souhaitez pré-extraire n'est pas un package (c'est-à-dire pas dans node_modules), vous pouvez simplement passer la chaîne de requête . Notez que le premier argument, le contexte , est facultatif.
natchiketa
2

Le milieu de votre chaîne se trouve probablement react-transform-hmr/index.jsà mi-chemin. Vous pouvez essayer de PrefetchPlugin('react-transform-hmr/index')réexécuter votre profil pour voir si cela vous aide à accélérer votre temps total de création.

Aaron Jensen
la source
seulement pire .. de 2351ms à 2361ms, ça lance aussi une erreurEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz
4
eh bien, une différence de 10 ms n'est pas pire, la différence est statistiquement insignifiante. Je jouerais avec différentes choses, react-transform-hmrou react-transform-hmr/index.jsetc.
Aaron Jensen