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,
- 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éfinissantbrowser: true
dans ses options. Voir la documentation derollup-plugin-svelte
pour plus d’infos - Avec webpack, vous pouvez faire cela en ajoutant
"browser"
dans le tableau deconditionNames
. Vous pourriez aussi avoir besoin de mettre à jour votre configuration d’alias
, si vous en avez une. Voir la documentation desvelte-loader
pour plus d’infos
(#8516)
Suppression du format CJS
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<{
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
}>();
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<{
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
}>();
createEventDispatcher<{
optional: number | null
optional: number | null;
required: string
required: string;
noArgument: null
noArgument: 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
etActionReturn
ont maintenant un typeundefined
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*/ any
Action<HTMLElement, string> = (node: any
node, params: any
params) => { ... } // 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: any
qqch => {...});
// ...
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 Foo
Foo 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: string
aProp: 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 <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 <style lang="sass">
block into vanilla CSS.
preprocess(
source,
[
{
PreprocessorGroup.markup?: MarkupPreprocessor | undefined
markup: () => {
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
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.
log('markup-1');
},
PreprocessorGroup.script?: Preprocessor | undefined
script: () => {
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
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.
log('script-1');
},
PreprocessorGroup.style?: Preprocessor | undefined
style: () => {
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
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.
log('style-1');
}
},
{
PreprocessorGroup.markup?: MarkupPreprocessor | undefined
markup: () => {
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
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.
log('markup-2');
},
PreprocessorGroup.script?: Preprocessor | undefined
script: () => {
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
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.
log('script-2');
},
PreprocessorGroup.style?: Preprocessor | undefined
style: () => {
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
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.
log('style-2');
}
}
],
{
filename?: string | undefined
filename: '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 commewritable
) importée depuissvelte/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 namespacesvelteHTML
. De même, si vous utilisiez le namespacesvelte.JSX
pour accéder à ses définitions de type, vous devrez peut-être migrer pour importer plutôt ces types depuissvelte/elements
. Vous trouverez plus d’informations sur ce sujet ici.
Modifier cette page sur Github