Skip to content

Commit 5d1c6ca

Browse files
committed
perf(vapor): optimize text bindings and v-text
1 parent a2fa0db commit 5d1c6ca

36 files changed

+392
-253
lines changed

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

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`compile > bindings 1`] = `
4-
"import { setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
5-
const t0 = _template("<div></div>", true)
4+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
5+
const t0 = _template("<div> </div>", true)
66
77
export function render(_ctx, $props, $emit, $attrs, $slots) {
88
const n0 = t0()
9-
_renderEffect(() => _setText(n0, "count is ", _ctx.count, "."))
9+
const x0 = _child(n0)
10+
_renderEffect(() => _setText(x0, "count is " + _toDisplayString(_ctx.count) + "."))
1011
return n0
1112
}"
1213
`;
@@ -148,7 +149,7 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
148149
`;
149150
150151
exports[`compile > directives > v-pre > should not affect siblings after it 1`] = `
151-
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, createTextNode as _createTextNode, insert as _insert, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
152+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, createTextNode as _createTextNode, insert as _insert, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
152153
const t0 = _template("<div :id=\\"foo\\"><Comp></Comp>{{ bar }}</div>")
153154
const t1 = _template("<div></div>")
154155
@@ -157,33 +158,37 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
157158
const n0 = t0()
158159
const n3 = t1()
159160
const n1 = _createComponentWithFallback(_component_Comp)
160-
const n2 = _createTextNode(() => [_ctx.bar])
161+
const n2 = _createTextNode()
161162
_insert([n1, n2], n3)
162-
_renderEffect(() => _setProp(n3, "id", _ctx.foo))
163+
_renderEffect(() => {
164+
_setText(n2, _toDisplayString(_ctx.bar))
165+
_setProp(n3, "id", _ctx.foo)
166+
})
163167
return [n0, n3]
164168
}"
165169
`;
166170
167171
exports[`compile > dynamic root 1`] = `
168-
"import { createTextNode as _createTextNode } from 'vue';
172+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString } from 'vue';
169173
170174
export function render(_ctx) {
171-
const n0 = _createTextNode(() => [1, 2])
175+
const n0 = _createTextNode(_toDisplayString(1) + _toDisplayString(2))
172176
return n0
173177
}"
174178
`;
175179
176180
exports[`compile > dynamic root nodes and interpolation 1`] = `
177-
"import { setText as _setText, setProp as _setProp, renderEffect as _renderEffect, delegateEvents as _delegateEvents, template as _template } from 'vue';
178-
const t0 = _template("<button></button>", true)
181+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, delegateEvents as _delegateEvents, template as _template } from 'vue';
182+
const t0 = _template("<button> </button>", true)
179183
_delegateEvents("click")
180184
181185
export function render(_ctx) {
182186
const n0 = t0()
187+
const x0 = _child(n0)
183188
n0.$evtclick = e => _ctx.handleClick(e)
184189
_renderEffect(() => {
185190
const _count = _ctx.count
186-
_setText(n0, _count, "foo", _count, "foo", _count)
191+
_setText(x0, _toDisplayString(_count) + "foo" + _toDisplayString(_count) + "foo" + _toDisplayString(_count))
187192
_setProp(n0, "id", _count)
188193
})
189194
return n0
@@ -192,7 +197,8 @@ export function render(_ctx) {
192197
193198
exports[`compile > expression parsing > interpolation 1`] = `
194199
"
195-
const n0 = _createTextNode(() => [a + b.value])
200+
const n0 = _createTextNode()
201+
_renderEffect(() => _setText(n0, _toDisplayString(a + b.value)))
196202
return n0
197203
"
198204
`;
@@ -223,10 +229,10 @@ export function render(_ctx) {
223229
`;
224230
225231
exports[`compile > static + dynamic root 1`] = `
226-
"import { createTextNode as _createTextNode } from 'vue';
232+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString } from 'vue';
227233
228234
export function render(_ctx) {
229-
const n0 = _createTextNode(() => [1, 2, "3", 4, 5, "6", 7, 8, "9", 'A', 'B'])
235+
const n0 = _createTextNode(_toDisplayString(1) + _toDisplayString(2) + "3" + _toDisplayString(4) + _toDisplayString(5) + "6" + _toDisplayString(7) + _toDisplayString(8) + "9" + 'A' + 'B')
230236
return n0
231237
}"
232238
`;
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`compiler: expression > basic 1`] = `
4-
"import { createTextNode as _createTextNode } from 'vue';
4+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect } from 'vue';
55
66
export function render(_ctx) {
7-
const n0 = _createTextNode(() => [_ctx.a])
7+
const n0 = _createTextNode()
8+
_renderEffect(() => _setText(n0, _toDisplayString(_ctx.a)))
89
return n0
910
}"
1011
`;
1112

1213
exports[`compiler: expression > props 1`] = `
13-
"import { createTextNode as _createTextNode } from 'vue';
14+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect } from 'vue';
1415
1516
export function render(_ctx, $props, $emit, $attrs, $slots) {
16-
const n0 = _createTextNode(() => [$props.foo])
17+
const n0 = _createTextNode()
18+
_renderEffect(() => _setText(n0, _toDisplayString($props.foo)))
1719
return n0
1820
}"
1921
`;
2022

2123
exports[`compiler: expression > props aliased 1`] = `
22-
"import { createTextNode as _createTextNode } from 'vue';
24+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect } from 'vue';
2325
2426
export function render(_ctx, $props, $emit, $attrs, $slots) {
25-
const n0 = _createTextNode(() => [$props['bar']])
27+
const n0 = _createTextNode()
28+
_renderEffect(() => _setText(n0, _toDisplayString($props['bar'])))
2629
return n0
2730
}"
2831
`;

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

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,48 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`compiler: children transform > children & sibling references 1`] = `
4-
"import { child as _child, nextn as _nextn, next as _next, createTextNode as _createTextNode, insert as _insert, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
5-
const t0 = _template("<div><p></p> <!><p></p></div>", true)
4+
"import { child as _child, nextn as _nextn, next as _next, createTextNode as _createTextNode, insert as _insert, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
5+
const t0 = _template("<div><p> </p> <!><p> </p></div>", true)
66
77
export function render(_ctx) {
88
const n4 = t0()
99
const n0 = _child(n4)
1010
const n3 = _nextn(n0, 2)
1111
const n2 = _next(n3)
12-
const n1 = _createTextNode(() => [_ctx.second, " ", _ctx.third, " "])
12+
const x0 = _child(n0)
13+
const n1 = _createTextNode()
14+
const x2 = _child(n2)
1315
_insert(n1, n4, n3)
1416
_renderEffect(() => {
15-
_setText(n0, _ctx.first)
16-
_setText(n2, _ctx.forth)
17+
_setText(x0, _toDisplayString(_ctx.first))
18+
_setText(n1, _toDisplayString(_ctx.second) + " " + _toDisplayString(_ctx.third) + " ")
19+
_setText(x2, _toDisplayString(_ctx.forth))
1720
})
1821
return n4
1922
}"
2023
`;
2124

2225
exports[`compiler: children transform > efficient traversal 1`] = `
23-
"import { child as _child, next as _next, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
24-
const t0 = _template("<div><div>x</div><div><span></span></div><div><span></span></div><div><span></span></div></div>", true)
26+
"import { child as _child, next as _next, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
27+
const t0 = _template("<div><div>x</div><div><span> </span></div><div><span> </span></div><div><span> </span></div></div>", true)
2528
2629
export function render(_ctx) {
2730
const n3 = t0()
28-
const _n0 = _next(_child(n3))
29-
const n0 = _child(_n0)
30-
const _n1 = _next(_n0)
31-
const n1 = _child(_n1)
32-
const _n2 = _next(_n1)
33-
const n2 = _child(_n2)
31+
const p0 = _next(_child(n3))
32+
const n0 = _child(p0)
33+
const p1 = _next(p0)
34+
const n1 = _child(p1)
35+
const p2 = _next(p1)
36+
const n2 = _child(p2)
37+
const x0 = _child(n0)
38+
const x1 = _child(n1)
39+
const x2 = _child(n2)
3440
_renderEffect(() => {
3541
const _msg = _ctx.msg
3642
37-
_setText(n0, _msg)
38-
_setText(n1, _msg)
39-
_setText(n2, _msg)
43+
_setText(x0, _toDisplayString(_msg))
44+
_setText(x1, _toDisplayString(_msg))
45+
_setText(x2, _toDisplayString(_msg))
4046
})
4147
return n3
4248
}"
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`compiler: text transform > consecutive text 1`] = `
4-
"import { createTextNode as _createTextNode } from 'vue';
4+
"import { createTextNode as _createTextNode, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect } from 'vue';
55
66
export function render(_ctx) {
7-
const n0 = _createTextNode(() => [_ctx.msg])
7+
const n0 = _createTextNode()
8+
_renderEffect(() => _setText(n0, _toDisplayString(_ctx.msg)))
89
return n0
910
}"
1011
`;
@@ -13,7 +14,7 @@ exports[`compiler: text transform > no consecutive text 1`] = `
1314
"import { createTextNode as _createTextNode } from 'vue';
1415
1516
export function render(_ctx) {
16-
const n0 = _createTextNode(["hello world"])
17+
const n0 = _createTextNode("hello world")
1718
return n0
1819
}"
1920
`;

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

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,46 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`compiler: v-for > array de-structured value (with rest) 1`] = `
4-
"import { setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
5-
const t0 = _template("<div></div>", true)
4+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
5+
const t0 = _template("<div> </div>", true)
66
77
export function render(_ctx) {
88
const n0 = _createFor(() => (_ctx.list), (_for_item0, _for_key0) => {
99
const n2 = t0()
10-
_renderEffect(() => _setText(n2, _for_item0.value[0] + _for_item0.value.slice(1) + _for_key0.value))
10+
const x2 = _child(n2)
11+
_renderEffect(() => _setText(x2, _toDisplayString(_for_item0.value[0] + _for_item0.value.slice(1) + _for_key0.value)))
1112
return n2
1213
}, ([id, ...other], index) => (id))
1314
return n0
1415
}"
1516
`;
1617

