I am considering using object pooling of DOM nodes. When a DOM node is done being used, it would be put into a pool. I have something like this currently.
function removeNativeElement(virtualElement, store) {
let stack = [virtualElement]
let els = []
while (stack.length) {
const node = stack.shift()
const el = node.nativeElement
// remove from parent
el.parentNode.removeChild(el)
// remove event listeners
node.handlers.forEach(({ type, handler }) => {
el.removeEventListener(type, handler)
})
el.children.forEach(child => {
stack.push(child)
})
els.push(el)
}
els.forEach(el => {
// clear out any remaining text
el.innerHTML = ''
addNativeElementToPool(el)
})
}
function addNativeElementToPool(el, store) {
const pool = store.pool[el.tagName] = store.pool[el.tagName] || []
if (pool.length > store.maxPoolSize) {
return
}
pool.push(el)
}
But what about resetting the attributes
and style
properties, in an efficient way, how do you do that? The goal is to make putting object into a pool not be overburdeningly expensive.