
Webpack 4.0 was released a few days ago. I happened to be in the middle of updating an older app and decided to jump to this version; especially because the webpack team is claiming a significant improvement in compile times (up to 98%!).
One of the common optimizations is to split the vendor and application code, which I did. With webpack 4 that functionality has been changed significantly and turned into core functionality. So, this requires some changes to your webpack config. In my case, I was splitting the vendors by manually specifying the packages in the entry and then using the CommonsChunkPlugin to generate the separate bundle.
entry: {
app: "./js/app.js",
vendors: [
"jquery", "lodash", "react", "react-router-dom", "react-hot-loader", "redux", "react-redux", "rxjs", "material-ui",
"moment", "prop-types", "redux-observable", "pouchdb", "react-dom", "html-to-text", "material-ui-icons", "style-loader",
"react-select"
]
},
// And then later in the config...
plugins: [
// ...
new webpack.optimize.CommonsChunkPlugin({name: "vendors", filename: "vendors.bundle.js"})
// ...
],
I was basically packaging everything in node_modules in the separate file. My simple approach to this splitting was simplified even more with webpack 4. Now, I can accomplish the same, but I don’t have to individually specify the files. I am guessing that there was a better way to accomplish this in webpack <4, but I never took the time to research it. Anyways, here is what this config looks like for webpack 4.
entry: {
app: "./js/app.js"
},
// And then later in the config.
optimization: {
splitChunks: {
cacheGroups: {
commons: { test: /[\\/]node_modules[\\/]/, name: "vendors", chunks: "all" }
}
}
}
You also no longer need the CommonsChunkPlugin in the plugins section so you will also have to remove or comment that config.
In my case, I also had hardcoded the output filename, so, with the above changes that section also needed to be updated as shown below. In my case, I added the dynamic [name] placeholder.
output: {
path: __dirname + "/assets",
filename: "[name].bundle.js"
},
With the above changes, I was good to go with webpack 4 and ready to appreciate the faster compile times 🙂
