VOOZH about

URL: https://blog.logrocket.com/quick-guide-to-webpack-bundle-and-code-splitting-with-react-43d1045f1064/

⇱ Quick guide to webpack bundle and code splitting with React - LogRocket Blog


2017-11-17
590
#react#webpack
Christian Nwamba
1835
👁 Image

See how LogRocket's Galileo AI surfaces the most severe issues for you

No signup required

Check it out
👁 Image

Introduction

You’re probably here because your app has grown to the point where forcing the user to download the entire thing as a single file seems cruel and unusual. Fact is, tons of features and a complex UX are bound to affect the amount of code you’re working with. What to do?

Easy. Make a “vendor bundle.” A vendor bundle contains all the frameworks and libraries each application feature depends on. By building all this code into a single bundle, the client can effectively cache the bundle, and you only need to rebuild the bundle when a framework or library updates.

It’s also worth considering that every time your application is updated or changed, the client must download new vendor dependencies. What to do?

You guessed it. Bundle ’em up. Put the parts that changed in one bundle and the dependencies in another. That way, the client only downloads what it needs.

In this post, I’ll walk you through the basics of bundle splitting in Webpack. As you might expect, I’ll also touch on code splitting.

How to create a vendor bundle

Assuming you have a basic React application, execute npm run build in CLI to get a baseline build:

Hash: 9db5a05e09ad73897fd4
 Version: webpack 2.2.1
 Time: 2114ms
 Asset Size Chunks Chunk Names
 
 ...font.eot 166 kB [emitted]
 ...font.woff2 77.2 kB [emitted]
 ...font.woff 98 kB [emitted]
 ...font.svg 444 kB [emitted] [big]
 logo.png 77 kB [emitted]
 ...font.ttf 166 kB [emitted]
 
 app.js 170 kB 0 [emitted] app
 
 app.css 3.11 kB 0 [emitted] app
 app.js.map 193 kB 0 [emitted] app
 app.css.map 89 bytes 0 [emitted] app
 index.html 248 bytes [emitted]
 [0] ./~/process/browser.js 7.3 kB {0} [built]
 [3] ./~/react/lib/ReactElement.js 13.2 kB {0} [built]
 [18] ./app/component.js 292 bytes {0} [built]
 ...

As you can see, theapp is quite large — about 170kb. That’s something you’ll fix in our upcoming example.

Code splitting

Code Splitting is an awesome feature that splits your codebase into various, smaller bundles which can be loaded whenever they are needed.

What this means is that your application is composed of lots of small code files (as modules) which are called “chunks”. If used properly, code splitting will lower loading time. Webpack allows you to define split points in your code base and then takes care of the dependencies, output files and runtime stuff.

Let’s proceed to walk through the most common approaches to code splitting when using Webpack.

Asynchronous Loading

This is just basically splitting code by loading the modules asynchronously. Say you have this directory with Lodash in the node_modules:

webpack-demo 
|- package.json 
|- webpack.config.js 
|- /dist 
|- /src 
 |- index.js
|- /node_modules

In the index.js file, import lodash using Common JS require.ensure. As the method name goes, it ensures that the module is only loaded when the code is required and it does this asynchronously:



require.ensure(['lodash'], function() {
 var lodash = require('lodash');
 ...
 
})

You don’t need to change anything in the Webpack configuration:

const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
module.exports = {
 entry: {
 index: './src/index.js'
 },
 plugins: [
 // ...
 ],
 output: {
 filename: '[name].bundle.js',
 path: path.resolve(__dirname, 'dist')
 }
};

Running npm run build in our CLI will yield the following build result:

Hash: a27e5bf1dd73c675d5c9
Version: webpack 2.6.1
Time: 544ms
 Asset Size Chunks Chunk Names
lodash.bundle.js 541 kB 0 [emitted] [big] lodash
 index.bundle.js 6.35 kB 1 [emitted] index
 [0] ./~/lodash/lodash.js 540 kB {0} [built]
 [1] ./src/index.js 377 bytes {1} [built]
 [2] (webpack)/buildin/global.js 509 bytes {0} [built]
 [3] (webpack)/buildin/module.js 517 bytes {0} [built]

🚀 Sign up for The Replay newsletter

The Replay is a weekly newsletter for dev and engineering leaders.

Delivered once a week, it's your curated guide to the most important conversations around frontend dev, emerging AI tools, and the state of modern software.

Over 200k developers use LogRocket to create better digital experiences

👁 Image
Learn more →

Get set up with LogRocket's modern React error tracking in minutes:

  1. Visit https://logrocket.com/signup/ to get an app ID
  2. Install LogRocket via npm or script tag. LogRocket.init() must be called client-side, not server-side

    $ npm i --save logrocket 
    
    // Code:
    
    import LogRocket from 'logrocket'; 
    LogRocket.init('app/id');
     
    // Add to your HTML:
    
    <script src="https://cdn.lr-ingest.com/LogRocket.min.js"></script>
    <script>window.LogRocket && window.LogRocket.init('app/id');</script>
     
  3. (Optional) Install plugins for deeper integrations with your stack:
    • Redux middleware
    • NgRx middleware
    • Vuex plugin
Get started now
👁 Image
👁 Image
👁 Image

Stop guessing about your digital experience with LogRocket

Get started for free

Recent posts:

How to add authentication to a React Native app with Better Auth

Learn how to build a full React Native auth system using Better Auth and Expo — with email/password login, Google OAuth, session persistence, and protected routes.

👁 Image
Chinwike Maduabuchi
Jun 9, 2026 ⋅ 13 min read

AI dev tool power rankings & comparison [June 2026]

Compare the top AI development tools and models of June 2026. View updated rankings, feature breakdowns, and find the best fit for you.

👁 Image
Chizaram Ken
Jun 8, 2026 ⋅ 11 min read

How to check username availability at scale with Bloom filters

Learn how Bloom filters reduce database lookups for username availability checks while preserving correctness at scale.

👁 Image
Rosario De Chiara
Jun 8, 2026 ⋅ 6 min read

An advanced guide to Nuxt testing and mocking

Learn how to test Nuxt apps with Vitest, @nuxt/test-utils, runtime mocks, server route mocks, and Playwright e2e tests.

👁 Image
Sebastian Weber
Jun 5, 2026 ⋅ 15 min read
View all posts

Hey there, want to help make our blog better?

Join LogRocket’s Content Advisory Board. You’ll help inform the type of content we create and get access to exclusive meetups, social accreditation, and swag.

Sign up now