Skip to content

Commit e67e643

Browse files
committed
refactor: merge createTextNode & setText
1 parent b9b3e02 commit e67e643

File tree

8 files changed

+41
-36
lines changed

8 files changed

+41
-36
lines changed

packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap

+7-11
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export function render(_ctx) {
120120
`;
121121
122122
exports[`compile > directives > v-pre > should not affect siblings after it 1`] = `
123-
"import { resolveComponent as _resolveComponent, createComponent as _createComponent, createTextNode as _createTextNode, insert as _insert, renderEffect as _renderEffect, setText as _setText, setDynamicProp as _setDynamicProp, template as _template } from 'vue/vapor';
123+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent, createTextNode as _createTextNode, insert as _insert, renderEffect as _renderEffect, setDynamicProp as _setDynamicProp, template as _template } from 'vue/vapor';
124124
const t0 = _template("<div :id=\\"foo\\"><Comp></Comp>{{ bar }}</div>")
125125
const t1 = _template("<div></div>")
126126
@@ -129,20 +129,18 @@ export function render(_ctx) {
129129
const n0 = t0()
130130
const n3 = t1()
131131
const n1 = _createComponent(_component_Comp)
132-
const n2 = _createTextNode()
132+
const n2 = _createTextNode(() => [_ctx.bar])
133133
_insert([n1, n2], n3)
134-
_renderEffect(() => _setText(n2, _ctx.bar))
135134
_renderEffect(() => _setDynamicProp(n3, "id", _ctx.foo))
136135
return [n0, n3]
137136
}"
138137
`;
139138
140139
exports[`compile > dynamic root 1`] = `
141-
"import { createTextNode as _createTextNode, setText as _setText } from 'vue/vapor';
140+
"import { createTextNode as _createTextNode } from 'vue/vapor';
142141
143142
export function render(_ctx) {
144-
const n0 = _createTextNode()
145-
_setText(n0, 1, 2)
143+
const n0 = _createTextNode([1, 2])
146144
return n0
147145
}"
148146
`;
@@ -163,8 +161,7 @@ export function render(_ctx) {
163161
164162
exports[`compile > expression parsing > interpolation 1`] = `
165163
"(() => {
166-
const n0 = _createTextNode()
167-
_renderEffect(() => _setText(n0, a + b.value))
164+
const n0 = _createTextNode(() => [a + b.value])
168165
return n0
169166
})()"
170167
`;
@@ -192,11 +189,10 @@ export function render(_ctx) {
192189
`;
193190
194191
exports[`compile > static + dynamic root 1`] = `
195-
"import { createTextNode as _createTextNode, setText as _setText } from 'vue/vapor';
192+
"import { createTextNode as _createTextNode } from 'vue/vapor';
196193
197194
export function render(_ctx) {
198-
const n0 = _createTextNode()
199-
_setText(n0, 1, 2, "3", 4, 5, "6", 7, 8, "9", 'A', 'B')
195+
const n0 = _createTextNode([1, 2, "3", 4, 5, "6", 7, 8, "9", 'A', 'B'])
200196
return n0
201197
}"
202198
`;

packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ export function render(_ctx) {
1010
const n3 = _next(n0, 2)
1111
const n2 = n3.nextSibling
1212
_setText(n0, 'first')
13-
const n1 = _createTextNode()
14-
_setText(n1, 'second', " ", 'third', " ")
13+
const n1 = _createTextNode(['second', " ", 'third', " "])
1514
_setText(n2, 'forth')
1615
_insert(n1, n4, n3)
1716
return n4

packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ export function render(_ctx) {
1212
`;
1313

1414
exports[`compiler: v-once > basic 1`] = `
15-
"import { createTextNode as _createTextNode, setText as _setText, setClass as _setClass, prepend as _prepend, template as _template } from 'vue/vapor';
15+
"import { createTextNode as _createTextNode, setClass as _setClass, prepend as _prepend, template as _template } from 'vue/vapor';
1616
const t0 = _template("<div><span></span></div>")
1717
1818
export function render(_ctx) {
1919
const n2 = t0()
2020
const n1 = n2.firstChild
21-
const n0 = _createTextNode()
22-
_setText(n0, _ctx.msg, " ")
21+
const n0 = _createTextNode([_ctx.msg, " "])
2322
_setClass(n1, _ctx.clz)
2423
_prepend(n2, n0)
2524
return n2

packages/compiler-vapor/__tests__/transforms/vOnce.spec.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ describe('compiler: v-once', () => {
3131
{
3232
type: IRNodeTypes.CREATE_TEXT_NODE,
3333
id: 0,
34-
},
35-
{
36-
element: 0,
37-
type: IRNodeTypes.SET_TEXT,
3834
values: [
3935
{
4036
type: NodeTypes.SIMPLE_EXPRESSION,
@@ -47,6 +43,7 @@ describe('compiler: v-once', () => {
4743
isStatic: true,
4844
},
4945
],
46+
effect: false,
5047
},
5148
{
5249
element: 1,
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import type { CodegenContext } from '../generate'
22
import type { CreateTextNodeIRNode, SetTextIRNode } from '../ir'
33
import { genExpression } from './expression'
4-
import { type CodeFragment, NEWLINE, genCall } from './utils'
4+
import { type CodeFragment, NEWLINE, genCall, genMulti } from './utils'
55

66
export function genSetText(
77
oper: SetTextIRNode,
88
context: CodegenContext,
99
): CodeFragment[] {
1010
const { vaporHelper } = context
11-
const { values } = oper
11+
const { element, values } = oper
1212
return [
1313
NEWLINE,
1414
...genCall(
1515
vaporHelper('setText'),
16-
`n${oper.element}`,
16+
`n${element}`,
1717
...values.map(value => genExpression(value, context)),
1818
),
1919
]
@@ -24,9 +24,16 @@ export function genCreateTextNode(
2424
context: CodegenContext,
2525
): CodeFragment[] {
2626
const { vaporHelper } = context
27+
const { id, values, effect } = oper
2728
return [
2829
NEWLINE,
29-
`const n${oper.id} = `,
30-
...genCall(vaporHelper('createTextNode')),
30+
`const n${id} = `,
31+
...genCall(vaporHelper('createTextNode'), [
32+
effect && '() => ',
33+
...genMulti(
34+
['[', ']', ', '],
35+
...values.map(value => genExpression(value, context)),
36+
),
37+
]),
3138
]
3239
}

packages/compiler-vapor/src/ir.ts

+2
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ export interface SetModelValueIRNode extends BaseIRNode {
159159
export interface CreateTextNodeIRNode extends BaseIRNode {
160160
type: IRNodeTypes.CREATE_TEXT_NODE
161161
id: number
162+
values: SimpleExpressionNode[]
163+
effect: boolean
162164
}
163165

164166
export interface InsertNodeIRNode extends BaseIRNode {

packages/compiler-vapor/src/transforms/transformText.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from '@vue/compiler-dom'
1212
import type { NodeTransform, TransformContext } from '../transform'
1313
import { DynamicFlag, IRNodeTypes } from '../ir'
14+
import { isConstantExpression } from '../utils'
1415

1516
type TextLike = TextNode | InterpolationNode
1617
const seen = new WeakMap<
@@ -50,17 +51,13 @@ function processTextLike(context: TransformContext<InterpolationNode>) {
5051
const values = nodes.map(node => createTextLikeExpression(node, context))
5152

5253
context.dynamic.flags |= DynamicFlag.INSERT | DynamicFlag.NON_TEMPLATE
54+
5355
context.registerOperation({
5456
type: IRNodeTypes.CREATE_TEXT_NODE,
5557
id,
58+
values,
59+
effect: !values.some(isConstantExpression),
5660
})
57-
context.registerEffect(values, [
58-
{
59-
type: IRNodeTypes.SET_TEXT,
60-
element: id,
61-
values,
62-
},
63-
])
6461
}
6562

6663
function processTextLikeContainer(

packages/runtime-vapor/src/dom/element.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { isArray, toDisplayString } from '@vue/shared'
1+
import { isArray } from '@vue/shared'
22
import type { Block } from '../apiRender'
33
import { componentKey } from '../component'
4+
import { renderEffect } from '../renderEffect'
5+
import { setText } from './prop'
46

57
/*! #__NO_SIDE_EFFECTS__ */
68
export function normalizeBlock(block: Block): Node[] {
@@ -34,10 +36,16 @@ export function remove(block: Block, parent: ParentNode) {
3436
normalizeBlock(block).forEach(node => parent.removeChild(node))
3537
}
3638

37-
/*! #__NO_SIDE_EFFECTS__ */
38-
export function createTextNode(val?: unknown): Text {
39+
export function createTextNode(values?: any[] | (() => any[])): Text {
3940
// eslint-disable-next-line no-restricted-globals
40-
return document.createTextNode(val === undefined ? '' : toDisplayString(val))
41+
const node = document.createTextNode('')
42+
if (values)
43+
if (isArray(values)) {
44+
setText(node, ...values)
45+
} else {
46+
renderEffect(() => setText(node, ...values()))
47+
}
48+
return node
4149
}
4250

4351
/*! #__NO_SIDE_EFFECTS__ */

0 commit comments

Comments
 (0)