Je comprends que le CommonsChunkPlugin
examine tous les points d’entrée, vérifie s’il existe des paquets/dépendances communs entre eux et les sépare dans leur propre paquet.
Supposons donc que j'ai la configuration suivante:
...
enrty : {
entry1 : 'entry1.js', //which has 'jquery' as a dependency
entry2 : 'entry2.js', //which has 'jquery as a dependency
vendors : [
'jquery',
'some_jquery_plugin' //which has 'jquery' as a dependency
]
},
output: {
path: PATHS.build,
filename: '[name].bundle.js'
}
...
CommonsChunkPlugin
Je vais me retrouver avec 3 nouveaux fichiers bundle:
entry1.bundle.js
qui contient le code complet de entry1.js
et jquery
et contient son propre runtimeentry2.bundle.js
qui contient le code complet de entry2.js
et jquery
et contient son propre runtimevendors.bundle.js
qui contient le code complet de jquery
et some_jquery_plugin
et contient son propre runtimeC'est évidemment mauvais parce que je vais potentiellement charger jquery
3 fois dans la page, donc nous ne voulons pas de cela.
CommonsChunkPlugin
En fonction des arguments que je transmets à CommonsChunkPlugin
, l'un des événements suivants se produira:
CAS 1: Si je réussis { name : 'commons' }
Je vais me retrouver avec les fichiers suivants:
entry1.bundle.js
qui contient le code complet de entry1.js
, une exigence pour jquery
et ne contient pas le runtimeentry2.bundle.js
qui contient le code complet de entry2.js
, une exigence pour jquery
et ne contient pas le runtimevendors.bundle.js
qui contient le code complet de some_jquery_plugin
, une exigence pour jquery
et ne contient pas le runtimecommons.bundle.js
qui contient le code complet de jquery
et contient le runtimeDe cette façon, nous nous retrouvons avec des paquets plus petits dans l’ensemble et le temps d’exécution est contenu dans le paquet commons
. Assez correct mais pas idéal.
CAS 2: Si je réussis { name : 'vendors' }
Je vais me retrouver avec les fichiers suivants:
entry1.bundle.js
qui contient le code complet de entry1.js
, une exigence pour jquery
et ne contient pas le runtimeentry2.bundle.js
qui contient le code complet de entry2.js
, une exigence pour jquery
et ne contient pas le runtimevendors.bundle.js
qui contient le code complet de jquery
et some_jquery_plugin
et contient le temps d'exécution.De cette façon, encore une fois, nous nous retrouvons avec des bundles plus petits mais le runtime est maintenant contenu dans le bundle vendors
. C'est un peu pire que le cas précédent, car l'exécution est maintenant dans le bundle vendors
.
CAS 3: Si je réussis { names : ['vendors', 'manifest'] }
Je vais me retrouver avec les fichiers suivants:
entry1.bundle.js
qui contient le code complet de entry1.js
, une exigence pour jquery
et ne contient pas le runtimeentry2.bundle.js
qui contient le code complet de entry2.js
, une exigence pour jquery
et ne contient pas le runtimevendors.bundle.js
qui contient le code complet de jquery
et some_jquery_plugin
et ne contient pas le runtimemanifest.bundle.js
qui contient les conditions requises pour tous les autres ensembles et contient le runtimeDe cette façon, nous nous retrouvons avec des paquets plus petits dans l’ensemble et le temps d’exécution est contenu dans le paquet manifest
. C'est le cas idéal.
Dans CASE 2 pourquoi nous nous sommes retrouvés avec le paquet vendors
contenant à la fois le code commun (jquery
) et tout ce qui restait de l’entrée vendors
( some_jquery_plugin
)? D'après ce que j'ai compris, la CommonsChunkPlugin
ici a rassemblé le code commun (jquery
) et, depuis que nous l'avons forcée à l'afficher dans le bundle vendors
, de "fusionner" le code commun dans le bundle vendors
(qui ne contenait plus que le code de some_jquery_plugin
). Veuillez confirmer ou expliquer.
Dans CAS Je ne comprends pas ce qui s’est passé quand on est passé { names : ['vendors', 'manifest'] }
au plugin. Pourquoi/comment le paquet vendors
a-t-il été conservé intact, contenant à la fois jquery
et some_jquery_plugin
, quand jquery
est clairement une dépendance courante et pourquoi le manifest.bundle.js
fichier créé de la manière dont il a été créé (nécessitant tous les autres bundles et contenant le moteur d’exécution)?
Voici comment fonctionne CommonsChunkPlugin
.
Un bloc commun "reçoit" les modules partagés par plusieurs blocs d'entrée. Vous trouverez un bon exemple de configuration complexe dans référentiel Webpack .
Le CommonsChunkPlugin
est exécuté pendant la phase d'optimisation de Webpack, ce qui signifie qu'il fonctionne en mémoire, juste avant que les morceaux ne soient scellés et écrits sur le disque.
Lorsque plusieurs morceaux courants sont définis, ils sont traités dans l’ordre. Dans votre cas 3, c'est comme si vous exécutiez le plugin deux fois. Mais notez que CommonsChunkPlugin
peut avoir une configuration plus complexe (minSize, minChunks, etc.) qui a un impact sur la façon dont les modules sont déplacés.
CAS 1:
entry
morceaux (entry1
, entry2
et vendors
).commons
comme un fragment commun.commons
(car le morceau n'existe pas, il est créé): entry1
, entry2
et vendors
utilisent jquery
afin que le module soit supprimé de ces fragments et qu’il soit ajouté au fragment commons
.commons
est marqué comme un morceau entry
alors que le entry1
, entry2
et vendors
, les fragments sont sans drapeau sous le nom de entry
.commons
est un morceau entry
, il contient le runtime et le module jquery
.CAS 2:
entry
morceaux (entry1
, entry2
et vendors
).vendors
comme un fragment commun.vendors
commun: entry1
et entry2
utilise jquery
pour que le module soit supprimé de ces morceaux (notez qu'il n'est pas ajouté au morceau vendors
, car le paquet vendors
le contient déjà).vendors
est marqué comme un morceau entry
alors que le entry1
et entry2
_ Les morceaux ne portent pas le symbole entry
.vendors
est un morceau entry
, il contient le runtime et le jquery
/jquery_plugin
modules.CAS 3:
entry
morceaux (entry1
, entry2
et vendors
).vendors
et manifest
comme des fragments courants.manifest
car il n’existe pas.vendors
commun: entry1
et entry2
utilise jquery
pour que le module soit supprimé de ces morceaux (notez qu'il n'est pas ajouté au morceau vendors
, car le paquet vendors
le contient déjà).vendors
est marqué comme un morceau entry
alors que le entry1
et entry2
_ Les morceaux ne portent pas le symbole entry
.manifest
(car le morceau n'existe pas, il est créé): manifest
est marqué comme étant entry
alors que le entry1
, entry2
et vendors
sont sans drapeau comme entry
.manifest
est un morceau entry
, il contient le runtime.J'espère que ça aide.