Skip to content

Commit f1aeaf1

Browse files
authored
feat: adds legacy mode flag (#14180)
* feat: adds legacy mode flag * feedback * feedback and tweaks * feedback and tweaks * tweaks * tweaks * tweaks * tweaks
1 parent 26d109c commit f1aeaf1

File tree

19 files changed

+71
-28
lines changed

19 files changed

+71
-28
lines changed

.changeset/warm-snakes-remain.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: adds legacy mode flag reducing bundle size in runes mode only apps

packages/svelte/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
"./internal/disclose-version": {
5454
"default": "./src/internal/disclose-version.js"
5555
},
56+
"./internal/flags/legacy": {
57+
"default": "./src/internal/flags/legacy.js"
58+
},
5659
"./internal/server": {
5760
"default": "./src/internal/server/index.js"
5861
},

packages/svelte/scripts/check-treeshakeability.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ for (const key in pkg.exports) {
5757
if (key === './compiler') continue;
5858
if (key === './internal') continue;
5959
if (key === './internal/disclose-version') continue;
60+
if (key === './internal/flags/legacy') continue;
6061

6162
for (const type of ['browser', 'default']) {
6263
if (!pkg.exports[key][type]) continue;
@@ -83,6 +84,7 @@ const bundle = await bundle_code(
8384
// Use all features which contain hydration code to ensure it's treeshakeable
8485
compile(
8586
`
87+
<svelte:options runes />
8688
<script>
8789
import { mount } from ${JSON.stringify(client_main)}; mount();
8890
let foo;
@@ -118,12 +120,23 @@ if (!bundle.includes('hydrate_node') && !bundle.includes('hydrate_next')) {
118120
// eslint-disable-next-line no-console
119121
console.error(`✅ Hydration code treeshakeable`);
120122
} else {
121-
// eslint-disable-next-line no-console
122-
console.error(bundle);
123+
failed = true;
123124
// eslint-disable-next-line no-console
124125
console.error(`❌ Hydration code not treeshakeable`);
126+
}
127+
128+
if (!bundle.includes('component_context.l')) {
129+
// eslint-disable-next-line no-console
130+
console.error(`✅ Legacy code treeshakeable`);
131+
} else {
125132
failed = true;
133+
// eslint-disable-next-line no-console
134+
console.error(`❌ Legacy code not treeshakeable`);
135+
}
126136

137+
if (failed) {
138+
// eslint-disable-next-line no-console
139+
console.error(bundle);
127140
fs.writeFileSync('scripts/_bundle.js', bundle);
128141
}
129142

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,10 @@ export function client_component(analysis, options) {
531531
body.push(b.stmt(b.call(b.id('$.mark_module_end'), b.id(analysis.name))));
532532
}
533533

534+
if (!analysis.runes) {
535+
body.unshift(b.imports([], 'svelte/internal/flags/legacy'));
536+
}
537+
534538
if (options.discloseVersion) {
535539
body.unshift(b.imports([], 'svelte/internal/disclose-version'));
536540
}

packages/svelte/src/index-client.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { is_array } from './internal/shared/utils.js';
66
import { user_effect } from './internal/client/index.js';
77
import * as e from './internal/client/errors.js';
88
import { lifecycle_outside_component } from './internal/shared/errors.js';
9+
import { legacy_mode_flag } from './internal/flags/index.js';
910

1011
/**
1112
* The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.
@@ -25,7 +26,7 @@ export function onMount(fn) {
2526
lifecycle_outside_component('onMount');
2627
}
2728

28-
if (component_context.l !== null) {
29+
if (legacy_mode_flag && component_context.l !== null) {
2930
init_update_callbacks(component_context).m.push(fn);
3031
} else {
3132
user_effect(() => {

packages/svelte/src/internal/client/dom/blocks/each.js

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -490,27 +490,27 @@ function update_item(item, value, index, type) {
490490
*/
491491
function create_item(anchor, state, prev, next, value, key, index, render_fn, flags) {
492492
var previous_each_item = current_each_item;
493+
var reactive = (flags & EACH_ITEM_REACTIVE) !== 0;
494+
var mutable = (flags & EACH_ITEM_IMMUTABLE) === 0;
495+
496+
var v = reactive ? (mutable ? mutable_source(value) : source(value)) : value;
497+
var i = (flags & EACH_INDEX_REACTIVE) === 0 ? index : source(index);
498+
499+
/** @type {EachItem} */
500+
var item = {
501+
i,
502+
v,
503+
k: key,
504+
a: null,
505+
// @ts-expect-error
506+
e: null,
507+
prev,
508+
next
509+
};
510+
511+
current_each_item = item;
493512

494513
try {
495-
var reactive = (flags & EACH_ITEM_REACTIVE) !== 0;
496-
var mutable = (flags & EACH_ITEM_IMMUTABLE) === 0;
497-
498-
var v = reactive ? (mutable ? mutable_source(value) : source(value)) : value;
499-
var i = (flags & EACH_INDEX_REACTIVE) === 0 ? index : source(index);
500-
501-
/** @type {EachItem} */
502-
var item = {
503-
i,
504-
v,
505-
k: key,
506-
a: null,
507-
// @ts-expect-error
508-
e: null,
509-
prev,
510-
next
511-
};
512-
513-
current_each_item = item;
514514
item.e = branch(() => render_fn(anchor, v, i), hydrating);
515515

516516
item.e.prev = prev && prev.e;

packages/svelte/src/internal/client/reactivity/props.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import * as e from '../errors.js';
2323
import { BRANCH_EFFECT, LEGACY_DERIVED_PROP, ROOT_EFFECT } from '../constants.js';
2424
import { proxy } from '../proxy.js';
2525
import { capture_store_binding } from './store.js';
26+
import { legacy_mode_flag } from '../../flags/index.js';
2627

2728
/**
2829
* @param {((value?: number) => number)} fn
@@ -270,7 +271,7 @@ function with_parent_branch(fn) {
270271
*/
271272
export function prop(props, key, flags, fallback) {
272273
var immutable = (flags & PROPS_IS_IMMUTABLE) !== 0;
273-
var runes = (flags & PROPS_IS_RUNES) !== 0;
274+
var runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0;
274275
var bindable = (flags & PROPS_IS_BINDABLE) !== 0;
275276
var lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0;
276277
var is_store_sub = false;

packages/svelte/src/internal/client/reactivity/sources.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
BLOCK_EFFECT
3333
} from '../constants.js';
3434
import * as e from '../errors.js';
35+
import { legacy_mode_flag } from '../../flags/index.js';
3536

3637
export let inspect_effects = new Set();
3738

@@ -80,7 +81,7 @@ export function mutable_source(initial_value, immutable = false) {
8081

8182
// bind the signal to the component context, in case we need to
8283
// track updates to trigger beforeUpdate/afterUpdate callbacks
83-
if (component_context !== null && component_context.l !== null) {
84+
if (legacy_mode_flag && component_context !== null && component_context.l !== null) {
8485
(component_context.l.s ??= []).push(s);
8586
}
8687

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { destroy_derived, execute_derived, update_derived } from './reactivity/d
3333
import * as e from './errors.js';
3434
import { lifecycle_outside_component } from '../shared/errors.js';
3535
import { FILENAME } from '../../constants.js';
36+
import { legacy_mode_flag } from '../flags/index.js';
3637

3738
const FLUSH_MICROTASK = 0;
3839
const FLUSH_SYNC = 1;
@@ -162,7 +163,7 @@ export function increment_version() {
162163

163164
/** @returns {boolean} */
164165
export function is_runes() {
165-
return component_context !== null && component_context.l === null;
166+
return !legacy_mode_flag || (component_context !== null && component_context.l === null);
166167
}
167168

168169
/**
@@ -1025,7 +1026,7 @@ export function push(props, runes = false, fn) {
10251026
l: null
10261027
};
10271028

1028-
if (!runes) {
1029+
if (legacy_mode_flag && !runes) {
10291030
component_context.l = {
10301031
s: null,
10311032
u: null,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export let legacy_mode_flag = false;
2+
3+
export function enable_legacy_mode_flag() {
4+
legacy_mode_flag = true;
5+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { enable_legacy_mode_flag } from './index.js';
2+
3+
enable_legacy_mode_flag();

packages/svelte/tests/migrate/samples/derivations/output.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
1414
</script>
1515

16-
{count} / {doubled} / {quadrupled} / {time_8} / {time_16}
16+
{count} / {doubled} / {quadrupled} / {time_8} / {time_16}

packages/svelte/tests/migrate/samples/props-ts/output.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@
3939
{readonly}
4040
{optional}
4141
<input bind:value={binding} />
42-
<input bind:value={bindingOptional} />
42+
<input bind:value={bindingOptional} />

packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34

45
export default function Bind_this($$anchor) {

packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34

45
export default function Each_string_template($$anchor) {

packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34

45
var root = $.template(`<h1>hello world</h1>`);

packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34

45
var root = $.template(`<h1>hello world</h1>`);

packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34
import { random } from './module.svelte';
45

packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "svelte/internal/disclose-version";
2+
import "svelte/internal/flags/legacy";
23
import * as $ from "svelte/internal/client";
34

45
var root = $.template(`<p></p> <p></p> <!>`, 1);

0 commit comments

Comments
 (0)