Skip to content

Code Splitting

Code splitting breaks your JavaScript bundle into smaller chunks that can be loaded on demand, reducing the initial load size.

Split your application by entry points (pages):

webpack.config.js
module.exports = {
entry: {
main: './src/main.js', // Core app
admin: './src/admin.js', // Admin panel
vendor: './src/vendor.js' // Third-party libraries
}
};

Load code on demand with dynamic import():

// Route-based splitting (most common)
const Home = () => import('./routes/Home.js');
const About = () => import('./routes/About.js');
const Dashboard = () => import('./routes/Dashboard.js');
async function navigate(route) {
switch (route) {
case 'home':
return (await Home()).default;
case 'about':
return (await About()).default;
case 'dashboard':
return (await Dashboard()).default;
}
}

Separate third-party code into its own chunk:

webpack.config.js
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
priority: 10
},
common: {
minChunks: 2,
minSize: 10000,
name: 'common',
chunks: 'all'
}
}
}
}
// Use magic comments for named chunks (Webpack)
const Admin = () => import(/* webpackChunkName: "admin" */ './Admin.js');
const Reports = () => import(/* webpackChunkName: "reports" */ './Reports.js');
// Output: admin.[hash].js, reports.[hash].js
TechniqueWhat It DoesBenefit
Entry splittingSeparate entry pointsPer-page bundles
Dynamic splittingimport() per routeLoad on demand
Vendor splittingSeparate vendor chunkBetter caching
Chunk namingNamed chunksDebugging