惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
K
Kaspersky official blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog
aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
Stack Overflow Blog
Stack Overflow Blog
量子位
S
Secure Thoughts
G
GRAHAM CLULEY
C
CXSECURITY Database RSS Feed - CXSecurity.com
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 聂微东
宝玉的分享
宝玉的分享
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
S
Security Affairs
Help Net Security
Help Net Security
博客园 - 三生石上(FineUI控件)
AWS News Blog
AWS News Blog
博客园 - 叶小钗
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
Project Zero
Project Zero
H
Heimdal Security Blog
W
WeLiveSecurity
C
Check Point Blog

Echo JS

Desktop apps Introducing mermaid-lint: Stop Shipping Broken Diagrams How We Cut Slow Responses by 80% Migrating to Next.js App Router The quiet problem with unnecessary async - Matt Smith GitHub - ant-design/ant-design-cli: Ant Design on your command line. Query component knowledge, analyze project usage, and guide migrations — fully offline. Uncovering the Magic Behind Playwright T2 No Escape Hatches · Prickles GitHub - auto-agent-protocol/auto-agent-protocol: Automotive Agent Protocol GitHub - coactionjs/coaction: Zustand-style state management with built-in render tracking and cached computed state GitHub - williamtroup/Rattribute.js: ❓ A lightweight JavaScript library for automatically changing HTML element attributes based on responsive screen sizes. GitHub - williamtroup/Rink.js: 🔗 A JavaScript library for generating responsive HTML link targets. SVAR Kanban: Interactive Task Board Component for Svelte, React, and Vue Performance Cost of Popular 3rd Party Scripts date-light - Tiny date utilities for JavaScript When React Hooks Stop Scaling: Moving Complex State to Zustand - Oren Farhi GitHub - jskits/loggerjs: A faster, more powerful isomorphic logger Out Loud — Free AI Text to Speech Pocket DB — Embedded single-file NoSQL for Node.js billboard.js 4.0 release: Canvas rendering mode, 94.3% faster! GitHub - thegruber/linkpeek: Secure TypeScript link preview and URL metadata extractor for Open Graph, Twitter Cards, JSON-LD, Node/Bun/Deno/edge. GitHub - evoluteur/healing-frequencies: Play the healing frequencies of various sets of tuning forks: Solfeggio, Organs, Mineral nutrients, Ohm, Chakras, Cosmic octave, Otto, DNA nucleotides... or custom. Animated sine waves - 27 lines of pure JavaScript Framework | Neutralinojs GitHub - AllThingsSmitty/typescript-tips-everyone-should-know: ✅ A curated collection of practical TypeScript patterns that improve safety, readability, maintainability, and developer experience. 🧠 Heat.js : JavaScript Heat Map GitHub - iDev-Games/State-JS: State.js is a CSS‑reactive framework that makes UI state and updates flow through CSS instead of JavaScript logic. GitHub - yankouskia/gameplate: :video_game: Boilerplate for creating game with WebGL & Redux :game_die: GitHub - yankouskia/get-browser: 💻 Lightweight tool to identify the browser (mobile+desktop detection)📱 GitHub - yankouskia/is-incognito-mode: Identify whether browser is in incognito mode 👀
React Performance Isn’t About useMemo — It’s About Render Boundaries
The React Systems Newsletter · 2026-05-20 · via Echo JS

When a React application starts feeling slow, the reflex is almost universal.

Add useMemo.

Wrap callbacks with useCallback.

Throw memo() around suspicious child components.

A filtered list recalculates?

useMemo.

A function gets recreated?

useCallback.

A component rerenders unexpectedly?

memo.

The logic feels reasonable. The tools are built for optimization, the problem appears local, and the fix seems quick.

The issue is that this often mistakes the symptom for the disease.

Most React performance problems do not begin because someone forgot a hook.

They begin because the application has weak render boundaries.

A surprising amount of React optimization advice starts from a flawed assumption:

rerenders are bad.

They are not.

React was built around rerendering.

State changes.

React recalculates UI.

That is normal operation.

The real question is not:

“Why did this component rerender?”

The better question is:

“Why was this component involved in this update at all?”

Performance problems usually appear when updates become:

  • too wide

  • too frequent

  • too expensive

Artwork: Relativity
Author: M.C. Escher

One input field changes.

Half the page updates.

Every keystroke propagates through a heavy component tree.

Rendering triggers:

  • sorting

  • filtering

  • formatting

  • rebuilding large objects

  • recomputing derived state

The rerender itself is rarely the core problem.

The update scope is.

Perfectly fine:

