Entiendo la esencia general de que CommonsChunkPlugin
examina 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.js
el cual contiene el código completo deentry1.js
yjquery
y contiene su propio tiempo de ejecuciónentry2.bundle.js
el cual contiene el código completo deentry2.js
yjquery
y contiene su propio tiempo de ejecuciónvendors.bundle.js
el cual contiene el código completo dejquery
ysome_jquery_plugin
y contiene su propio tiempo de ejecución
Obviamente, esto es malo porque potencialmente cargaré jquery
3 veces en la página, por lo que no queremos eso.
Si empaqueto usando CommonsChunkPlugin
Dependiendo de los argumentos que pase a CommonsChunkPlugin
cualquiera de los siguientes sucederá:
CASO 1: Si apruebo
{ name : 'commons' }
, terminaré con los siguientes archivos de paquete:entry1.bundle.js
que contiene el código completo deentry1.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónentry2.bundle.js
que contiene el código completo deentry2.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónvendors.bundle.js
que contiene el código completo desome_jquery_plugin
, un requisito parajquery
y no contiene el tiempo de ejecucióncommons.bundle.js
que contiene el código completojquery
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
commons
paquete. Bastante bien, pero no ideal.CASO 2: Si apruebo
{ name : 'vendors' }
, terminaré con los siguientes archivos de paquete:entry1.bundle.js
que contiene el código completo deentry1.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónentry2.bundle.js
que contiene el código completo deentry2.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónvendors.bundle.js
que contiene el código completo dejquery
ysome_jquery_plugin
y 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
vendors
paquete. Es un poco peor que el caso anterior, ya que el tiempo de ejecución ahora está en elvendors
paquete.CASO 3: Si apruebo
{ names : ['vendors', 'manifest'] }
, terminaré con los siguientes archivos de paquete:entry1.bundle.js
que contiene el código completo deentry1.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónentry2.bundle.js
que contiene el código completo deentry2.js
, un requisito parajquery
y no contiene el tiempo de ejecuciónvendors.bundle.js
que contiene el código completo dejquery
ysome_jquery_plugin
no contiene el tiempo de ejecuciónmanifest.bundle.js
que 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
manifest
paquete. Este es el caso ideal.
Lo que no entiendo / no estoy seguro de entender
En el CASO 2, ¿por qué terminamos con el
vendors
paquete que contiene tanto el código común (jquery
) como lo que queda de lavendors
entrada (some_jquery_plugin
)? Según tengo entendido, lo queCommonsChunkPlugin
hizo aquí fue que reunió el código común (jquery
), y dado que lo obligamos avendors
enviarlo al paquete, "fusionó" el código común en elvendors
paquete (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 sevendors
mantuvo intacto el paquete, que contiene ambosjquery
ysome_jquery_plugin
, cuándojquery
es claramente una dependencia común, y por qué semanifest.bundle.js
creó el archivo generado de la forma en que se creó (requiriendo todos los demás paquetes y conteniendo el tiempo de ejecución)?