diff --git a/.changeset/proud-apes-tickle.md b/.changeset/proud-apes-tickle.md new file mode 100644 index 00000000..d61cd228 --- /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 fa91b137..ea15c894 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 a5ce8d9a..c2efbdf8 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 {