Procházet zdrojové kódy

feat(ssr): useSSRContext

Evan You před 6 roky
rodič
revize
fd031490fb

+ 19 - 0
packages/runtime-core/src/helpers/useSsrContext.ts

@@ -0,0 +1,19 @@
+import { inject } from '../apiInject'
+import { warn } from '../warning'
+
+export const ssrContextKey = Symbol(__DEV__ ? `ssrContext` : ``)
+
+export const useSSRContext = <T = Record<string, any>>() => {
+  if (!__GLOBAL__) {
+    const ctx = inject<T>(ssrContextKey)
+    if (!ctx) {
+      warn(
+        `Server rendering context not provided. Make sure to only call ` +
+          `useSsrContext() conditionally in the server build.`
+      )
+    }
+    return ctx
+  } else if (__DEV__) {
+    warn(`useSsrContext() is not supported in the global build.`)
+  }
+}

+ 3 - 0
packages/runtime-core/src/index.ts

@@ -61,6 +61,9 @@ export {
 // SFC CSS Modules
 export { useCSSModule } from './helpers/useCssModule'
 
+// SSR context
+export { useSSRContext, ssrContextKey } from './helpers/useSsrContext'
+
 // Internal API ----------------------------------------------------------------
 
 // For custom renderers

+ 2 - 3
packages/server-renderer/src/renderToString.ts

@@ -11,7 +11,8 @@ import {
   ssrUtils,
   Slots,
   warn,
-  createApp
+  createApp,
+  ssrContextKey
 } from 'vue'
 import {
   ShapeFlags,
@@ -52,8 +53,6 @@ export type PushFn = (item: SSRBufferItem) => void
 
 export type Props = Record<string, unknown>
 
-const ssrContextKey = Symbol()
-
 export type SSRContext = {
   [key: string]: any
   portals?: Record<string, string>