vue3-core/packages/runtime-dom/src/index.ts

136 lines
3.4 KiB
TypeScript
Raw Normal View History

2019-11-01 23:32:53 +08:00
import {
createRenderer,
createHydrationRenderer,
2019-11-01 23:32:53 +08:00
warn,
RootRenderFunction,
CreateAppFunction,
Renderer,
HydrationRenderer,
App,
RootHydrateFunction
2019-11-01 23:32:53 +08:00
} from '@vue/runtime-core'
2019-06-20 21:28:37 +08:00
import { nodeOps } from './nodeOps'
import { patchProp } from './patchProp'
// Importing from the compiler, will be tree-shaken in prod
import { isFunction, isString, isHTMLTag, isSVGTag } from '@vue/shared'
2018-09-19 23:35:38 +08:00
const rendererOptions = {
2019-06-20 21:28:37 +08:00
patchProp,
...nodeOps
}
// lazy create the renderer - this makes core renderer logic tree-shakable
// in case the user only imports reactivity utilities from Vue.
let renderer: Renderer | HydrationRenderer
let enabledHydration = false
function ensureRenderer() {
return renderer || (renderer = createRenderer(rendererOptions))
}
function ensureHydrationRenderer() {
renderer = enabledHydration
? renderer
: createHydrationRenderer(rendererOptions)
enabledHydration = true
return renderer as HydrationRenderer
}
2019-09-03 04:09:34 +08:00
2019-11-01 23:32:53 +08:00
// use explicit type casts here to avoid import() calls in rolled-up d.ts
export const render = ((...args) => {
ensureRenderer().render(...args)
}) as RootRenderFunction<Node, Element>
export const hydrate = ((...args) => {
ensureHydrationRenderer().hydrate(...args)
}) as RootHydrateFunction
2019-11-01 23:32:53 +08:00
export const createApp = ((...args) => {
const app = ensureRenderer().createApp(...args)
if (__DEV__) {
injectNativeTagCheck(app)
}
const { mount } = app
app.mount = (containerOrSelector: Element | string): any => {
const container = normalizeContainer(containerOrSelector)
if (!container) return
const component = app._component
if (
__RUNTIME_COMPILE__ &&
!isFunction(component) &&
!component.render &&
!component.template
) {
component.template = container.innerHTML
}
// clear content before mounting
container.innerHTML = ''
return mount(container)
}
return app
}) as CreateAppFunction<Element>
export const createSSRApp = ((...args) => {
const app = ensureHydrationRenderer().createApp(...args)
if (__DEV__) {
injectNativeTagCheck(app)
}
const { mount } = app
app.mount = (containerOrSelector: Element | string): any => {
const container = normalizeContainer(containerOrSelector)
if (container) {
return mount(container, true)
2020-02-14 12:31:03 +08:00
}
}
return app
}) as CreateAppFunction<Element>
function injectNativeTagCheck(app: App) {
// Inject `isNativeTag`
// this is used for component name validation (dev only)
Object.defineProperty(app.config, 'isNativeTag', {
value: (tag: string) => isHTMLTag(tag) || isSVGTag(tag),
writable: false
})
}
function normalizeContainer(container: Element | string): Element | null {
if (isString(container)) {
const res = document.querySelector(container)
if (__DEV__ && !res) {
warn(`Failed to mount app: mount target selector returned null.`)
}
return res
}
return container
}
2019-11-29 07:41:01 +08:00
// DOM-only runtime directive helpers
2019-10-11 06:02:51 +08:00
export {
vModelText,
vModelCheckbox,
vModelRadio,
vModelSelect,
vModelDynamic
} from './directives/vModel'
export { withModifiers, withKeys } from './directives/vOn'
2019-11-29 07:41:01 +08:00
export { vShow } from './directives/vShow'
// DOM-only components
2019-11-25 05:00:46 +08:00
export { Transition, TransitionProps } from './components/Transition'
2019-11-29 07:41:01 +08:00
export {
TransitionGroup,
TransitionGroupProps
} from './components/TransitionGroup'
// re-export everything from core
2019-08-20 21:58:10 +08:00
// h, Component, reactivity API, nextTick, flags & types
2018-10-27 03:44:50 +08:00
export * from '@vue/runtime-core'