1718
exports[`compiler: v-for > array de-structured value 1`] = `
18-
"import { setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
19-
const t0 = _template("<div></div>", true)
19+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
20+
const t0 = _template("<div> </div>", true)
2021
2122
export function render(_ctx) {
2223
const n0 = _createFor(() => (_ctx.list), (_for_item0, _for_key0) => {
2324
const n2 = t0()
24-
_renderEffect(() => _setText(n2, _for_item0.value[0] + _for_item0.value[1] + _for_key0.value))
25+
const x2 = _child(n2)
26+
_renderEffect(() => _setText(x2, _toDisplayString(_for_item0.value[0] + _for_item0.value[1] + _for_key0.value)))
2527
return n2
2628
}, ([id, other], index) => (id))
2729
return n0
2830
}"
2931
`;
3032

3133
exports[`compiler: v-for > basic v-for 1`] = `
32-
"import { setText as _setText, renderEffect as _renderEffect, createFor as _createFor, delegateEvents as _delegateEvents, template as _template } from 'vue';
33-
const t0 = _template("<div></div>", true)
34+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, delegateEvents as _delegateEvents, template as _template } from 'vue';
35+
const t0 = _template("<div> </div>", true)
3436
_delegateEvents("click")
3537
3638
export function render(_ctx) {
3739
const n0 = _createFor(() => (_ctx.items), (_for_item0) => {
3840
const n2 = t0()
41+
const x2 = _child(n2)
3942
n2.$evtclick = () => (_ctx.remove(_for_item0.value))
40-
_renderEffect(() => _setText(n2, _for_item0.value))
43+
_renderEffect(() => _setText(x2, _toDisplayString(_for_item0.value)))
4144
return n2
4245
}, (item) => (item.id))
4346
return n0
@@ -62,16 +65,17 @@ export function render(_ctx) {
6265
`;
6366

