Svelte 4 迁移指南
本迁移指南概述了如何从 Svelte 版本 3 迁移到 4。有关每个更改的更多详细信息,请参阅链接的 PR。使用迁移脚本自动迁移其中的一些:npx svelte-migrate@latest svelte-4
如果您是库作者,请考虑是否只支持 Svelte 4 或者是否也可能支持 Svelte 3。由于大多数重大更改不会影响很多人,因此这可能是很容易实现的。还要记住更新 peerDependencies
中的版本范围。
最低版本要求
- 升级到 Node 16 或更高版本。不再支持早期版本。(#8566)
- 如果您使用的是 SvelteKit,请升级到 1.20.4 或更高版本 (sveltejs/kit#10172)
- 如果您在没有 SvelteKit 的情况下使用 Vite,请升级到
vite-plugin-svelte
2.4.1 或更高版本 (#8516) - 如果您使用的是 webpack,请升级到 webpack 5 或更高版本以及
svelte-loader
3.1.8 或更高版本。不再支持早期版本。(#8515, 198dbcf) - 如果您使用的是 Rollup,请升级到
rollup-plugin-svelte
7.1.5 或更高版本 (198dbcf) - 如果您使用的是 TypeScript,请升级到 TypeScript 5 或更高版本。较低版本可能仍然有效,但对此不做任何保证。(#8488)
捆绑程序的浏览器条件
捆绑程序现在必须在为浏览器构建前端捆绑包时指定 browser
条件。SvelteKit 和 Vite 将自动为您处理此问题。如果您使用任何其他捆绑程序,您可能会观察到诸如 onMount
之类的生命周期回调未被调用,并且您需要更新模块解析配置。
- 对于 Rollup,这是通过在
@rollup/plugin-node-resolve
插件中设置其选项中的browser: true
来完成的。有关更多详细信息,请参阅rollup-plugin-svelte
文档 - 对于 webpack,这是通过将
"browser"
添加到conditionNames
数组中来完成的。如果您已设置别名配置,则可能还需要更新您的alias
配置。有关更多详细信息,请参阅svelte-loader
文档
(#8516)
删除与 CJS 相关的输出
Svelte 不再支持编译器输出的 CommonJS (CJS) 格式,并且还删除了 svelte/register
钩子和 CJS 运行时版本。如果您需要保留 CJS 输出格式,请考虑使用捆绑程序在构建后步骤中将 Svelte 的 ESM 输出转换为 CJS。(#8613)
Svelte 函数的更严格类型
现在 createEventDispatcher
、Action
、ActionReturn
和 onMount
具有更严格的类型。
createEventDispatcher
现在支持指定有效负载是可选的、必需的还是不存在的,并且相应地检查调用站点 (#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'); // I can still omit the detail argument
const dispatch: EventDispatcher
<"noArgument">(type: "noArgument", parameter?: null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch('noArgument', 'surprise'); // I can still add a detail argument
// Svelte version 4 using TypeScript strict mode:
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'); // error, missing argument
const dispatch: EventDispatcher
<"noArgument">(type: "noArgument", parameter?: null | undefined, options?: DispatchOptions | undefined) => boolean
dispatch('noArgument', 'surprise'); // error, cannot pass an argument
Action
和ActionReturn
现在具有undefined
的默认参数类型,这意味着如果您想指定此操作接收参数,则需要键入泛型。迁移脚本将自动迁移此内容 (#7442)
const action: Action = (node, params) => { ... } // this is now an error if you use params in any way
const const action: Action<HTMLElement, string>
action: type Action = /*unresolved*/ any
Action<HTMLElement, string> = (node: any
node, params: any
params) => { ... } // params is of type string
- 如果您从
onMount
异步返回函数,onMount
现在会显示类型错误,因为这可能是代码中的错误,您期望在销毁时调用回调,它只会对同步返回的函数执行此操作 (#8136)
// Example where this change reveals an actual bug
onMount(
// someCleanup() not called because function handed to onMount is async
async () => {
const something = await foo();
// someCleanup() is called because function handed to onMount is sync
() => {
foo().then(something: any
something => {...});
// ...
return () => someCleanup();
}
);
使用 Svelte 的自定义元素
使用 Svelte 创建自定义元素已进行了彻底检修并得到了显着改进。tag
选项已弃用,取而代之的是新的 customElement
选项。
<svelte:options tag="my-component" />
<svelte:options customElement="my-component" />
进行此更改是为了允许 更多可配置性 以满足高级用例。迁移脚本将自动调整您的代码。属性的更新时间也略有更改。(#8457)
SvelteComponentTyped 已弃用
SvelteComponentTyped
已弃用,因为 SvelteComponent
现在具有其所有类型功能。将所有 SvelteComponentTyped
实例替换为 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 }> {}
如果您之前已将 SvelteComponent
作为组件实例类型,您现在可能会看到一个有点不透明的类型错误,可以通过将 : typeof SvelteComponent
更改为 : 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} />
迁移脚本将自动为您执行这两项操作。(#8512)
转换默认情况下为本地
转换现在默认情况下为本地,以防止围绕页面导航的混淆。“本地”表示如果转换位于嵌套控制流块 (each/if/await/key
) 中而不是直接父块中,但其上方的块被创建/销毁,则转换不会播放。在以下示例中,slide
入场动画仅在 success
从 false
变为 true
时播放,但当 show
从 false
变为 true
时不会播放。
{#if show}
...
{#if success}
<p in:slide>Success</p>
{/each}
{/if}
要使转换全局化,请添加 |global
修饰符 - 然后当任何上方的控制流块被创建/销毁时,它们将播放。迁移脚本将自动为您执行此操作。(#6686)
默认插槽绑定
默认插槽绑定不再公开给命名插槽,反之亦然。
<script>
import Nested from './Nested.svelte';
</script>
<Nested let:count>
<p>
count in default slot - is available: {count}
</p>
<p slot="bar">
count in bar slot - is not available: {count}
</p>
</Nested>
这使得插槽绑定更加一致,因为例如当默认插槽来自列表而命名插槽不是时,行为是不确定的。(#6049)
预处理器
应用预处理器的顺序已更改。现在,预处理器按顺序执行,在一个组内,顺序为标记、脚本、样式。
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 logs:
// markup-1
// markup-2
// script-1
// script-2
// style-1
// style-2
// Svelte 4 logs:
// markup-1
// script-1
// style-1
// markup-2
// script-2
// style-2
例如,如果您使用的是 MDsveX
,这可能会影响您 - 在这种情况下,您应该确保它位于任何脚本或样式预处理器之前。
preprocess: [
vitePreprocess(),
mdsvex(mdsvexConfig)
mdsvex(mdsvexConfig),
vitePreprocess()
]
每个预处理器也必须有一个名称。(#8618)
新的 eslint 包
eslint-plugin-svelte3
已弃用。它可能仍与 Svelte 4 一起使用,但我们对此不做任何保证。我们建议切换到我们的新包 eslint-plugin-svelte。有关迁移说明,请参阅 此 Github 帖子。或者,您可以使用 npm create svelte@latest
创建一个新项目,选择 eslint(可能还有 TypeScript)选项,然后将相关文件复制到您现有的项目中。
其他重大更改
inert
属性现在应用于即将结束的元素,使其对辅助技术不可见并防止交互。(#8628)- 运行时现在使用
classList.toggle(name, boolean)
,这可能在非常旧的浏览器中不起作用。如果您需要支持这些浏览器,请考虑使用 polyfill。(#8629) - 运行时现在使用
CustomEvent
构造函数,这可能在非常旧的浏览器中不起作用。如果您需要支持这些浏览器,请考虑使用 polyfill。(#8775) - 使用
svelte/store
中的StartStopNotifier
接口(传递给writable
等的创建函数)从头开始实现自己的存储的人员现在需要除了 set 函数之外还要传递一个更新函数。这对使用存储或使用现有 Svelte 存储创建存储的人员没有影响。(#6750) derived
现在将在虚假值上抛出错误,而不是传递给它的存储。(#7947)- 删除了
svelte/internal
的类型定义,以进一步避免使用那些不是公共 API 的内部方法。其中大多数可能会在 Svelte 5 中更改。 - DOM 节点的删除现在已批量处理,这会稍微更改其顺序,如果在这些元素上使用
MutationObserver
,这可能会影响触发的事件顺序 (#8763) - 如果您之前通过
svelte.JSX
命名空间增强了全局类型,则需要迁移此命名空间以使用svelteHTML
命名空间。同样,如果您使用svelte.JSX
命名空间来使用其中的类型定义,则需要迁移这些类型以改用svelte/elements
中的类型。您可以在 此处 找到有关操作方法的更多信息。