Skip to main content

Guide de migration vers Svelte 4

Ce guide de migration fournit un aperçu de comment migrer Svelte de la version 3 à la version 4. Voir les liens vers les PRs pour plus de détails sur chaque changement. Vous pouvez utiliser le script de migration pour migrer certains de ces changements automatiquement : npx svelte-migrate@latest svelte-4.

Si vous maintenez une librairie, vous devriez envisager le support à la fois de la version et de la version 3, et pas uniquement de la version 4. Puisque la plupart des changements bloquants ne concernent que peu de personnes, cela devrait être possible sans trop d’efforts. Et pensez à mettre également à jour la gamme de versions de votre peerDependencies.

Versions minimum requises

  • Passez à Node 16 ou supérieur. Les versions antérieures ne sont plus supportées (#8566)
  • Si vous utilisez SvelteKit, passer à 1.20.4 ou plus récent (#sveltejs/kit#10172)
  • Si vous utilisez Vite sans SvelteKit, passez à vite-plugin-svelte 2.4.1 ou plus récent (#8516)
  • Si vous utilisez webpack, passer à webpack 5 ou supérieur et svelte-loader 3.1.8 ou plus supérieur. Les versions plus anciennes ne sont plus supportées (#8515,

198dbcf)

  • Si vous utilisez Rollup, passez à rollup-plugin-svelte 7.1.5 ou supérieur (198dbcf)
  • Si vous utilisez TypeScript, passez à TypeScript 5 ou supérieur. Les versions antérieures peuvent encore être compatibles, mais nous ne pouvons pas le garantir (#8488)

Conditions des navigateurs pour les bundlers

Les bundlers doivent maintenant préciser la condition browser lorsqu’ils compilent un bundle frontend pour le navigateur. SvelteKit et Vite s’occupent de gérer cela automatiquement pour vous. Si vous utilisez autre chose, il se peut que vous observiez des callbacks de cycle de vie tels que onMount ne pas être appelés, et vous aurez alors besoin de mettre à jour la configuration de résolution de module.

  • Avec Rollup, vous pouvez faire cela dans le plugin @rollup/plugin-node-resolve en définissant browser: true dans ses options. Voir la documentation de rollup-plugin-svelte pour plus d’infos
  • Avec webpack, vous pouvez faire cela en ajoutant "browser" dans le tableau de conditionNames. Vous pourriez aussi avoir besoin de mettre à jour votre configuration d’alias, si vous en avez une. Voir la documentation de svelte-loader pour plus d’infos

(#8516)

Svelte ne supporte plus le format CommonJS (CJS) en sortie de son compilateur et a également supprimé le hook svelte/register et la version du runtime CommonJS. Si vous a besoin de garder un format compilé CJS, envisagez l’utilisation d’un bundler pour convertir le format ESM — que Svelte fournit en sortie de compilation — en CJS dans une étape post-build. (#8613)

Types plus stricts pour les fonctions Svelte [!VO ]Stricter types for Svelte functions

Les types des fonctions createEventDispatcher, Action, ActionReturn et onMount sont maintenant plus stricts :

  • createEventDispatcher permet maintenant de préciser qu’une payload est optionnelle, requise ou non existante, et ses exécutions sont vérifiées en conséquence. (#7224)
import { function createEventDispatcher<EventMap extends Record<string, any> = any>(): EventDispatcher<EventMap>

Creates an event dispatcher that can be used to dispatch component events. Event dispatchers are functions that can take two arguments: name and detail.

Component events created with createEventDispatcher create a CustomEvent. These events do not bubble. The detail argument corresponds to the CustomEvent.detail property and can contain any type of data.

The event dispatcher can be typed to narrow the allowed event names and the type of the detail argument:

const dispatch = createEventDispatcher&#x3C;{
 loaded: never; // does not take a detail argument
 change: string; // takes a detail argument of type string, which is required
 optional: number | null; // takes an optional detail argument of type number
}>();
@deprecatedUse callback props and/or the $host() rune instead — see migration guide
createEventDispatcher
} from 'svelte';
const
const dispatch: EventDispatcher<{
    optional: number | null;
    required: string;
    noArgument: null;
}>
dispatch
=
createEventDispatcher<{
    optional: number | null;
    required: string;
    noArgument: null;
}>(): EventDispatcher<{
    optional: number | null;
    required: string;
    noArgument: null;
}>

Creates an event dispatcher that can be used to dispatch component events. Event dispatchers are functions that can take two arguments: name and detail.

Component events created with createEventDispatcher create a CustomEvent. These events do not bubble. The detail argument corresponds to the CustomEvent.detail property and can contain any type of data.

The event dispatcher can be typed to narrow the allowed event names and the type of the detail argument:

const dispatch = createEventDispatcher&#x3C;{
 loaded: never; // does not take a detail argument
 change: string; // takes a detail argument of type string, which is required
 optional: number | null; // takes an optional detail argument of type number
}>();
@deprecatedUse callback props and/or the $host() rune instead — see migration guide
createEventDispatcher
<{
optional: number | nulloptional: number | null; required: stringrequired: string; noArgument: nullnoArgument: null; }>(); // Svelte version 3:
const dispatch: EventDispatcher
<"optional">(type: "optional", parameter?: number | null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch
('optional');
const dispatch: EventDispatcher
<"required">(type: "required", parameter: string, options?: DispatchOptions | undefined) => boolean
dispatch
('required'); // je peux toujours omettre l'argument de détail
const dispatch: EventDispatcher
<"noArgument">(type: "noArgument", parameter?: null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch
('noArgument', 'surprise'); // je peux toujours ajouter un argument de détail
// Svelte version 4 avec TypeScript mode strict:
const dispatch: EventDispatcher
<"optional">(type: "optional", parameter?: number | null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch
('optional');
const dispatch: EventDispatcher
<"required">(type: "required", parameter: string, options?: DispatchOptions | undefined) => boolean
dispatch
('required'); // erreur, argument manquant
const dispatch: EventDispatcher
<"noArgument">(type: "noArgument", parameter?: null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch
('noArgument', 'surprise'); // erreur, vous ne pouvez pas fournir d'argument
  • Action et ActionReturn ont maintenant un type undefined par défaut pour leur argument, ce qui signifie que vous devez typer le générique si vous souhaitez préciser que cette action attend un paramètre. Le script de migration s’occupera de ça pour vous. (#7442)
const action: Action = (node, params) => { ... } // ceci est maintenant un erreur si vous fournissez n'importe quel argument
const const action: Action<HTMLElement, string>action: type Action = /*unresolved*/ anyAction<HTMLElement, string> = (node: anynode, params: anyparams) => { ... } // l'argument est de type string
  • onMount a désormais une erreur de type si vous lui faites renvoyer une fonction de manière asynchrone, car cela entraînera très probablement un bug dans votre code : vous vous attendrez à ce que le callback soit appelé au démontage du composant, ce qui ne se produit que pour les fonctions renvoyées de manière synchrone (#8136).
// exemple où ce changement révèle un bug
onMount(
	// nettoyage() n'est pas appelé car la fonction fournie à onMount est asynchrone
	async () => {
		const qqch = await foo();
           	// nettoyage est appelé car la fonction fournie à onMount est synchrone
	() => {
		foo().then(qqch: anyqqch => {...});
		// ...
		return () => nettoyage();
	}
);

Éléments personnalisés avec Svelte

La création d’éléments personnalisés avec Svelte a été refondue et significativement améliorée. L’option tag est déprécié en faveur de la nouvelle option customElement :

<svelte:options tag="mon-composant" />
<svelte:options customElement="mon-composant" />

Ce changement a été introduit pour permettre plus de configurabilité dans des cas d’usage avancés. Le script de migration ajustera votre code automatiquement. Le timing de mise à jour des propriétés a également légèrement changé. (#8457)

SvelteComponentTyped est déprécié

SvelteComponentTyped est déprécié, puisque SvelteComponent permet maintenant de remplacer ses capacités de typage. Remplacez toutes les instances de SvelteComponentTyped par SvelteComponent.

import { SvelteComponentTyped } from 'svelte';
import { class SvelteComponent<Props extends Record<string, any> = Record<string, any>, Events extends Record<string, any> = any, Slots extends Record<string, any> = any>

This was the base class for Svelte components in Svelte 4. Svelte 5+ components are completely different under the hood. For typing, use Component instead. To instantiate components, use mount instead. See migration guide for more info.

SvelteComponent
} from 'svelte';
export class Foo extends SvelteComponentTyped<{ aProp: string }> {} export class class FooFoo extends class SvelteComponent<Props extends Record<string, any> = Record<string, any>, Events extends Record<string, any> = any, Slots extends Record<string, any> = any>

This was the base class for Svelte components in Svelte 4. Svelte 5+ components are completely different under the hood. For typing, use Component instead. To instantiate components, use mount instead. See migration guide for more info.

SvelteComponent
<{ aProp: stringaProp: string }> {}

Si vous avez précédemment utilisé SvelteComponent en tant qu’instance de composant, vous verrez désormais peut-être une erreur de type quelque opaque, qui est résolue en changeant : type SvelteComponent en : typeof SvelteComponent<any>.

<script>
	import ComponentA from './ComponentA.svelte';
	import ComponentB from './ComponentB.svelte';
	import { SvelteComponent } from 'svelte';

	let component: typeof SvelteComponent<any>;

	function choseRandomly() {
		component = Math.random() > 0.5 ? ComponentA : ComponentB;
	}
</script>

<button on:click={choseRandomly}>random</button>
<svelte:element this={component} />

Le script de migration s’occupera de faire ces changements pour vous. (#8512)

Les transitions sont locales par défaut

Les transitions sont maintenant locales par défaut pour éviter les confusions lors des navigations entre pages. “local” signifie qu’une transition ne sera pas jouée si elle est définie au sein d’un bloc de contrôle de flux imbriqué (each / if/await/key), et qu’un bloc parent qui n’est pas son parent direct est créé ou détruit. Dans l’exemple suivant, l’animation d’intro slide ne sera jouée que lorsque success passe de false à true, mais ne sera pas jouée lorsque show pass de false à true :

{#if show}
	...
	{#if success}
		<p in:slide>Succès</p>
	{/each}
{/if}

Pour rendre des transitions globales, ajoutez le modificateur |global — ces transitions seront jouées lorsque n’importe quel bloc de contrôle de flux est créé ou détruit. Le script de migration fera ces changements pour vous. (#6686)

Liaisons de slot par défaut

Les liaisons de slot par défaut ne sont plus exposées à slots nommés et inversement :

<script>
	import Nested from './Nested.svelte';
</script>

<Nested let:count>
	<p>
		count dans le slot par défaut — disponible : {count}
	</p>
	<p slot="bar">
		count dans le slot "bar" — non disponible : {count}
	</p>
</Nested>

Cela rend les liaisons de slot plus consistentes car le comportement est non défini lorsque par exemple le slot par défaut vient d’une liste, mais pas le slot nommé. (#6049)

Préprocessseurs

L’ordre dans lequel les préprocesseurs sont appliqué a changé. Dorénavant, les préprocesseurs sont exécutés dans l’ordre, et au sein d’un même groupe, l’order est : markup, script, style.

import { 
function preprocess(source: string, preprocessor: PreprocessorGroup | PreprocessorGroup[], options?: {
    filename?: string;
} | undefined): Promise<Processed>

The preprocess function provides convenient hooks for arbitrarily transforming component source code. For example, it can be used to convert a &#x3C;style lang="sass"> block into vanilla CSS.

preprocess
} from 'svelte/compiler';
const { const code: string

The new code

code
} = await
function preprocess(source: string, preprocessor: PreprocessorGroup | PreprocessorGroup[], options?: {
    filename?: string;
} | undefined): Promise<Processed>

The preprocess function provides convenient hooks for arbitrarily transforming component source code. For example, it can be used to convert a &#x3C;style lang="sass"> block into vanilla CSS.

preprocess
(
source, [ { PreprocessorGroup.markup?: MarkupPreprocessor | undefinedmarkup: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('markup-1');
}, PreprocessorGroup.script?: Preprocessor | undefinedscript: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('script-1');
}, PreprocessorGroup.style?: Preprocessor | undefinedstyle: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('style-1');
} }, { PreprocessorGroup.markup?: MarkupPreprocessor | undefinedmarkup: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('markup-2');
}, PreprocessorGroup.script?: Preprocessor | undefinedscript: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('script-2');
}, PreprocessorGroup.style?: Preprocessor | undefinedstyle: () => { var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('style-2');
} } ], { filename?: string | undefinedfilename: 'App.svelte' } ); // Svelte 3 affiche : // markup-1 // markup-2 // script-1 // script-2 // style-1 // style-2 // Svelte 4 affiche : // markup-1 // script-1 // style-1 // markup-2 // script-2 // style-2

Ceci peut vous concerner si par exemple vous utilisez MDsveX — dans ce cas vous devriez vous assurer qu’il est appliqué avant tout préprocesseur de script ou de style.

preprocess: [
	vitePreprocess(),
	mdsvex(mdsvexConfig)
	mdsvex(mdsvexConfig),
	vitePreprocess()
]

Chaque préprocesseur doit également avoir un nom. (#8618)

Nouveau package eslint

eslint-plugin-svelte3 est déprécié. Il peut éventuellement toujours fonctionner avec Svelte 4, mais nous n’offrons aucune garantie à ce niveau. Nous recommandons de passer à notre nouveau package eslint-plugin-svelte. Voir le post Github pour obtenir des instructions sur comment migrer. Alternativement, vous pouvez créer un nouveau projet en utilisant npm create svelte@latest, sélectionner l’option eslint (et éventuellement TypeScript), puis copier les fichiers correspondants dans votre projet existant.

Autres changements bloquants

  • l’attribut inert est maintenant appliqué aux éléments en train de sortir du DOM pour les rendre invisibles aux technologies d’assistance et éviter les interactions. (#8628)
  • l’environnement d’exécution utilise désormais classList.toggle(name, boolean), qui peut ne pas fonctionner avec de très vieux navigateurs. Envisagez l’utilisation d’un polyfill si vous avez besoin de supporter ces navigateurs. (#8629)
  • l’environnement d’exécution utilise désormais le constructor CustomEvent, qui peut ne pas fonctionner avec de très vieux navigateurs. Envisagez l’utilisation d’un polyfill si vous avez besoin de supporter ces navigateurs. (#8629)
  • les personnes implémentant de zéro leurs propres stores en utilisant l’interface StartStopNotifier (qui est fournie aux fonctions de création de store comme writable) importée depuis svelte/store doivent désormais fournir une fonction de mise à jour en plus de la fonction passée en premier argument. Ceci n’a pas d’effet sur les personnes utilisant des stores ou créant des stores à partir de stores Svelte existants. (#6750)
  • derived va dorénavant lever une erreur si on lui fournit des valeurs falsy plutôt que des stores. (#7947)
  • les définitions de type pour svelte/internal ont été supprimées pour décourager l’usage de ces méthodes internes ne faisant pas partie de l’API publique. La plupart de ces méthodes vont très certainement évoluer pour Svelte 5.
  • La suppression de noeuds DOM se fait dorénavant par batchs, ce qui change légèrement l’ordre des évènements déclenchés si vous utilisez un MutationObserver sur ces éléments. (#8763)
  • si vous amélioriez le typage global via le namespace svelte.JSX, vous aurez peut-être besoin de migrer ce typage pour utiliser plutôt le namespace svelteHTML. De même, si vous utilisiez le namespace svelte.JSX pour accéder à ses définitions de type, vous devrez peut-être migrer pour importer plutôt ces types depuis svelte/elements. Vous trouverez plus d’informations sur ce sujet ici.

Modifier cette page sur Github