I get the general gist that the CommonsChunkPlugin looks at all the entry points, checks to see if there are common packages/dependencies between them and separates them into their own bundle.
So, let's assume I have the following configuration:
...
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'
}
...
If I bundle without using CommonsChunkPlugin
I will end up with 3 new bundle files:
entry1.bundle.jswhich contains the complete code fromentry1.jsandjqueryand contains its own runtimeentry2.bundle.jswhich contains the complete code fromentry2.jsandjqueryand contains its own runtimevendors.bundle.jswhich contains the complete code fromjqueryandsome_jquery_pluginand contains its own runtime
This is obviously bad because I will potentially load jquery 3 times in the page, so we don't want that.
If I bundle using CommonsChunkPlugin
Depending on what arguments I pass to CommonsChunkPlugin any of the following will happen:
CASE 1 : If I pass
{ name : 'commons' }I will end up with the following bundle files:entry1.bundle.jswhich contains the complete code fromentry1.js, a requirement forjqueryand does not contain the runtimeentry2.bundle.jswhich contains the complete code fromentry2.js, a requirement forjqueryand does not contain the runtimevendors.bundle.jswhich contains the complete code fromsome_jquery_plugin, a requirement forjqueryand does not contain the runtimecommons.bundle.jswhich contains the complete code fromjqueryand contains the runtime
This way we end up with some smaller bundles overall and the runtime is contained in the
commonsbundle. Pretty ok but not ideal.CASE 2 : If I pass
{ name : 'vendors' }I will end up with the following bundle files:entry1.bundle.jswhich contains the complete code fromentry1.js, a requirement forjqueryand does not contain the runtimeentry2.bundle.jswhich contains the complete code fromentry2.js, a requirement forjqueryand does not contain the runtimevendors.bundle.jswhich contains the complete code fromjqueryandsome_jquery_pluginand contains the runtime.
This way, again, we end up with some smaller bundles overall but the runtime is now contained in the
vendorsbundle. It's a little worse than the previous case, since the runtime is now in thevendorsbundle.CASE 3 : If I pass
{ names : ['vendors', 'manifest'] }I will end up with the following bundle files:entry1.bundle.jswhich contains the complete code fromentry1.js, a requirement forjqueryand does not contain the runtimeentry2.bundle.jswhich contains the complete code fromentry2.js, a requirement forjqueryand does not contain the runtimevendors.bundle.jswhich contains the complete code fromjqueryandsome_jquery_pluginand does not contain the runtimemanifest.bundle.jswhich contains requirements for every other bundle and contains the runtime
This way we end up with some smaller bundles overall and the runtime is contained in the
manifestbundle. This is the ideal case.
What I do not understand/I am not sure I understand
In CASE 2 why did we end up with the
vendorsbundle containing both the common code (jquery) and whatever remained from thevendorsentry (some_jquery_plugin)? From my understanding, what theCommonsChunkPlugindid here was that it gathered the common code (jquery), and since we forced it to output it to thevendorsbundle, it kind of "merged" the common code into thevendorsbundle (which now only contained the code fromsome_jquery_plugin). Please confirm or explain.In CASE 3 I do not understand what happened when we passed
{ names : ['vendors', 'manifest'] }to the plugin. Why/how was thevendorsbundle kept intact, containing bothjqueryandsome_jquery_plugin, whenjqueryis clearly a common dependency, and why was the generatedmanifest.bundle.jsfile created the way it was created (requiring all other bundles and containing the runtime) ?