Entiendo la esencia general de que CommonsChunkPluginexamina todos los puntos de entrada, comprueba si hay paquetes / dependencias comunes entre ellos y los separa en su propio paquete.
Entonces, supongamos que tengo la siguiente configuración:
...
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'
}
...
Si empaqueto sin usar CommonsChunkPlugin
Terminaré con 3 nuevos archivos de paquete:
entry1.bundle.jsel cual contiene el código completo deentry1.jsyjqueryy contiene su propio tiempo de ejecuciónentry2.bundle.jsel cual contiene el código completo deentry2.jsyjqueryy contiene su propio tiempo de ejecuciónvendors.bundle.jsel cual contiene el código completo dejqueryysome_jquery_pluginy contiene su propio tiempo de ejecución
Obviamente, esto es malo porque potencialmente cargaré jquery3 veces en la página, por lo que no queremos eso.
Si empaqueto usando CommonsChunkPlugin
Dependiendo de los argumentos que pase a CommonsChunkPlugincualquiera de los siguientes sucederá:
CASO 1: Si apruebo
{ name : 'commons' }, terminaré con los siguientes archivos de paquete:entry1.bundle.jsque contiene el código completo deentry1.js, un requisito parajqueryy no contiene el tiempo de ejecuciónentry2.bundle.jsque contiene el código completo deentry2.js, un requisito parajqueryy no contiene el tiempo de ejecuciónvendors.bundle.jsque contiene el código completo desome_jquery_plugin, un requisito parajqueryy no contiene el tiempo de ejecucióncommons.bundle.jsque contiene el código completojqueryy contiene el tiempo de ejecución
De esta manera, terminamos con algunos paquetes más pequeños en general y el tiempo de ejecución está contenido en el
commonspaquete. Bastante bien, pero no ideal.CASO 2: Si apruebo
{ name : 'vendors' }, terminaré con los siguientes archivos de paquete:entry1.bundle.jsque contiene el código completo deentry1.js, un requisito parajqueryy no contiene el tiempo de ejecuciónentry2.bundle.jsque contiene el código completo deentry2.js, un requisito parajqueryy no contiene el tiempo de ejecuciónvendors.bundle.jsque contiene el código completo dejqueryysome_jquery_pluginy contiene el tiempo de ejecución.
De esta manera, nuevamente, terminamos con algunos paquetes más pequeños en general, pero el tiempo de ejecución ahora está contenido en el
vendorspaquete. Es un poco peor que el caso anterior, ya que el tiempo de ejecución ahora está en elvendorspaquete.CASO 3: Si apruebo
{ names : ['vendors', 'manifest'] }, terminaré con los siguientes archivos de paquete:entry1.bundle.jsque contiene el código completo deentry1.js, un requisito parajqueryy no contiene el tiempo de ejecuciónentry2.bundle.jsque contiene el código completo deentry2.js, un requisito parajqueryy no contiene el tiempo de ejecuciónvendors.bundle.jsque contiene el código completo dejqueryysome_jquery_pluginno contiene el tiempo de ejecuciónmanifest.bundle.jsque contiene requisitos para todos los demás paquetes y contiene el tiempo de ejecución
De esta manera, terminamos con algunos paquetes más pequeños en general y el tiempo de ejecución está contenido en el
manifestpaquete. Este es el caso ideal.
Lo que no entiendo / no estoy seguro de entender
En el CASO 2, ¿por qué terminamos con el
vendorspaquete que contiene tanto el código común (jquery) como lo que queda de lavendorsentrada (some_jquery_plugin)? Según tengo entendido, lo queCommonsChunkPluginhizo aquí fue que reunió el código común (jquery), y dado que lo obligamos avendorsenviarlo al paquete, "fusionó" el código común en elvendorspaquete (que ahora solo contenía el código desome_jquery_plugin). Por favor confirme o explique.En el CASO 3 no entiendo qué pasó cuando pasamos
{ names : ['vendors', 'manifest'] }al plugin. ¿Por qué / cómo sevendorsmantuvo intacto el paquete, que contiene ambosjqueryysome_jquery_plugin, cuándojqueryes claramente una dependencia común, y por qué semanifest.bundle.jscreó el archivo generado de la forma en que se creó (requiriendo todos los demás paquetes y conteniendo el tiempo de ejecución)?