wip: suspense feature flag

This commit is contained in:
Evan You 2019-09-09 16:28:32 -04:00
parent 7e70acf9c2
commit d5e9682040
5 changed files with 37 additions and 16 deletions

View File

@ -4,7 +4,8 @@ module.exports = {
__DEV__: true,
__JSDOM__: true,
__FEATURE_OPTIONS__: true,
__FEATURE_PRODUCTION_TIP__: false
__FEATURE_PRODUCTION_TIP__: false,
__FEATURE_SUSPENSE__: true
},
coverageDirectory: 'coverage',
coverageReporters: ['html', 'lcov', 'text'],

View File

@ -5,3 +5,4 @@ declare var __JSDOM__: boolean
// Feature flags
declare var __FEATURE_OPTIONS__: boolean
declare var __FEATURE_PRODUCTION_TIP__: boolean
declare var __FEATURE_SUSPENSE__: boolean

View File

@ -242,9 +242,16 @@ export function setupStatefulComponent(instance: ComponentInternalInstance) {
isFunction(setupResult.then) &&
isFunction(setupResult.catch)
) {
// async setup returned Promise.
// bail here and wait for re-entry.
instance.asyncDep = setupResult as Promise<any>
if (__FEATURE_SUSPENSE__) {
// async setup returned Promise.
// bail here and wait for re-entry.
instance.asyncDep = setupResult as Promise<any>
} else if (__DEV__) {
warn(
`setup() returned a Promise, but the version of Vue you are using ` +
`does not support it yet.`
)
}
return
} else {
handleSetupResult(instance, setupResult)

View File

@ -194,15 +194,19 @@ export function createRenderer<
)
break
case Suspense:
processSuspense(
n1,
n2,
container,
anchor,
parentComponent,
isSVG,
optimized
)
if (__FEATURE_SUSPENSE__) {
processSuspense(
n1,
n2,
container,
anchor,
parentComponent,
isSVG,
optimized
)
} else if (__DEV__) {
warn(`Suspense is not enabled in the version of Vue you are using.`)
}
break
default:
if (shapeFlag & ShapeFlags.ELEMENT) {
@ -730,10 +734,16 @@ export function createRenderer<
} else {
const instance = (n2.component =
n1.component) as ComponentInternalInstance
// async still pending
if (instance.asyncDep && !instance.asyncResolved) {
if (
__FEATURE_SUSPENSE__ &&
instance.asyncDep &&
!instance.asyncResolved
) {
return
}
// a resolved async component, on successful re-entry.
// pickup the mounting process and setup render effect
if (!instance.update) {
@ -741,7 +751,8 @@ export function createRenderer<
} else if (
shouldUpdateComponent(n1, n2, optimized) ||
// TODO use context suspense
(instance.provides.suspense &&
(__FEATURE_SUSPENSE__ &&
instance.provides.suspense &&
!(instance.provides.suspense as any).isResolved)
) {
// normal update
@ -791,7 +802,7 @@ export function createRenderer<
// setup() is async. This component relies on async logic to be resolved
// before proceeding
if (instance.asyncDep) {
if (__FEATURE_SUSPENSE__ && instance.asyncDep) {
// TODO use context suspense
const suspense = (instance as any).provides.suspense
if (!suspense) {

View File

@ -140,6 +140,7 @@ function createReplacePlugin(isProduction, isBunlderESMBuild, isBrowserBuild) {
// support options?
// the lean build drops options related code with buildOptions.lean: true
__FEATURE_OPTIONS__: !packageOptions.lean,
__FEATURE_SUSPENSE__: true,
// this is only used during tests
__JSDOM__: false
})