]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: ensure ssr branches are included in esm-bundler build
authorEvan You <yyx990803@gmail.com>
Thu, 23 Sep 2021 19:02:19 +0000 (15:02 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 23 Sep 2021 19:02:19 +0000 (15:02 -0400)
jest.config.js
packages/global.d.ts
packages/runtime-core/src/apiAsyncComponent.ts
packages/runtime-core/src/apiWatch.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/index.ts
packages/runtime-dom/src/directives/vModel.ts
packages/runtime-dom/src/directives/vShow.ts
packages/runtime-dom/src/index.ts
packages/server-renderer/src/index.ts
rollup.config.js

index 885724a9643d2de9a56bfefe45953e35d417ba7b..248fb6d086c91426cc71764b1512808059158539 100644 (file)
@@ -11,6 +11,7 @@ module.exports = {
     __ESM_BUNDLER__: true,
     __ESM_BROWSER__: false,
     __NODE_JS__: true,
+    __SSR__: true,
     __FEATURE_OPTIONS_API__: true,
     __FEATURE_SUSPENSE__: true,
     __FEATURE_PROD_DEVTOOLS__: false,
index 52199e5ee2484175cbc7e5dfd12e9304c1096430..a15d04b2ceac4009d071f76fcd084c6cb0247640 100644 (file)
@@ -8,6 +8,7 @@ declare var __GLOBAL__: boolean
 declare var __ESM_BUNDLER__: boolean
 declare var __ESM_BROWSER__: boolean
 declare var __NODE_JS__: boolean
+declare var __SSR__: boolean
 declare var __COMMIT__: string
 declare var __VERSION__: string
 declare var __COMPAT__: boolean
index 4dffee344a42ab0223388641b6351c51684d5fdb..8825eefa5c62cdf9c6faf3dfa6c5f88c00aa64c3 100644 (file)
@@ -141,7 +141,7 @@ export function defineAsyncComponent<
       // suspense-controlled or SSR.
       if (
         (__FEATURE_SUSPENSE__ && suspensible && instance.suspense) ||
-        (__NODE_JS__ && isInSSRComponentSetup)
+        (__SSR__ && isInSSRComponentSetup)
       ) {
         return load()
           .then(comp => {
index a58f4d394f85fc59df27219a72780b1fccd5f218..092491d3b0d3f6a00d42a91ccecc9df2ce34dfa8 100644 (file)
@@ -280,7 +280,7 @@ function doWatch(
 
   // in SSR there is no need to setup an actual effect, and it should be noop
   // unless it's eager
-  if (__NODE_JS__ && isInSSRComponentSetup) {
+  if (__SSR__ && isInSSRComponentSetup) {
     // we will also not call the invalidate callback (+ runner is not set up)
     onInvalidate = NOOP
     if (!cb) {
index 16b2333051d5834b7af1707223d63cba2c14aaf3..515bd16d2f3d5c07476a5cd3eb62ec6f86f49935 100644 (file)
@@ -678,7 +678,7 @@ export function handleSetupResult(
 ) {
   if (isFunction(setupResult)) {
     // setup returned an inline render function
-    if (__NODE_JS__ && (instance.type as ComponentOptions).__ssrInlineRender) {
+    if (__SSR__ && (instance.type as ComponentOptions).__ssrInlineRender) {
       // when the function's name is `ssrRender` (compiled by SFC inline mode),
       // set it as ssrRender instead.
       instance.ssrRender = setupResult
@@ -751,18 +751,11 @@ export function finishComponentSetup(
   }
 
   // template / render function normalization
-  if (__NODE_JS__ && isSSR) {
-    // 1. the render function may already exist, returned by `setup`
-    // 2. otherwise try to use the `Component.render`
-    // 3. if the component doesn't have a render function,
-    //    set `instance.render` to NOOP so that it can inherit the render
-    //    function from mixins/extend
-    instance.render = (instance.render ||
-      Component.render ||
-      NOOP) as InternalRenderFunction
-  } else if (!instance.render) {
-    // could be set from setup()
-    if (compile && !Component.render) {
+  // could be already set when returned from setup()
+  if (!instance.render) {
+    // only do on-the-fly compile if not in SSR - SSR on-the-fly compliation
+    // is done by server-renderer
+    if (!isSSR && compile && !Component.render) {
       const template =
         (__COMPAT__ &&
           instance.vnode.props &&
index b182f7e7472cf8915ca4b6122af7168b9f8d3b4c..d5f1ce1b039b6b45892e3097c53ea7ee2de09cf5 100644 (file)
@@ -315,9 +315,7 @@ const _ssrUtils = {
  * SSR utils for \@vue/server-renderer. Only exposed in cjs builds.
  * @internal
  */
-export const ssrUtils = (
-  __NODE_JS__ || __ESM_BUNDLER__ ? _ssrUtils : null
-) as typeof _ssrUtils
+export const ssrUtils = (__SSR__ ? _ssrUtils : null) as typeof _ssrUtils
 
 // 2.x COMPAT ------------------------------------------------------------------
 
index 11fd5376055f0531496c1117f05fb7848db3c6a7..8780b5d4977cf4e3060bb9df7a28d651c353a9b0 100644 (file)
@@ -303,8 +303,9 @@ function callModelHook(
   fn && fn(el, binding, vnode, prevVNode)
 }
 
-// SSR vnode transforms
-if (__NODE_JS__) {
+// SSR vnode transforms, only used when user includes client-oriented render
+// function in SSR
+export function initVModelForSSR() {
   vModelText.getSSRProps = ({ value }) => ({ value })
 
   vModelRadio.getSSRProps = ({ value }, vnode) => {
index d9bf3af54874e521af72fefb96bd49cb500f13da..ee2aff0b8561c5f4030e2cb31b3fd880447ab8f1 100644 (file)
@@ -40,14 +40,16 @@ export const vShow: ObjectDirective<VShowElement> = {
   }
 }
 
-if (__NODE_JS__) {
+function setDisplay(el: VShowElement, value: unknown): void {
+  el.style.display = value ? el._vod : 'none'
+}
+
+// SSR vnode transforms, only used when user includes client-oriented render
+// function in SSR
+export function initVShowForSSR() {
   vShow.getSSRProps = ({ value }) => {
     if (!value) {
       return { style: { display: 'none' } }
     }
   }
 }
-
-function setDisplay(el: VShowElement, value: unknown): void {
-  el.style.display = value ? el._vod : 'none'
-}
index ed35e1293f8fe0faf38303d0813167f5e2583b3d..8ed984d2b3167e8ff9e0a109e8af59fbc81a6adf 100644 (file)
@@ -15,7 +15,14 @@ import {
 import { nodeOps } from './nodeOps'
 import { patchProp } from './patchProp'
 // Importing from the compiler, will be tree-shaken in prod
-import { isFunction, isString, isHTMLTag, isSVGTag, extend } from '@vue/shared'
+import {
+  isFunction,
+  isString,
+  isHTMLTag,
+  isSVGTag,
+  extend,
+  NOOP
+} from '@vue/shared'
 
 declare module '@vue/reactivity' {
   export interface RefUnwrapBailTypes {
@@ -225,6 +232,24 @@ export {
 export { withModifiers, withKeys } from './directives/vOn'
 export { vShow } from './directives/vShow'
 
+import { initVModelForSSR } from './directives/vModel'
+import { initVShowForSSR } from './directives/vShow'
+
+let ssrDirectiveInitialized = false
+
+/**
+ * @internal
+ */
+export const initDirectivesForSSR = __SSR__
+  ? () => {
+      if (!ssrDirectiveInitialized) {
+        ssrDirectiveInitialized = true
+        initVModelForSSR()
+        initVShowForSSR()
+      }
+    }
+  : NOOP
+
 // re-export everything from core
 // h, Component, reactivity API, nextTick, flags & types
 export * from '@vue/runtime-core'
index 352c263fffd534c8fcb18e588b21fd235b0b0642..a029305af4c3f9c1ffc57f218928e13cd0f3561c 100644 (file)
@@ -1,3 +1,6 @@
+import { initDirectivesForSSR } from 'vue'
+initDirectivesForSSR()
+
 // public
 export { SSRContext } from './render'
 export { renderToString } from './renderToString'
index d1fc2602d255439f2fdaccef391430377aae6b1c..5f7b1d51251405440029d687aac34cc6d3fade83 100644 (file)
@@ -242,6 +242,8 @@ function createReplacePlugin(
     __ESM_BROWSER__: isBrowserESMBuild,
     // is targeting Node (SSR)?
     __NODE_JS__: isNodeBuild,
+    // need SSR-specific branches?
+    __SSR__: isNodeBuild || isBundlerESMBuild,
 
     // for compiler-sfc browser build inlined deps
     ...(isBrowserESMBuild