]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(runtime-dom): hmr for custom elements
authorEvan You <yyx990803@gmail.com>
Thu, 22 Jul 2021 21:48:15 +0000 (17:48 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 22 Jul 2021 21:48:15 +0000 (17:48 -0400)
packages/runtime-dom/src/apiCustomElement.ts

index adbeb7608b5a03e6f8ffa603476efa1373f0d524..31302e13b0643f206f3c75fe75a660b506787796 100644 (file)
@@ -130,6 +130,7 @@ export function defineCustomElement(
   const propKeys = rawKeys.map(camelize)
 
   class VueCustomElement extends VueElement {
+    static def = Comp
     static get observedAttributes() {
       return attrKeys
     }
@@ -192,13 +193,7 @@ export class VueElement extends BaseClass {
         )
       }
       this.attachShadow({ mode: 'open' })
-      if (_def.styles) {
-        _def.styles.forEach(css => {
-          const s = document.createElement('style')
-          s.textContent = css
-          this.shadowRoot!.appendChild(s)
-        })
-      }
+      this._applyStyles()
     }
   }
 
@@ -268,6 +263,16 @@ export class VueElement extends BaseClass {
       vnode.ce = instance => {
         this._instance = instance
         instance.isCE = true
+        // HMR
+        if (__DEV__) {
+          instance.appContext.reload = () => {
+            render(this._createVNode(), this.shadowRoot!)
+            this.shadowRoot!.querySelectorAll('style').forEach(s => {
+              this.shadowRoot!.removeChild(s)
+            })
+            this._applyStyles()
+          }
+        }
 
         // intercept emit
         instance.emit = (event: string, ...args: any[]) => {
@@ -293,4 +298,14 @@ export class VueElement extends BaseClass {
     }
     return vnode
   }
+
+  private _applyStyles() {
+    if (this._def.styles) {
+      this._def.styles.forEach(css => {
+        const s = document.createElement('style')
+        s.textContent = css
+        this.shadowRoot!.appendChild(s)
+      })
+    }
+  }
 }