Skip to content

Commit

Permalink
refactor(compiler-ssr): extract portal processing + emit errors
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Feb 26, 2020
1 parent d8ed0e7 commit d52ffaa
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 29 deletions.
5 changes: 5 additions & 0 deletions packages/compiler-ssr/src/ssrCodegenTransform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ function createSSRTransformContext(
body,
helpers,
withSlotScopeId,
onError:
options.onError ||
(e => {
throw e
}),
helper<T extends symbol>(name: T): T {
helpers.add(name)
return name
Expand Down
72 changes: 43 additions & 29 deletions packages/compiler-ssr/src/transforms/ssrTransformComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
processChildrenAsStatement
} from '../ssrCodegenTransform'
import { isSymbol, isObject, isArray } from '@vue/shared'
import { createSSRCompilerError, SSRErrorCodes } from '../errors'

// We need to construct the slot functions in the 1st pass to ensure proper
// scope tracking, but the children of each slot cannot be processed until
Expand Down Expand Up @@ -136,35 +137,7 @@ export function ssrProcessComponent(
const component = componentTypeMap.get(node)!

if (component === PORTAL) {
const targetProp = findProp(node, 'target')
if (!targetProp) return

let target: JSChildNode
if (targetProp.type === NodeTypes.ATTRIBUTE && targetProp.value) {
target = createSimpleExpression(targetProp.value.content, true)
} else if (targetProp.type === NodeTypes.DIRECTIVE && targetProp.exp) {
target = targetProp.exp
} else {
return
}

const contentRenderFn = createFunctionExpression(
[`_push`],
undefined, // Body is added later
true, // newline
false, // isSlot
node.loc
)
contentRenderFn.body = processChildrenAsStatement(node.children, context)
context.pushStatement(
createCallExpression(context.helper(SSR_RENDER_PORTAL), [
contentRenderFn,
target,
`_parent`
])
)

return
return ssrProcessPortal(node, context)
}

const needFragmentWrapper =
Expand Down Expand Up @@ -194,6 +167,47 @@ export function ssrProcessComponent(
}
}

function ssrProcessPortal(node: ComponentNode, context: SSRTransformContext) {
const targetProp = findProp(node, 'target')
if (!targetProp) {
context.onError(
createSSRCompilerError(SSRErrorCodes.X_SSR_NO_PORTAL_TARGET, node.loc)
)
return
}

let target: JSChildNode
if (targetProp.type === NodeTypes.ATTRIBUTE && targetProp.value) {
target = createSimpleExpression(targetProp.value.content, true)
} else if (targetProp.type === NodeTypes.DIRECTIVE && targetProp.exp) {
target = targetProp.exp
} else {
context.onError(
createSSRCompilerError(
SSRErrorCodes.X_SSR_NO_PORTAL_TARGET,
targetProp.loc
)
)
return
}

const contentRenderFn = createFunctionExpression(
[`_push`],
undefined, // Body is added later
true, // newline
false, // isSlot
node.loc
)
contentRenderFn.body = processChildrenAsStatement(node.children, context)
context.pushStatement(
createCallExpression(context.helper(SSR_RENDER_PORTAL), [
contentRenderFn,
target,
`_parent`
])
)
}

export const rawOptionsMap = new WeakMap<RootNode, CompilerOptions>()

const [baseNodeTransforms, baseDirectiveTransforms] = getBaseTransformPreset(
Expand Down

0 comments on commit d52ffaa

Please sign in to comment.