fix(compat): fix app-level asset registration affecting other local apps (#5979)

This commit is contained in:
Alex Van Liew 2022-05-22 18:41:39 -07:00 committed by GitHub
parent 7fbc933f4d
commit 7fb57327b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 2 deletions

View File

@ -381,9 +381,10 @@ function installLegacyAPIs(app: App) {
function applySingletonAppMutations(app: App) { function applySingletonAppMutations(app: App) {
// copy over asset registries and deopt flag // 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 // @ts-ignore
app._context[key] = singletonApp._context[key] app._context[key] = Object.create(singletonApp._context[key])
}) })
// copy over global config mutations // copy over global config mutations

View File

@ -448,3 +448,25 @@ test('global asset registration should affect apps created via createApp', () =>
expect(vm.$el.textContent).toBe('foo') expect(vm.$el.textContent).toBe('foo')
delete singletonApp._context.components.foo delete singletonApp._context.components.foo
}) })
test('post-facto global asset registration should affect apps created via createApp', () => {
const app = createApp({
template: '<foo/>'
})
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()
})