fix(compat): fix globalProperties pollution in v3 mode

fix #5699
This commit is contained in:
Evan You 2022-05-23 09:46:00 +08:00
parent 108474e2bb
commit 2f07e3460b
2 changed files with 40 additions and 8 deletions

View File

@ -399,7 +399,7 @@ function applySingletonAppMutations(app: App) {
} }
const val = singletonApp.config[key as keyof AppConfig] const val = singletonApp.config[key as keyof AppConfig]
// @ts-ignore // @ts-ignore
app.config[key] = val app.config[key] = isObject(val) ? Object.create(val) : val
// compat for runtime ignoredElements -> isCustomElement // compat for runtime ignoredElements -> isCustomElement
if ( if (

View File

@ -1,6 +1,6 @@
import Vue from '@vue/compat' import Vue from '@vue/compat'
import { effect, isReactive } from '@vue/reactivity' import { effect, isReactive } from '@vue/reactivity'
import { nextTick } from '@vue/runtime-core' import { h, nextTick } from '@vue/runtime-core'
import { import {
DeprecationTypes, DeprecationTypes,
deprecationData, deprecationData,
@ -454,19 +454,51 @@ test('post-facto global asset registration should affect apps created via create
template: '<foo/>' template: '<foo/>'
}) })
Vue.component('foo', { template: 'foo' }) Vue.component('foo', { template: 'foo' })
const vm = app.mount(document.createElement('div')) as any; const vm = app.mount(document.createElement('div')) as any
expect(vm.$el.textContent).toBe('foo') expect(vm.$el.textContent).toBe('foo')
delete singletonApp._context.components.foo delete singletonApp._context.components.foo
}) })
test('local asset registration should not affect other local apps', () => { test('local asset registration should not affect other local apps', () => {
const app1 = createApp({}); const app1 = createApp({})
const app2 = createApp({}); const app2 = createApp({})
app1.component('foo', {}); app1.component('foo', {})
app2.component('foo', {}); app2.component('foo', {})
expect( expect(
`Component "foo" has already been registered in target app` `Component "foo" has already been registered in target app`
).not.toHaveBeenWarned() ).not.toHaveBeenWarned()
}) })
test('local app-level mixin registration should not affect other local apps', () => {
const app1 = createApp({ render: () => h('div') })
const app2 = createApp({})
const mixin = { created: jest.fn() }
app1.mixin(mixin)
app2.mixin(mixin)
expect(`Mixin has already been applied`).not.toHaveBeenWarned()
app1.mount(document.createElement('div'))
expect(mixin.created).toHaveBeenCalledTimes(1)
})
// #5699
test('local app config should not affect other local apps in v3 mode', () => {
Vue.configureCompat({ MODE: 3 })
const app1 = createApp({
render: () => h('div'),
provide() {
return {
test: 123
}
}
})
app1.config.globalProperties.test = () => {}
app1.mount(document.createElement('div'))
const app2 = createApp({})
expect(app2.config.globalProperties.test).toBe(undefined)
})