Skip to content

Commit 40ba464

Browse files
committed
feat: v-let ssr
1 parent 69d2638 commit 40ba464

File tree

4 files changed

+64
-6
lines changed

4 files changed

+64
-6
lines changed

packages/compiler-core/src/codegen.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,13 +781,14 @@ function genNullableArgs(args: any[]): CallExpression['arguments'] {
781781
// JavaScript
782782
function genCallExpression(node: CallExpression, context: CodegenContext) {
783783
const { push, helper, pure } = context
784-
let callee
784+
let callee
785785
if (isString(node.callee)) {
786-
callee = node.callee
786+
callee = node.callee
787787
} else if (isSymbol(node.callee)) {
788788
callee = helper(node.callee)
789789
} else {
790790
// anonymous function.
791+
if (context.inSSR) push(';')
791792
push(`(`)
792793
genNode(node.callee, context)
793794
push(`)`)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { compile } from '../src'
2+
3+
describe('ssr: v-let', () => {
4+
test('basic', () => {
5+
expect(compile(`<div v-let="a=1">{{a}}</div>`).code).toMatchInlineSnapshot(`
6+
"const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
7+
8+
return function ssrRender(_ctx, _push, _parent, _attrs) {
9+
_push(\`<div\${_ssrRenderAttrs(_attrs)}>\`)
10+
;((a=1) => {
11+
_push(\`\${_ssrInterpolate(a)}\`)
12+
})()
13+
_push(\`</div>\`)
14+
}"
15+
`)
16+
})
17+
18+
test('nested', () => {
19+
expect(
20+
compile(
21+
`<div v-let="a=1">
22+
<div v-let="b=2">{{a}} {{b}}</div>
23+
</div>`
24+
).code
25+
).toMatchInlineSnapshot(`
26+
"const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
27+
28+
return function ssrRender(_ctx, _push, _parent, _attrs) {
29+
_push(\`<div\${_ssrRenderAttrs(_attrs)}>\`)
30+
;((a=1) => {
31+
_push(\`<div>\`)
32+
;((b=2) => {
33+
_push(\`\${_ssrInterpolate(a)} \${_ssrInterpolate(b)}\`)
34+
})()
35+
_push(\`</div>\`)
36+
})()
37+
_push(\`</div>\`)
38+
}"
39+
`)
40+
})
41+
})

packages/compiler-ssr/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import {
1111
noopDirectiveTransform,
1212
transformBind,
1313
transformStyle,
14-
transformOn
14+
transformOn,
15+
trackVLetScopes
1516
} from '@vue/compiler-dom'
1617
import { ssrCodegenTransform } from './ssrCodegenTransform'
1718
import { ssrTransformElement } from './transforms/ssrTransformElement'
@@ -65,6 +66,7 @@ export function compile(
6566
ssrTransformElement,
6667
ssrTransformComponent,
6768
trackSlotScopes,
69+
trackVLetScopes,
6870
transformStyle,
6971
...(options.nodeTransforms || []) // user transforms
7072
],

packages/compiler-ssr/src/transforms/ssrTransformElement.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import {
2929
AttributeNode,
3030
buildDirectiveArgs,
3131
TransformContext,
32-
PropsExpression
32+
PropsExpression,
33+
findDir,
34+
createFunctionExpression
3335
} from '@vue/compiler-dom'
3436
import {
3537
escapeHtml,
@@ -51,7 +53,11 @@ import {
5153
SSR_INCLUDE_BOOLEAN_ATTR,
5254
SSR_GET_DIRECTIVE_PROPS
5355
} from '../runtimeHelpers'
54-
import { SSRTransformContext, processChildren } from '../ssrCodegenTransform'
56+
import {
57+
SSRTransformContext,
58+
processChildren,
59+
processChildrenAsStatement
60+
} from '../ssrCodegenTransform'
5561

5662
// for directives with children overwrite (e.g. v-html & v-text), we need to
5763
// store the raw children so that they can be added in the 2nd pass.
@@ -428,7 +434,15 @@ export function ssrProcessElement(
428434
if (rawChildren) {
429435
context.pushStringPart(rawChildren)
430436
} else if (node.children.length) {
431-
processChildren(node, context)
437+
// process v-let
438+
const dir = findDir(node, 'let')
439+
if (dir) {
440+
const letFn = createFunctionExpression(dir.exp!)
441+
letFn.body = processChildrenAsStatement(node, context)
442+
context.pushStatement(createCallExpression(letFn))
443+
} else {
444+
processChildren(node, context)
445+
}
432446
}
433447

434448
if (!isVoidTag(node.tag)) {

0 commit comments

Comments
 (0)