fix(runtime-dom): support mounting app on ShadowRoot (#2447)

fix #2399
This commit is contained in:
ᴜɴвʏтᴇ 2020-12-05 05:51:38 +08:00 committed by GitHub
parent 338d869c70
commit b2189ba2f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -58,7 +58,7 @@ export const createApp = ((...args) => {
}
const { mount } = app
app.mount = (containerOrSelector: Element | string): any => {
app.mount = (containerOrSelector: Element | ShadowRoot | string): any => {
const container = normalizeContainer(containerOrSelector)
if (!container) return
const component = app._component
@ -68,8 +68,10 @@ export const createApp = ((...args) => {
// clear content before mounting
container.innerHTML = ''
const proxy = mount(container)
container.removeAttribute('v-cloak')
container.setAttribute('data-v-app', '')
if (container instanceof Element) {
container.removeAttribute('v-cloak')
container.setAttribute('data-v-app', '')
}
return proxy
}
@ -84,7 +86,7 @@ export const createSSRApp = ((...args) => {
}
const { mount } = app
app.mount = (containerOrSelector: Element | string): any => {
app.mount = (containerOrSelector: Element | ShadowRoot | string): any => {
const container = normalizeContainer(containerOrSelector)
if (container) {
return mount(container, true)
@ -103,7 +105,9 @@ function injectNativeTagCheck(app: App) {
})
}
function normalizeContainer(container: Element | string): Element | null {
function normalizeContainer(
container: Element | ShadowRoot | string
): Element | null {
if (isString(container)) {
const res = document.querySelector(container)
if (__DEV__ && !res) {
@ -111,7 +115,16 @@ function normalizeContainer(container: Element | string): Element | null {
}
return res
}
return container
if (
__DEV__ &&
container instanceof ShadowRoot &&
container.mode === 'closed'
) {
warn(
`mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
)
}
return container as any
}
// SFC CSS utilities