diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index e0fc699fa5f..1cde73bd48a 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -381,9 +381,10 @@ function installLegacyAPIs(app: App) { function applySingletonAppMutations(app: App) { // copy over asset registries and deopt flag - ;['mixins', 'components', 'directives', 'filters', 'deopt'].forEach(key => { + app._context.mixins = [...singletonApp._context.mixins] + ;['components', 'directives', 'filters'].forEach(key => { // @ts-ignore - app._context[key] = singletonApp._context[key] + app._context[key] = Object.create(singletonApp._context[key]) }) // copy over global config mutations diff --git a/packages/vue-compat/__tests__/global.spec.ts b/packages/vue-compat/__tests__/global.spec.ts index e4cd30074da..0bc18a5d588 100644 --- a/packages/vue-compat/__tests__/global.spec.ts +++ b/packages/vue-compat/__tests__/global.spec.ts @@ -448,3 +448,25 @@ test('global asset registration should affect apps created via createApp', () => expect(vm.$el.textContent).toBe('foo') delete singletonApp._context.components.foo }) + +test('post-facto global asset registration should affect apps created via createApp', () => { + const app = createApp({ + template: '' + }) + Vue.component('foo', { template: 'foo' }) + const vm = app.mount(document.createElement('div')) as any; + expect(vm.$el.textContent).toBe('foo') + delete singletonApp._context.components.foo +}) + +test('local asset registration should not affect other local apps', () => { + const app1 = createApp({}); + const app2 = createApp({}); + + app1.component('foo', {}); + app2.component('foo', {}); + + expect( + `Component "foo" has already been registered in target app` + ).not.toHaveBeenWarned() +}) \ No newline at end of file