Table of Contents
The Context: An RSS Feed App
The Experiment: Mobile Navigation Toggle
Test Conditions
Metrics
Methodology
Results
Discussion: Shallow Call Stacks
Conclusion and Recommendations
Home Web Front-end CSS Tutorial radEventListener: a Tale of Client-side Framework Performance

radEventListener: a Tale of Client-side Framework Performance

Apr 03, 2025 am 10:26 AM

radEventListener: a Tale of Client-side Framework Performance

React's popularity isn't without its detractors. The framework's considerable size (around 120 KiB minified) significantly impacts startup times, especially when relying solely on client-side rendering. Even server-side rendering with client-side hydration remains performance-intensive. While React excels in complex state management, its resource demands often outweigh the benefits in simpler applications. This can effectively exclude users with less powerful hardware.

Despite my reservations about React's performance overhead, I appreciate its componentization model and JSX syntax. Server-side rendering (or using Preact, my preferred alternative) remains a valuable asset. However, determining the appropriate client-side usage remains a challenge. This article details my findings on optimizing React performance for a better user experience.

The Context: An RSS Feed App

My RSS feed app, bylines.fyi, uses JavaScript on both the server and client. While I don't inherently dislike client-side frameworks, my experience highlights two recurring issues:

  1. Frameworks can obscure the underlying web platform, hindering a deep understanding of when they are truly beneficial.
  2. Frameworks don't always guarantee optimal user experiences.

Tim Kadlec's HTTPArchive research on web framework performance reinforces these concerns, revealing React's less-than-stellar performance. My goal was to leverage React's server-side advantages while mitigating its client-side drawbacks.

The Experiment: Mobile Navigation Toggle

My RSS app needed client-side JavaScript for a simple mobile navigation toggle—a classic example of "simple state." I often see React components overused for such simple tasks, leading to unnecessary performance overhead. This experiment, while seemingly trivial, serves as a crucial benchmark for understanding how framework choices scale. It's important to note that most developers wouldn't solely rely on React for such a minor feature, but the results illustrate architectural implications for runtime performance.

Test Conditions

The experiment compared three mobile nav implementations across four devices:

  1. Stateful React component: Server-rendered and client-hydrated.
  2. Stateful Preact component: Server-rendered and client-hydrated.
  3. Stateless Preact component: Server-rendered, not hydrated; using standard event listeners.

Devices included:

  1. Nokia 2 Android phone (Chrome 83)
  2. ASUS X550CC laptop (Windows 10, Chrome 83)
  3. 1st Generation iPhone SE (Safari 13)
  4. 2nd Generation iPhone SE (Safari 13)

Metrics

The following metrics were measured for each implementation and device:

  1. Startup time: Including framework loading and hydration (React/Preact), or just event listener code (EventListener).
  2. Hydration time: A subset of startup time (React/Preact only).
  3. Mobile nav open time: Measuring framework overhead in event handling.

Methodology

Testing involved remote debugging and profiling, recording CPU time for each metric across ten iterations per scenario and device. Network performance was not a factor.

Results

Due to the complexity of the data, the results are presented in tabular format showing minimum, maximum, median, and average CPU times. (Detailed tables are available in the accompanying spreadsheet). Key findings include:

  • React's high startup and hydration costs: Particularly noticeable on the low-end Nokia 2.
  • Preact's improved performance: Significantly faster than React, but still exceeding ideal frame budgets on the Nokia 2.
  • Superior event listener performance: Consistently faster than both React and Preact, especially for simple interactions.

Discussion: Shallow Call Stacks

The performance differences stem from the overhead of framework loading and hydration. While some performance trade-offs are inevitable for developer convenience, the balance often tilts too heavily towards developer experience at the expense of the user. The call stacks for React and Preact hydration highlight the significant processing demands, especially for simple tasks. Using native event listeners offers a much more efficient approach for simple state management.

Conclusion and Recommendations

This analysis isn't intended as a React critique, but rather an encouragement to critically evaluate framework choices and their performance impact. Several strategies can mitigate performance issues:

  1. Refactor stateful components to stateless components where possible.
  2. Avoid client-side JavaScript and hydration for stateless components.
  3. Use framework-independent event listeners for simple interactions.
  4. Lazily hydrate components using Intersection Observer or requestIdleCallback.
  5. Consider Preact as a faster alternative to React.
  6. Adapt the user experience for low-memory devices using navigator.deviceMemory.

Prioritize performance testing across a range of devices, ensuring inclusivity for users with varying hardware capabilities. The goal should be a fast and accessible web experience for everyone.

Special thanks to Eric Bailey for editorial feedback and the CSS-Tricks staff for publishing this article.

The above is the detailed content of radEventListener: a Tale of Client-side Framework Performance. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

It's out! Congrats to the Vue team for getting it done, I know it was a massive effort and a long time coming. All new docs, as well.

A bit on ci/cd A bit on ci/cd Apr 02, 2025 pm 06:21 PM

I'd say "website" fits better than "mobile app" but I like this framing from Max Lynch:

Can you get valid CSS property values from the browser? Can you get valid CSS property values from the browser? Apr 02, 2025 pm 06:17 PM

I had someone write in with this very legit question. Lea just blogged about how you can get valid CSS properties themselves from the browser. That's like this.

Stacked Cards with Sticky Positioning and a Dash of Sass Stacked Cards with Sticky Positioning and a Dash of Sass Apr 03, 2025 am 10:30 AM

The other day, I spotted this particularly lovely bit from Corey Ginnivan’s website where a collection of cards stack on top of one another as you scroll.

Using Markdown and Localization in the WordPress Block Editor Using Markdown and Localization in the WordPress Block Editor Apr 02, 2025 am 04:27 AM

If we need to show documentation to the user directly in the WordPress editor, what is the best way to do it?

Comparing Browsers for Responsive Design Comparing Browsers for Responsive Design Apr 02, 2025 pm 06:25 PM

There are a number of these desktop apps where the goal is showing your site at different dimensions all at the same time. So you can, for example, be writing

Why are the purple slashed areas in the Flex layout mistakenly considered 'overflow space'? Why are the purple slashed areas in the Flex layout mistakenly considered 'overflow space'? Apr 05, 2025 pm 05:51 PM

Questions about purple slash areas in Flex layouts When using Flex layouts, you may encounter some confusing phenomena, such as in the developer tools (d...

How to Use CSS Grid for Sticky Headers and Footers How to Use CSS Grid for Sticky Headers and Footers Apr 02, 2025 pm 06:29 PM

CSS Grid is a collection of properties designed to make layout easier than it’s ever been. Like anything, there's a bit of a learning curve, but Grid is

See all articles