From ded080a2e576167bc728a4fa6c028f31646169bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=9D=A8=E5=B8=86?= <39647285+leno23@users.noreply.github.com> Date: Sat, 16 May 2026 11:19:46 +0800 Subject: [PATCH] perf(react-dom): bound server style name cache --- .../react-dom-bindings/src/server/ReactFizzConfigDOM.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js index 691e49e563fd..e1cf486b3b05 100644 --- a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js +++ b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js @@ -1181,6 +1181,10 @@ function pushViewTransitionAttributes( } const styleNameCache: Map = new Map(); +// Keep this cache bounded for long-running server processes. Style property +// names are normally a small fixed set, so clearing on pathological growth +// preserves the fast path without retaining unbounded user-generated keys. +const MAX_STYLE_NAME_CACHE_SIZE = 1024; function processStyleName(styleName: string): PrecomputedChunk { const chunk = styleNameCache.get(styleName); if (chunk !== undefined) { @@ -1189,6 +1193,9 @@ function processStyleName(styleName: string): PrecomputedChunk { const result = stringToPrecomputedChunk( escapeTextForBrowser(hyphenateStyleName(styleName)), ); + if (styleNameCache.size >= MAX_STYLE_NAME_CACHE_SIZE) { + styleNameCache.clear(); + } styleNameCache.set(styleName, result); return result; }