fix(compat): fix app-level asset registration affecting other local apps (#5979)
This commit is contained in:
parent
7fbc933f4d
commit
7fb57327b9
@ -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
|
||||
|
@ -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: '<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()
|
||||
})
|
Loading…
Reference in New Issue
Block a user