mirror of https://github.com/vuejs/core.git
feat: add ssrVText transform
This commit is contained in:
parent
31b5eeb4c2
commit
d6e734e844
|
@ -57,13 +57,25 @@ describe('ssr: components', () => {
|
||||||
`<component is="div" v-html="'<div>ssr dynamic component v-html</div>'" />`,
|
`<component is="div" v-html="'<div>ssr dynamic component v-html</div>'" />`,
|
||||||
).code,
|
).code,
|
||||||
).toMatchInlineSnapshot(`
|
).toMatchInlineSnapshot(`
|
||||||
"const { resolveDynamicComponent: _resolveDynamicComponent, mergeProps: _mergeProps, createVNode: _createVNode } = require("vue")
|
"const { resolveDynamicComponent: _resolveDynamicComponent, mergeProps: _mergeProps, createVNode: _createVNode } = require("vue")
|
||||||
const { ssrRenderVNode: _ssrRenderVNode } = require("vue/server-renderer")
|
const { ssrRenderVNode: _ssrRenderVNode } = require("vue/server-renderer")
|
||||||
|
|
||||||
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
_ssrRenderVNode(_push, _createVNode(_resolveDynamicComponent("div"), _mergeProps({ innerHTML: '<div>ssr dynamic component v-html</div>' }, _attrs), null), _parent)
|
_ssrRenderVNode(_push, _createVNode(_resolveDynamicComponent("div"), _mergeProps({ innerHTML: '<div>ssr dynamic component v-html</div>' }, _attrs), null), _parent)
|
||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
expect(
|
||||||
|
compile(`<component is="div" v-text="'ssr dynamic component v-text'" />`)
|
||||||
|
.code,
|
||||||
|
).toMatchInlineSnapshot(`
|
||||||
|
"const { resolveDynamicComponent: _resolveDynamicComponent, mergeProps: _mergeProps, createVNode: _createVNode } = require("vue")
|
||||||
|
const { ssrRenderVNode: _ssrRenderVNode } = require("vue/server-renderer")
|
||||||
|
|
||||||
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
|
_ssrRenderVNode(_push, _createVNode(_resolveDynamicComponent("div"), _mergeProps({ textContent: 'ssr dynamic component v-text' }, _attrs), null), _parent)
|
||||||
|
}"
|
||||||
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('slots', () => {
|
describe('slots', () => {
|
||||||
|
|
|
@ -28,6 +28,7 @@ import { ssrTransformShow } from './transforms/ssrVShow'
|
||||||
import { ssrInjectFallthroughAttrs } from './transforms/ssrInjectFallthroughAttrs'
|
import { ssrInjectFallthroughAttrs } from './transforms/ssrInjectFallthroughAttrs'
|
||||||
import { ssrInjectCssVars } from './transforms/ssrInjectCssVars'
|
import { ssrInjectCssVars } from './transforms/ssrInjectCssVars'
|
||||||
import { ssrTransformHtml } from './transforms/ssrVHtml'
|
import { ssrTransformHtml } from './transforms/ssrVHtml'
|
||||||
|
import { ssrTransformText } from './transforms/ssrVText'
|
||||||
|
|
||||||
export function compile(
|
export function compile(
|
||||||
source: string | RootNode,
|
source: string | RootNode,
|
||||||
|
@ -73,9 +74,10 @@ export function compile(
|
||||||
// reusing core v-bind
|
// reusing core v-bind
|
||||||
bind: transformBind,
|
bind: transformBind,
|
||||||
on: transformOn,
|
on: transformOn,
|
||||||
// model, show and html have dedicated SSR handling
|
// model, show, text and html have dedicated SSR handling
|
||||||
model: ssrTransformModel,
|
model: ssrTransformModel,
|
||||||
show: ssrTransformShow,
|
show: ssrTransformShow,
|
||||||
|
text: ssrTransformText,
|
||||||
html: ssrTransformHtml,
|
html: ssrTransformHtml,
|
||||||
// the following are ignored during SSR
|
// the following are ignored during SSR
|
||||||
// on: noopDirectiveTransform,
|
// on: noopDirectiveTransform,
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
import {
|
||||||
|
type DirectiveTransform,
|
||||||
|
ElementTypes,
|
||||||
|
TO_DISPLAY_STRING,
|
||||||
|
createCallExpression,
|
||||||
|
createObjectProperty,
|
||||||
|
createSimpleExpression,
|
||||||
|
getConstantType,
|
||||||
|
} from '@vue/compiler-core'
|
||||||
|
|
||||||
|
export const ssrTransformText: DirectiveTransform = (dir, node, context) => {
|
||||||
|
const { exp, loc } = dir
|
||||||
|
|
||||||
|
if (node.tagType !== ElementTypes.COMPONENT || node.tag !== 'component')
|
||||||
|
return { props: [] }
|
||||||
|
|
||||||
|
if (node.children.length) {
|
||||||
|
node.children.length = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: [
|
||||||
|
createObjectProperty(
|
||||||
|
createSimpleExpression(`textContent`, true),
|
||||||
|
exp
|
||||||
|
? getConstantType(exp, context) > 0
|
||||||
|
? exp
|
||||||
|
: createCallExpression(
|
||||||
|
context.helperString(TO_DISPLAY_STRING),
|
||||||
|
[exp],
|
||||||
|
loc,
|
||||||
|
)
|
||||||
|
: createSimpleExpression('', true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue