List Virtualization — Rendering Millions of Rows Without Breaking the Browser: An In-Depth Analysis

Delve into the strategy of list virtualization for efficient scrolling experiences, even with extensive datasets. Explore its implementation in React or any UI, with a focus on performance, memory, and user experience enhancement.

ShareShare

List Virtualization — Rendering Millions of Rows Without Breaking the Browser: An In-Depth Analysis

Imagine a scenario. The user interface (UI) you developed is tasked with rendering a list of 10,000 items. As the user scrolls, the page starts to lag, frames drop, and CPU usage spikes. This is a common issue faced by frontend developers when dealing with large lists. The solution to this problem is list virtualization.

List virtualization, also known as virtual scrolling, is an optimization technique where only the visible items in a list are rendered at any given time. Everything outside the viewport remains unrendered until needed. This significantly reduces the number of DOM nodes, memory usage, and render time, resulting in a smoother user experience.

This article provides an in-depth analysis of:

  • The concept of virtualization and its effectiveness
  • Implementation of virtualization in React with react-window and react-virtual
  • Handling dynamic heights, sticky headers, and infinite scroll
  • Real-world examples from Slack, Discord, and Facebook
  • Common anti-patterns and debugging tips

The Problem: The DOM Is Expensive

Rendering a list item in the DOM has its costs:

  • A DOM node is created for each list item
  • The rendering may trigger style computation, layout calculation, and repaints
  • Each item consumes a portion of system memory

Rendering a few hundred elements might be manageable, but once the count goes beyond a thousand, the performance starts to degrade, especially if the list items are complex and include elements such as images, rich text, or heavy nested markup. The most effective solution to this problem is to render only what the user can see at any given moment.


Understanding Virtualization

Virtualization involves rendering a window of the entire list, typically just the visible items with a small buffer. This is achieved by creating a scrollable wrapper container, positioning the visible rows with absolute or transform CSS, and maintaining only a small subset of the items in the DOM at any given time.

<List height={600} itemCount={10000} itemSize={35} width={800}>
  {({ index, style }) => (
    <div style={style}>Item {index}</div>
  )}
</List>

Notable libraries that support virtualization include react-window (Brian Vaughn), react-virtual (Tanner Linsley), and react-virtualized (legacy, but still widely used).


Benefits of Virtualization

By using virtualization, you can achieve significant performance improvements, including:

  • A 10–100x improvement in render performance
  • Reduced garbage collection (GC) churn leading to faster frames per second (FPS)
  • Improved scroll smoothness on mobile and low-end devices
  • Efficiency in handling chat logs, tables, infinite feeds, and similar data-heavy components

Real-World Examples

Slack

Slack virtualizes message history to optimize performance. It avoids re-rendering old messages unless they're scrolled into view.

Discord

Discord uses virtualization for chat, the member list, and emojis. It manages to combine animations and virtualization seamlessly, even in a highly interactive UI.

Facebook

Facebook uses feed virtualization to keep the timeline fast, even with media-rich posts. It tries to reuse DOM nodes where possible to further optimize performance.


Handling Dynamic Height Rows

Working with dynamic height rows can be a challenge because the size isn't known in advance. However, there are several strategies to handle this, such as using VariableSizeList from react-window, estimating and measuring sizes with ResizeObserver, and memoizing measured heights for efficient layout recalculations.

<VariableSizeList itemSize={getItemSize} />

Combining Infinite Scroll with Virtualization

While virtualization and infinite scrolling are distinct concepts, they complement each other well. Virtualization can help manage the performance aspects of infinite scrolling by ensuring that only a manageable subset of items is rendered at any given time.

const isItemLoaded = index => !!data[index];
const loadMoreItems = (startIndex, stopIndex) => {
  return fetchData(startIndex, stopIndex);
};

<InfiniteLoader
  isItemLoaded={isItemLoaded}
  loadMoreItems={loadMoreItems}
  itemCount={10000}
>
  {({ onItemsRendered, ref }) => (
    <FixedSizeList
      ref={ref}
      onItemsRendered={onItemsRendered}
      height={600}
      itemCount={10000}
      itemSize={35}
      width={800}
    >
      {Row}
    </FixedSizeList>
  )}
</InfiniteLoader>

Implementing Sticky Headers & Grouping

Sticky rows require additional tracking and management. You can use portals to extract DOM nodes, render sticky headers separately and synchronize scrolling, and maintain a mapping of row positions for accurate scroll offset calculations.


Anti-Patterns to Avoid

There are certain practices that can negate the benefits of virtualization:

  • Rendering all rows in a map() call for large lists
  • Using display: none or visibility: hidden instead of removing off-screen items
  • Animating items that aren't visible
  • Forcing layout calculations with dynamic height: auto in virtual rows

Conclusion: Scale Your UI Without Sacrificing UX

List virtualization is a powerful technique that allows you to render large data sets without adversely affecting the user experience. If your list has more than a thousand rows, it's not just a good practice—it's a necessity. By smartly rendering only what the user can see, you can improve performance and provide a smoother user experience. Remember, less DOM equals more performance.

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.