跳至主要内容

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)

Svelte 不再支持编译器输出的 CommonJS (CJS) 格式,并且还删除了 svelte/register 钩子和 CJS 运行时版本。如果您需要保留 CJS 输出格式,请考虑使用捆绑程序在构建后步骤中将 Svelte 的 ESM 输出转换为 CJS。(#8613)

Svelte 函数的更严格类型

现在 createEventDispatcherActionActionReturnonMount 具有更严格的类型。

  • 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&#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 https://svelte.net.cn/docs/svelte/v5-migration-guide#Event-changes-Component-events
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 https://svelte.net.cn/docs/svelte/v5-migration-guide#Event-changes-Component-events
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'); // 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
  • ActionActionReturn 现在具有 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*/ anyAction<HTMLElement, string> = (node: anynode, params: anyparams) => { ... } // 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: anysomething => {...});
		// ...
		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 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 }> {}

如果您之前已将 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 入场动画仅在 successfalse 变为 true 时播放,但当 showfalse 变为 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 &#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 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 中的类型。您可以在 此处 找到有关操作方法的更多信息。

在 GitHub 上编辑此页面