fix(hmr): support hmr for static nodes

This commit is contained in:
Evan You 2020-04-30 14:38:13 -04:00
parent 9f8ed4a9b5
commit 386b093554
2 changed files with 19 additions and 2 deletions

View File

@ -115,6 +115,7 @@ export interface RendererOptions<
anchor: HostNode | null, anchor: HostNode | null,
isSVG: boolean isSVG: boolean
): HostElement ): HostElement
setStaticContent?(node: HostElement, content: string): void
} }
// Renderer Node can technically be any object in the context of core renderer // Renderer Node can technically be any object in the context of core renderer
@ -330,7 +331,8 @@ function baseCreateRenderer(
nextSibling: hostNextSibling, nextSibling: hostNextSibling,
setScopeId: hostSetScopeId = NOOP, setScopeId: hostSetScopeId = NOOP,
cloneNode: hostCloneNode, cloneNode: hostCloneNode,
insertStaticContent: hostInsertStaticContent insertStaticContent: hostInsertStaticContent,
setStaticContent: hostSetStaticContent
} = options } = options
// Note: functions inside this closure should use `const xxx = () => {}` // Note: functions inside this closure should use `const xxx = () => {}`
@ -363,7 +365,13 @@ function baseCreateRenderer(
case Static: case Static:
if (n1 == null) { if (n1 == null) {
mountStaticNode(n2, container, anchor, isSVG) mountStaticNode(n2, container, anchor, isSVG)
} // static nodes are noop on patch } else if (__DEV__) {
// static nodes are only patched during dev for HMR
n2.el = n1.el
if (n2.children !== n1.children) {
hostSetStaticContent!(n2.el!, n2.children as string)
}
}
break break
case Fragment: case Fragment:
processFragment( processFragment(

View File

@ -69,3 +69,12 @@ export const nodeOps: Omit<RendererOptions<Node, Element>, 'patchProp'> = {
return node return node
} }
} }
if (__DEV__) {
// __UNSAFE__
// Reason: innerHTML.
// same as `insertStaticContent`, but this is also dev only (for HMR).
nodeOps.setStaticContent = (el, content) => {
el.innerHTML = content
}
}