From 4debdadcc4c1c18109f2e15237430ea3ce94ad7a Mon Sep 17 00:00:00 2001 From: jdecroock Date: Wed, 7 Aug 2024 10:06:11 +0200 Subject: [PATCH] Optimise perf --- .changeset/proud-apes-tickle.md | 5 +++++ package.json | 2 +- src/index.js | 21 +++++++++++---------- 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/proud-apes-tickle.md diff --git a/.changeset/proud-apes-tickle.md b/.changeset/proud-apes-tickle.md new file mode 100644 index 0000000..d61cd22 --- /dev/null +++ b/.changeset/proud-apes-tickle.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': patch +--- + +Improve perf a bit by hoisting the typeof check to reduce calling typeof diff --git a/package.json b/package.json index fa91b13..ea15c89 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "@babel/register": "^7.12.10", "@changesets/changelog-github": "^0.4.1", "@changesets/cli": "^2.18.0", - "baseline-rts": "npm:preact-render-to-string@6.5.7", + "baseline-rts": "npm:preact-render-to-string@latest", "benchmarkjs-pretty": "^2.0.1", "chai": "^4.2.0", "check-export-map": "^1.3.1", diff --git a/src/index.js b/src/index.js index a5ce8d9..c2efbdf 100644 --- a/src/index.js +++ b/src/index.js @@ -236,12 +236,11 @@ function _renderToString( return EMPTY_STR; } + let vnodeType = typeof vnode; // Text VNodes: escape as HTML - if (typeof vnode !== 'object') { - if (typeof vnode === 'function') return EMPTY_STR; - return typeof vnode === 'string' - ? encodeEntities(vnode) - : vnode + EMPTY_STR; + if (vnodeType !== 'object') { + if (vnodeType === 'function') return EMPTY_STR; + return vnodeType === 'string' ? encodeEntities(vnode) : vnode + EMPTY_STR; } // Recurse into children / Arrays @@ -305,7 +304,7 @@ function _renderToString( if (typeof type === 'function') { if (type === Fragment) { // Serialized precompiled JSX. - if (props.tpl) { + if ('tpl' in props) { let out = EMPTY_STR; for (let i = 0; i < props.tpl.length; i++) { out = out + props.tpl[i]; @@ -338,7 +337,7 @@ function _renderToString( } return out; - } else if (props.UNSTABLE_comment) { + } else if ('UNSTABLE_comment' in props) { // Fragments are the least used components of core that's why // branching here for comments has the least effect on perf. return ( @@ -402,7 +401,8 @@ function _renderToString( let isTopLevelFragment = rendered != null && rendered.type === Fragment && - rendered.key == null; + rendered.key == null && + !('tpl' in rendered.props); rendered = isTopLevelFragment ? rendered.props.children : rendered; try { @@ -437,7 +437,8 @@ function _renderToString( let isTopLevelFragment = rendered != null && rendered.type === Fragment && - rendered.key == null; + rendered.key == null && + !('tpl' in rendered.props); rendered = isTopLevelFragment ? rendered.props.children : rendered; str = _renderToString( @@ -467,7 +468,7 @@ function _renderToString( rendered != null && rendered.type === Fragment && rendered.key == null && - rendered.props.tpl == null; + !('tpl' in rendered.props); rendered = isTopLevelFragment ? rendered.props.children : rendered; try {