Bundle Splitting, Lazy Loading & Code Splitting — Accelerating Initial Load Speed

A comprehensive guide on bundle splitting and lazy loading. Discover how to fragment your frontend code into manageable chunks to decrease initial load time, enhance user perception, and optimize runtime cost in contemporary applications.

ShareShare

Bundle Splitting, Lazy Loading & Code Splitting — Accelerating Initial Load Speed

As a rule of thumb in web development, the larger your JavaScript bundle, the longer the user has to wait. The severity of this issue cannot be understated.

Consider this scenario: when a user accesses your application, they aren't interested in downloading every feature you've ever developed. They are primarily concerned with viewing your homepage. This is where the techniques of bundle splitting, lazy loading, and code splitting become crucial.

These methodologies are the bedrock of modern frontend performance engineering. By segmenting your code into smaller units, you can:

  • Load only what’s necessary for the current view
  • Decrease the size of the initial bundle
  • Hasten the time to interactivity
  • Enhance Core Web Vitals such as LCP (Largest Contentful Paint) and FID (First Input Delay)
  • Implement more effective caching strategies

Back to the Beginnings

In the genesis of Single Page Applications (SPAs), bundlers like Webpack amalgamated every script into a single, monolithic .js file. While this was convenient, it was detrimental to performance — particularly on mobile networks.

As applications ballooned in size, so did the bundles. We began to see sizes of 1MB, 2MB, and beyond. Users were forced to endure a wait of several seconds just to view a single button.

In response, popular frameworks such as React, Angular, and Vue began offering route-based lazy loading. With the advent of Webpack 2, the import() function was introduced for dynamic loading. Nowadays, tools like Vite and Rollup make code splitting almost frictionless.

Contemporary browsers, CDNs (Content Delivery Networks), and build tools are designed for modular, lazy-loadable architectures. As developers, it is our responsibility to make full use of these optimizations.


Central Concepts

Bundle Splitting

The idea of bundle splitting involves segmenting your application into multiple output files (known as chunks) rather than a single bundle. You can categorize these chunks as follows:

  • Main bundle: This is the principal chunk of your application.
  • Vendor bundle: This contains libraries such as React and lodash.
  • Route-specific bundles: These are unique to specific routes (e.g., Dashboard.js, Settings.js).

Smaller bundles load more quickly and allow for independent caching.

Code Splitting

Code splitting is the process of dividing your code on-demand using dynamic imports. For example:

const Dashboard = React.lazy(() => import("./Dashboard"));

Webpack automatically generates a new chunk for each import() statement.

Lazy Loading

Lazy loading refers to the loading of a component only when it’s required. For instance:

<Suspense fallback={<Spinner />}>
  <Dashboard />
</Suspense>

This technique delays the loading of non-critical code, thereby improving the initial load time.


Tools and Configuration

Webpack

In Webpack, you can enable code splitting with the import() function as follows:

output: {
  filename: "[name].bundle.js",
  chunkFilename: "[name].chunk.js"
}

You can also use the SplitChunksPlugin to segment vendor code:

optimization: {
  splitChunks: {
    chunks: "all"
  }
}

Vite

Vite employs Rollup under the hood and automatically splits chunks based on dynamic imports.

To customize this, you can use:

rollupOptions: {
  output: {
    manualChunks: {
      vendor: ["react", "react-dom"]
    }
  }
}

Real-World Applications

Facebook

Facebook segments the newsfeed, chat, notifications, and profile views into separate modules.

They also lazy load components such as comments, reactions, and image viewers to minimize the initial JavaScript load.

Airbnb

Airbnb utilizes route-based splitting and prefetches assets for the upcoming page as users hover over links.

Google Docs

Google Docs separates every major editor plugin into lazy modules. You don’t load the logic for spreadsheets until you actually open a spreadsheet.


Potential Pitfalls and Gotchas

  • Over-splitting can lead to increased HTTP overhead due to a large number of small files.
  • Lazy loading too much may delay essential UI components.
  • Untracked dynamic imports can cause the vendor chunk to bloat.
  • The fallback UI for Suspense must be graceful to avoid flickering.

Progressive Enhancement

You can use rel="preload" or rel="prefetch" to hint to the browser:

<link rel="preload" href="/static/js/Dashboard.chunk.js" as="script" />

This can reduce the delay experienced when the user navigates through your application.


Key Metrics to Monitor

  • First Contentful Paint (FCP)
  • Largest Contentful Paint (LCP)
  • Time to Interactive (TTI)
  • Total Blocking Time (TBT)

Code splitting assists all of these metrics by decreasing JavaScript evaluation and execution time.


Anti-Patterns

  • Bundling the logic for an admin dashboard with the landing page.
  • Importing all routes/components eagerly.
  • Not chunking third-party vendors.
  • Lazy loading content that is above-the-fold (this can harm LCP).

Conclusion: Load Less, Show More

Bundle splitting and lazy loading are not just performance hacks — they are foundational architectural patterns for modern web applications.

These techniques reward forward-thinking and modular thought processes.

Most importantly, they provide users with the one thing they truly desire:

Speed.

Subscribe for Deep Dives

Get exclusive in-depth technical articles and insights directly to your inbox.

about

Ehsan Hosseini

Ehsan Hosseini

me [at] ehosseini [dot] info

Staff Software Engineer and Tech Lead with a track record of leading high-performing engineering teams and delivering scalable, end-to-end technology solutions. With experience across web, mobile, and backend systems, I help companies make smart architectural decisions, scale efficiently, and align technical strategy with business goals.

© 2025 Ehsan Hosseini. All rights reserved.