From 5e85b500d1979342e770db9bceb91c8055dda2de Mon Sep 17 00:00:00 2001 From: Iago Espinoza Date: Thu, 10 Sep 2026 17:58:34 -0300 Subject: [PATCH 1/2] perf: de-duplicate identical ' + ) + + const Helmet = loadHelmet() + + // This is the hydration case: the component that declared the script + // mounts on the client, but the browser already ran the server-rendered + // tag, so forwarding it to react-helmet would make it execute twice. + render() + + expect(renderedScriptSrcs()).toEqual([]) +}) + +it('drops a server-rendered script src declared as a JSX child', () => { + givenServerRenderedHead( + '' + ) + + const Helmet = loadHelmet() + + render( + + ' + ) + + loadHelmet() + + // Without `data-react-helmet`, react-helmet no longer recognizes the tag + // as its own, so it won't remove it during its first DOM sync -- the tag + // stays exactly where the server put it. + expect(document.head.querySelectorAll('script[src]')).toHaveLength(1) + expect( + document.head.querySelectorAll('script[src][data-react-helmet]') + ).toHaveLength(0) +}) + +it('only adopts server-rendered scripts that have a src', () => { + givenServerRenderedHead( + '' + ) + + const Helmet = loadHelmet() + + render() + + expect(renderedScriptSrcs()).toEqual(['https://example.com/a.js']) +}) + +it('does not adopt scripts that react-helmet did not render', () => { + givenServerRenderedHead('') + + const Helmet = loadHelmet() + + // A script the page put in the head by itself isn't react-helmet's to + // manage, so react-helmet won't remove/re-add it and there's nothing to + // de-duplicate against. + render() + + expect(renderedScriptSrcs()).toEqual(['https://example.com/a.js']) +}) + +it('still forwards scripts that were not server-rendered', () => { + givenServerRenderedHead( + '' + ) + + const Helmet = loadHelmet() + + render( + + ) + + expect(renderedScriptSrcs()).toEqual(['https://example.com/b.js']) +}) + it('starts each fresh module instance with an empty registry', () => { const FirstHelmet = loadHelmet() diff --git a/react/components/Helmet.tsx b/react/components/Helmet.tsx index 0fe32017b..6162204b2 100644 --- a/react/components/Helmet.tsx +++ b/react/components/Helmet.tsx @@ -25,6 +25,8 @@ import { Helmet as ReactHelmet, HelmetProps } from 'react-helmet' * This wrapper drops exact-duplicate `