Procházet zdrojové kódy

wip: suspense feature flag

Evan You před 6 roky
rodič
revize
d5e9682040

+ 2 - 1
jest.config.js

@@ -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'],

+ 1 - 0
packages/global.d.ts

@@ -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

+ 10 - 3
packages/runtime-core/src/component.ts

@@ -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)

+ 23 - 12
packages/runtime-core/src/createRenderer.ts

@@ -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) {

+ 1 - 0
rollup.config.js

@@ -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
   })