From 5ba1afba09c3ea56c1c17484f5d8aeae210ce52a Mon Sep 17 00:00:00 2001 From: edison Date: Thu, 5 Jun 2025 10:10:52 +0800 Subject: [PATCH] fix(custom-element): ensure configureApp is applied to async component (#12607) close #12448 --- .../__tests__/customElement.spec.ts | 23 +++++++++++++++++++ packages/runtime-dom/src/apiCustomElement.ts | 7 +++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/runtime-dom/__tests__/customElement.spec.ts b/packages/runtime-dom/__tests__/customElement.spec.ts index a2b4c2636..c44840df5 100644 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@ -1566,6 +1566,29 @@ describe('defineCustomElement', () => { expect(e.shadowRoot?.innerHTML).toBe('
app-injected
') }) + // #12448 + test('work with async component', async () => { + const AsyncComp = defineAsyncComponent(() => { + return Promise.resolve({ + render() { + const msg: string | undefined = inject('msg') + return h('div', {}, msg) + }, + } as any) + }) + const E = defineCustomElement(AsyncComp, { + configureApp(app) { + app.provide('msg', 'app-injected') + }, + }) + customElements.define('my-async-element-with-app', E) + + container.innerHTML = `` + const e = container.childNodes[0] as VueElement + await new Promise(r => setTimeout(r)) + expect(e.shadowRoot?.innerHTML).toBe('
app-injected
') + }) + test('with hmr reload', async () => { const __hmrId = '__hmrWithApp' const def = defineComponent({ diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 56b86a5fd..edf7c4313 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -404,9 +404,10 @@ export class VueElement const asyncDef = (this._def as ComponentOptions).__asyncLoader if (asyncDef) { - this._pendingResolve = asyncDef().then(def => - resolve((this._def = def), true), - ) + this._pendingResolve = asyncDef().then((def: InnerComponentDef) => { + def.configureApp = this._def.configureApp + resolve((this._def = def), true) + }) } else { resolve(this._def) }