function Counter() {
  const [count, setCount] = useState(0)

  return (
    <button
      onClick={() => setCount(c => c + 1)}
    >
      {count}
    </button>
  )
}

Rerenders happen.

Nothing is wrong.

Optimization would solve nothing here.

useMemo is useful.

But it is not architectural medicine.

A common mistake looks like this:

const filteredUsers = useMemo(
  () =>
    users.filter(
      user =>
        user.name.includes(query)
    ),
  [users, query]
)

This may be perfectly appropriate.

Or completely irrelevant.

The missing question is:

why is this calculation running so often?

If every keystroke causes:

  • table rebuilds

  • sidebar rerenders

  • chart updates

  • modal recalculations

then memoizing one filter does not solve the architecture.

It simply places a performance-shaped bandage over a broader design problem.

Artwork: The Treachery of Images
Author: René Magritte

One of the most common React performance failures is state lifted too high.

A single parent component ends up owning everything.

function DashboardPage() {

  const [search, setSearch] =
    useState('')

  const [selectedRow, setSelectedRow] =
    useState(null)

  const [modalOpen, setModalOpen] =
    useState(false)

  const [loading, setLoading] =
    useState(false)

  const [tableData, setTableData] =
    useState([])

  const [errors, setErrors] =
    useState({})
}

Individually, nothing seems unusual.

Collectively, it becomes dangerous.

Now every small state change flows through the same parent.

Search input changes?

Large subtree rerenders.

Modal opens?

Table participates.

Loading flag updates?

Entire layout recalculates.

Developers often respond by layering optimization:

  • memo

  • useCallback

  • useMemo

The app becomes slightly quieter.

The architecture stays equally tangled.

The problem was never missing memoization.

The problem was missing boundaries.

Good React optimization often begins with a surprisingly unglamorous move:

move state closer to where it actually belongs.

Bad:

Page
 ├── SearchBox
 ├── DataTable
 ├── Sidebar
 └── Modal

Everything depends on Page state.

Better:

Page
 ├── SearchSection
 │    └── search state
 │
 ├── DataTable
 │    └── row selection state
 │
 └── Modal
      └── visibility state

Now updates become localized.

Opening a modal does not rebuild unrelated UI.

Typing into search does not redraw the entire page.

Render boundaries become narrower.

React performs less work because less work exists.

Artwork: Broadway Boogie Woogie
Author: Piet Mondrian

Not all rendering work carries equal cost.

Changing button text?

Cheap.

Sorting 20,000 rows after every keystroke?

Not cheap.

This is where optimization becomes practical.

Before adding hooks, map the hot path.

Ask:

What happens after the user types?

What changes after clicking a row?

Which components receive new props?

Which calculations rerun?

Once the update flow becomes visible, solutions become clearer.

Sometimes:

separate input from results

Sometimes:

virtualize large lists

Sometimes:

move formatting server-side

Sometimes:

the problem is not React at all.

The browser simply received far too much data.

Bad:

function UsersTable({
  users,
  query
}) {

  const rows =
    users
      .filter(user =>
        user.name.includes(query)
      )
      .sort(sortUsers)
      .map(renderRow)

  return <>{rows}</>
}

Every keystroke:

  • filters

  • sorts

  • maps

Potentially across thousands of records.

Now useMemo becomes reasonable.

But only after understanding the workload.

React Compiler changes the conversation.

Automatic memoization becomes increasingly possible.

Less repetitive optimization.

Less manual wrapping.

That is useful.

But it does not eliminate architectural thinking.

The compiler cannot decide:

  • where state belongs

  • which component owns data

  • why an entire screen depends on one object

Automatic optimization cannot untangle poor separation.

If one component mixes:

  • forms

  • analytics

  • tables

  • business rules

  • server state

  • UI state

no compiler magically transforms that into maintainable architecture.

Tools are getting smarter.

Boundary design still belongs to developers.

Artwork: Composition VIII
Author: Wassily Kandinsky

Before typing another optimization hook, ask:

Only after these questions does optimization become honest.

Then:

useMemo makes sense.

useCallback makes sense.

memo makes sense.

Without architectural understanding, they become decorative complexity.

React applications rarely become slow because someone forgot useMemo.

Much more often, they become slow because:

too much UI depends on too much frequently changing state.

Memoization can help.

It cannot replace understanding:

  • render flow

  • ownership

  • state placement

  • update boundaries

Strong React developers do not merely know where to place useMemo.

They understand:

what changed, why it changed, and what actually deserves to update.

React optimization does not begin with a hook.

It begins with a question:

What should actually change after this interaction?

Once that answer becomes clear, memo becomes a tool.

Until then, it is just another layer wrapped around architectural debt.

Discussion about this post

Ready for more?