Skip to content

Commit 298da65

Browse files
authored
chore: more signal fine-tuning (#9531)
* chore: opt for two signal data-structures to reduce memory usage
1 parent bbd1a6c commit 298da65

File tree

7 files changed

+236
-190
lines changed

7 files changed

+236
-190
lines changed

.changeset/hungry-dots-fry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
chore: more signal perf tuning

packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ export const global_visitors = {
1414
},
1515
MemberExpression(node, { state, next }) {
1616
if (node.object.type === 'ThisExpression') {
17-
// rewrite `this.#foo` as `this.#foo.value` inside a constructor
17+
// rewrite `this.#foo` as `this.#foo.v` inside a constructor
1818
if (node.property.type === 'PrivateIdentifier') {
1919
const field = state.private_state.get(node.property.name);
2020

2121
if (field) {
22-
return state.in_constructor ? b.member(node, b.id('value')) : b.call('$.get', node);
22+
return state.in_constructor ? b.member(node, b.id('v')) : b.call('$.get', node);
2323
}
2424
}
2525

26-
// rewrite `this.foo` as `this.#foo.value` inside a constructor
26+
// rewrite `this.foo` as `this.#foo.v` inside a constructor
2727
if (node.property.type === 'Identifier' && !node.computed) {
2828
const field = state.public_state.get(node.property.name);
2929

3030
if (field && state.in_constructor) {
31-
return b.member(b.member(b.this, field.id), b.id('value'));
31+
return b.member(b.member(b.this, field.id), b.id('v'));
3232
}
3333
}
3434
}

packages/svelte/src/internal/client/render.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
EACH_IS_CONTROLLED,
2727
EACH_INDEX_REACTIVE,
2828
EACH_ITEM_REACTIVE,
29-
EACH_IS_ANIMATED,
3029
PassiveDelegatedEvents,
3130
DelegatedEvents
3231
} from '../../constants.js';
@@ -624,7 +623,7 @@ export function bind_playback_rate(media, get_value, update) {
624623
// Needs to happen after the element is inserted into the dom, else playback will be set back to 1 by the browser.
625624
// For hydration we could do it immediately but the additional code is not worth the lost microtask.
626625

627-
/** @type {import('./types.js').Signal | undefined} */
626+
/** @type {import('./types.js').ComputationSignal | undefined} */
628627
let render;
629628
let destroyed = false;
630629
const effect = managed_effect(() => {
@@ -2083,7 +2082,7 @@ export function update_each_item_block(block, item, index, type) {
20832082
if (transitions !== null && (type & EACH_KEYED) !== 0) {
20842083
let prev_index = block.index;
20852084
if (index_is_reactive) {
2086-
prev_index = /** @type {import('./types.js').Signal<number>} */ (prev_index).value;
2085+
prev_index = /** @type {import('./types.js').Signal<number>} */ (prev_index).v;
20872086
}
20882087
const items = block.parent.items;
20892088
if (prev_index !== index && /** @type {number} */ (index) < items.length) {
@@ -2125,7 +2124,7 @@ export function destroy_each_item_block(
21252124
if (!controlled && dom !== null) {
21262125
remove(dom);
21272126
}
2128-
destroy_signal(/** @type {import('./types.js').Signal} */ (block.effect));
2127+
destroy_signal(/** @type {import('./types.js').EffectSignal} */ (block.effect));
21292128
}
21302129
}
21312130

@@ -2244,11 +2243,7 @@ function each(anchor_node, collection, flags, key_fn, render_fn, fallback_fn, re
22442243
? []
22452244
: Array.from(maybe_array);
22462245
if (key_fn !== null) {
2247-
const length = array.length;
2248-
keys = Array(length);
2249-
for (let i = 0; i < length; i++) {
2250-
keys[i] = key_fn(array[i]);
2251-
}
2246+
keys = array.map(key_fn);
22522247
}
22532248
if (fallback_fn !== null) {
22542249
if (array.length === 0) {
@@ -3163,7 +3158,7 @@ export function mount(component, options) {
31633158
if (hydration_fragment !== null) {
31643159
remove(hydration_fragment);
31653160
}
3166-
destroy_signal(/** @type {import('./types.js').Signal} */ (block.effect));
3161+
destroy_signal(/** @type {import('./types.js').EffectSignal} */ (block.effect));
31673162
}
31683163
];
31693164
}

0 commit comments

Comments
 (0)