__BROWSER__: false,
__BUNDLER__: true,
__RUNTIME_COMPILE__: true,
- __SSR__: false,
+ __NODE_JS__: true,
__FEATURE_OPTIONS__: true,
__FEATURE_SUSPENSE__: true
},
declare var __BROWSER__: boolean
declare var __BUNDLER__: boolean
declare var __RUNTIME_COMPILE__: boolean
-declare var __SSR__: boolean
+declare var __NODE_JS__: boolean
declare var __COMMIT__: string
declare var __VERSION__: string
ComponentInternalInstance,
LifecycleHooks,
currentInstance,
- setCurrentInstance
+ setCurrentInstance,
+ isInSSRComponentSetup
} from './component'
import { ComponentPublicInstance } from './componentProxy'
import { callWithAsyncErrorHandling, ErrorTypeStrings } from './errorHandling'
lifecycle: LifecycleHooks
) => (hook: T, target: ComponentInternalInstance | null = currentInstance) =>
// post-create lifecycle registrations are noops during SSR
- !__SSR__ && injectHook(lifecycle, hook, target)
+ !isInSSRComponentSetup && injectHook(lifecycle, hook, target)
export const onBeforeMount = createHook(LifecycleHooks.BEFORE_MOUNT)
export const onMounted = createHook(LifecycleHooks.MOUNTED)
currentInstance,
ComponentInternalInstance,
currentSuspense,
- Data
+ Data,
+ isInSSRComponentSetup
} from './component'
import {
ErrorCodes,
cbOrOptions?: WatchCallback<T> | WatchOptions,
options?: WatchOptions
): StopHandle {
- if (__SSR__ && !(options && options.flush === 'sync')) {
- // during SSR, non-sync watchers never fire.
+ if (isInSSRComponentSetup && !(options && options.flush === 'sync')) {
+ // component watchers during SSR are no-op
return NOOP
} else if (isFunction(cbOrOptions)) {
// effect callback as 2nd argument - this is a source watcher
}
}
+export let isInSSRComponentSetup = false
+
export function setupComponent(
instance: ComponentInternalInstance,
- parentSuspense: SuspenseBoundary | null
+ parentSuspense: SuspenseBoundary | null,
+ isSSR = false
) {
+ isInSSRComponentSetup = isSSR
const propsOptions = instance.type.props
const { props, children, shapeFlag } = instance.vnode
resolveProps(instance, props, propsOptions)
resolveSlots(instance, children)
// setup stateful logic
+ let setupResult
if (shapeFlag & ShapeFlags.STATEFUL_COMPONENT) {
- return setupStatefulComponent(instance, parentSuspense)
+ setupResult = setupStatefulComponent(instance, parentSuspense)
}
+ isInSSRComponentSetup = false
+ return setupResult
}
function setupStatefulComponent(
// 2. create props proxy
// the propsProxy is a reactive AND readonly proxy to the actual props.
// it will be updated in resolveProps() on updates before render
- const propsProxy = (instance.propsProxy = __SSR__
+ const propsProxy = (instance.propsProxy = isInSSRComponentSetup
? instance.props
: shallowReadonly(instance.props))
// 3. call setup()
currentSuspense = null
if (isPromise(setupResult)) {
- if (__SSR__) {
+ if (isInSSRComponentSetup) {
// return the promise so server-renderer can wait on it
return setupResult.then(resolvedResult => {
handleSetupResult(instance, resolvedResult, parentSuspense)
;(Component.render as RenderFunction).isRuntimeCompiled = true
}
- if (__DEV__ && !Component.render) {
+ if (__DEV__ && !Component.render && !Component.ssrRender) {
/* istanbul ignore if */
if (!__RUNTIME_COMPILE__ && Component.template) {
warn(
`does not support runtime template compilation. Either use the ` +
`full build or pre-compile the template using Vue CLI.`
)
- } else if (!__SSR__ || !Component.ssrRender) {
+ } else {
warn(
`Component is missing${
__RUNTIME_COMPILE__ ? ` template or` : ``
import { renderComponentRoot } from './componentRenderUtils'
import { normalizeVNode } from './vnode'
-// SSR utils are only exposed in SSR builds.
+// SSR utils are only exposed in cjs builds.
const _ssrUtils = {
createComponentInstance,
setupComponent,
normalizeVNode
}
-export const ssrUtils = (__SSR__ ? _ssrUtils : null) as typeof _ssrUtils
+export const ssrUtils = (__NODE_JS__ ? _ssrUtils : null) as typeof _ssrUtils
// Types -----------------------------------------------------------------------
isPromise,
isArray,
isFunction,
- isVoidTag,
- EMPTY_OBJ
+ isVoidTag
} from '@vue/shared'
import { renderProps } from './renderProps'
import { escape } from './escape'
parentComponent: ComponentInternalInstance | null = null
): ResolvedSSRBuffer | Promise<ResolvedSSRBuffer> {
const instance = createComponentInstance(vnode, parentComponent)
- const res = setupComponent(instance, null)
+ const res = setupComponent(
+ instance,
+ null /* parentSuspense */,
+ true /* isSSR */
+ )
if (isPromise(res)) {
return res.then(() => renderComponentSubTree(instance))
} else {
// support compile in browser?
__RUNTIME_COMPILE__: isRuntimeCompileBuild,
// is targeting Node (SSR)?
- __SSR__: isNodeBuild,
+ __NODE_JS__: isNodeBuild,
// support options?
// the lean build drops options related code with buildOptions.lean: true
__FEATURE_OPTIONS__: !packageOptions.lean && !process.env.LEAN,