6467
exports[`compiler: v-for > nested v-for 1`] = `
65-
"import { setText as _setText, renderEffect as _renderEffect, createFor as _createFor, insert as _insert, template as _template } from 'vue';
66-
const t0 = _template("<span></span>")
68+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, insert as _insert, template as _template } from 'vue';
69+
const t0 = _template("<span> </span>")
6770
const t1 = _template("<div></div>", true)
6871
6972
export function render(_ctx) {
7073
const n0 = _createFor(() => (_ctx.list), (_for_item0) => {
7174
const n5 = t1()
7275
const n2 = _createFor(() => (_for_item0.value), (_for_item1) => {
7376
const n4 = t0()
74-
_renderEffect(() => _setText(n4, _for_item1.value+_for_item0.value))
77+
const x4 = _child(n4)
78+
_renderEffect(() => _setText(x4, _toDisplayString(_for_item1.value+_for_item0.value)))
7579
return n4
7680
}, null, null, null, true)
7781
_insert(n2, n5)
@@ -82,41 +86,44 @@ export function render(_ctx) {
8286
`;
8387

8488
exports[`compiler: v-for > object de-structured value (with rest) 1`] = `
85-
"import { getRestElement as _getRestElement, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
86-
const t0 = _template("<div></div>", true)
89+
"import { getRestElement as _getRestElement, child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
90+
const t0 = _template("<div> </div>", true)
8791
8892
export function render(_ctx) {
8993
const n0 = _createFor(() => (_ctx.list), (_for_item0, _for_key0) => {
9094
const n2 = t0()
91-
_renderEffect(() => _setText(n2, _for_item0.value.id + _getRestElement(_for_item0.value, ["id"]) + _for_key0.value))
95+
const x2 = _child(n2)
96+
_renderEffect(() => _setText(x2, _toDisplayString(_for_item0.value.id + _getRestElement(_for_item0.value, ["id"]) + _for_key0.value)))
9297
return n2
9398
}, ({ id, ...other }, index) => (id))
9499
return n0
95100
}"
96101
`;
97102

