From 0677d631c14609a09cb221ecffa0b4a7599d5674 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Wed, 2 Oct 2024 20:44:46 +0200 Subject: [PATCH 1/2] Test some performance stuff --- src/diff/index.js | 3 ++- src/diff/props.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/diff/index.js b/src/diff/index.js index 287f94344d..e08afe4ad3 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -1,4 +1,5 @@ import { + EMPTY_ARR, EMPTY_OBJ, MODE_HYDRATE, MODE_SUSPENDED, @@ -498,7 +499,7 @@ function diffElementNodes( dom.innerHTML = newHtml.__html; } - newVNode._children = []; + newVNode._children = EMPTY_ARR; } else { if (oldHtml) dom.innerHTML = ''; diff --git a/src/diff/props.js b/src/diff/props.js index 316146f0fd..7d0960765a 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -135,7 +135,10 @@ export function setProperty(dom, name, value, oldValue, namespace) { if (typeof value == 'function') { // never serialize functions as attribute values - } else if (value != null && (value !== false || name[4] === '-')) { + } else if ( + value != null && + (value !== false || (name.length > 4 && name[4] === '-')) + ) { dom.setAttribute(name, name == 'popover' && value == true ? '' : value); } else { dom.removeAttribute(name); From 41eee180d8d74e589f7ca6a8c596934f3c2ae8b2 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Thu, 3 Oct 2024 17:03:11 +0200 Subject: [PATCH 2/2] Make oldVNode monomorphic --- src/create-element.js | 4 ++++ src/diff/children.js | 8 ++++---- src/render.js | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/create-element.js b/src/create-element.js index 66898b2224..67d5c910be 100644 --- a/src/create-element.js +++ b/src/create-element.js @@ -84,6 +84,10 @@ export function createVNode(type, props, key, ref, original) { return vnode; } +// @ts-ignore +export const EMPTY_VNODE = createVNode(null, {}); +EMPTY_VNODE._children = []; + export function createRef() { return { current: null }; } diff --git a/src/diff/children.js b/src/diff/children.js index ba2730478c..59b668b309 100644 --- a/src/diff/children.js +++ b/src/diff/children.js @@ -1,6 +1,6 @@ import { diff, unmount, applyRef } from './index'; -import { createVNode, Fragment } from '../create-element'; -import { EMPTY_OBJ, EMPTY_ARR, INSERT_VNODE, MATCHED } from '../constants'; +import { createVNode, Fragment, EMPTY_VNODE } from '../create-element'; +import { EMPTY_ARR, INSERT_VNODE, MATCHED } from '../constants'; import { isArray } from '../util'; import { getDomSibling } from '../component'; @@ -67,9 +67,9 @@ export function diffChildren( // At this point, constructNewChildrenArray has assigned _index to be the // matchingIndex for this VNode's oldVNode (or -1 if there is no oldVNode). if (childVNode._index === -1) { - oldVNode = EMPTY_OBJ; + oldVNode = EMPTY_VNODE; } else { - oldVNode = oldChildren[childVNode._index] || EMPTY_OBJ; + oldVNode = oldChildren[childVNode._index] || EMPTY_VNODE; } // Update childVNode._index to its final index diff --git a/src/render.js b/src/render.js index e0fec45424..dac3036dc2 100644 --- a/src/render.js +++ b/src/render.js @@ -1,6 +1,6 @@ import { EMPTY_OBJ } from './constants'; import { commitRoot, diff } from './diff/index'; -import { createElement, Fragment } from './create-element'; +import { createElement, Fragment, EMPTY_VNODE } from './create-element'; import options from './options'; import { slice } from './util'; @@ -39,7 +39,7 @@ export function render(vnode, parentDom, replaceNode) { // Determine the new vnode tree and store it on the DOM element on // our custom `_children` property. vnode, - oldVNode || EMPTY_OBJ, + oldVNode || EMPTY_VNODE, EMPTY_OBJ, parentDom.namespaceURI, !isHydrating && replaceNode