98103
exports[`compiler: v-for > object de-structured value 1`] = `
99-
"import { setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
100-
const t0 = _template("<span></span>", true)
104+
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
105+
const t0 = _template("<span> </span>", true)
101106
102107
export function render(_ctx) {
103108
const n0 = _createFor(() => (_ctx.items), (_for_item0) => {
104109
const n2 = t0()
105-
_renderEffect(() => _setText(n2, _for_item0.value.id, _for_item0.value.value))
110+
const x2 = _child(n2)
111+
_renderEffect(() => _setText(x2, _toDisplayString(_for_item0.value.id) + _toDisplayString(_for_item0.value.value)))
106112
return n2
107113
}, ({ id, value }) => (id))
108114
return n0
109115
}"
110116
`;
111117

112118
exports[`compiler: v-for > v-for aliases w/ complex expressions 1`] = `
113-
"import { getDefaultValue as _getDefaultValue, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
114-
const t0 = _template("<div></div>", true)
119+
"import { getDefaultValue as _getDefaultValue, child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
120+
const t0 = _template("<div> </div>", true)
115121
116122
export function render(_ctx) {
117123
const n0 = _createFor(() => (_ctx.list), (_for_item0) => {
118124
const n2 = t0()
119-
_renderEffect(() => _setText(n2, _getDefaultValue(_for_item0.value.foo, _ctx.bar) + _ctx.bar + _ctx.baz + _getDefaultValue(_for_item0.value.baz[0], _ctx.quux) + _ctx.quux))
125+
const x2 = _child(n2)
126+
_renderEffect(() => _setText(x2, _toDisplayString(_getDefaultValue(_for_item0.value.foo, _ctx.bar) + _ctx.bar + _ctx.baz + _getDefaultValue(_for_item0.value.baz[0], _ctx.quux) + _ctx.quux)))
120127
return n2
121128
})
122129
return n0

0 commit comments

Comments
 (0)