常见问题

我是 Svelte 新手,应该从哪里开始?

我们认为最好的入门方式是玩一遍交互式 教程。其中的每一步都主要聚焦于某一个具体方面,并且易于跟随。你将在浏览器中直接编辑并运行真正的 Svelte 组件。

五到十分钟就足以让你上手跑起来。一个半小时左右应该能让你通篇过完整个教程。

在哪里可以获得支持?

如果你的问题是关于某些语法的,参考文档 是个不错的起点。

Stack Overflow 是一个很受欢迎的论坛,适合提出代码层面的问题,或者当你被某个具体错误卡住时。浏览一下已有的、带有 Svelte 标签的问题,或者 提出你自己的问题

还有一些在线论坛和聊天频道,是讨论最佳实践、应用架构,或者只是结识其他 Svelte 用户的好地方。我们的 DiscordReddit 频道 就是这样的例子。如果你有一个可以回答的代码层面问题,Stack Overflow 通常是更合适的选择。

有第三方资源吗?

Svelte Society 维护着一个 书籍与视频清单

如何让 VS Code 为我的 .svelte 文件提供语法高亮?

有一个 官方的 Svelte VS Code 扩展

有自动格式化我的 .svelte 文件的工具吗?

你可以使用 prettier,配合 prettier-plugin-svelte 插件。

如何为我的组件编写文档?

在使用 Svelte Language Server 的编辑器中,你可以通过特殊格式的注释为组件、函数和导出编写文档。

<script>
	/** 我们应该怎么称呼这个用户? */
	export let name = 'world';
</script>

<!--
@component
这是一些关于该组件的文档。
它会在悬停时显示出来。

- 你可以在这里使用 markdown。
- 你也可以在这里使用代码块。
- 用法:
  ```svelte
  <main name="Arethra">
  ```
-->
<main>
	<h1>
		Hello, {name}
	</h1>
</main>

注意:在你描述组件的 HTML 注释中,@component 是必需的。

Svelte 能扩展吗?

最终会有一篇关于这个主题的博客文章,但与此同时,请查看 这个 issue

有 UI 组件库吗?

有若干 UI 组件库,以及列在 packages 页面 上的独立组件。

如何测试 Svelte 应用?

你的应用如何组织、逻辑定义在哪里,将决定确保它被正确测试的最佳方式。需要注意,并非所有逻辑都属于组件内部——这包括数据转换、跨组件状态管理、日志等关注点。请记住,Svelte 库本身拥有自己的测试套件,因此你无需为验证 Svelte 提供的实现细节而编写测试。

一个 Svelte 应用通常会有三种不同类型的测试:单元测试(Unit)、组件测试(Component)和端到端测试(E2E)。

单元测试:专注于隔离地测试业务逻辑。通常这是验证独立的函数和边界情况。通过最小化这些测试的表面积,它们可以保持精简和快速;而将尽可能多的逻辑从 Svelte 组件中抽离出来,你就能用单元测试覆盖应用的更多部分。在创建新的 SvelteKit 项目时,你会被问到是否要设置 Vitest 用于单元测试。此外还有许多其他测试运行器可供使用。

组件测试:验证一个 Svelte 组件在其整个生命周期中是否如预期地挂载并交互,这需要一个能提供文档对象模型(DOM)的工具。组件可以被编译(因为 Svelte 是一个编译器,而非普通库)并挂载,以便对元素结构、监听器、状态以及 Svelte 组件提供的所有其他能力进行断言。组件测试工具的范围很广,从 jsdom 这类内存实现配合 Vitest 这样的测试运行器,到利用真实浏览器提供可视化测试能力(如 PlaywrightCypress)的方案。

端到端测试:为了确保你的用户能够与你的应用交互,有必要以尽可能接近生产环境的方式对其进行整体测试。这是通过编写端到端(E2E)测试来完成的,这些测试会加载并与你应用的已部署版本交互,以模拟用户将如何与应用交互。在创建新的 SvelteKit 项目时,你会被问到是否要设置 Playwright 用于端到端测试。还有许多其他的 E2E 测试库可供使用。

一些入门测试的资源:

有路由器吗?

官方的路由库是 SvelteKit。SvelteKit 在一个易于使用的包中提供了文件系统路由器、服务端渲染(SSR)和热模块替换(HMR)。它与 React 的 Next.js 和 Vue 的 Nuxt.js 有相似之处。SvelteKit 还支持用于客户端应用的基于 hash 的路由。

不过,你可以使用任何路由库。可用路由器的列举见 packages 页面

如何用 Svelte 编写移动应用?

虽然大多数移动应用并不使用 JavaScript 编写,但如果你想在构建移动应用时利用你现有的 Svelte 组件和 Svelte 知识,你可以将一个 SvelteKit SPA 通过 TauriCapacitor 转变为移动应用。相机、地理定位和推送通知等移动特性,在这两个平台上都可以通过插件获得。

关于 Svelte 5 中自定义渲染器支持 的工作已经取得了一些进展,但该特性目前尚不可用。自定义渲染 API 将支持 Lynx JS 和 Svelte Native 等更多的移动框架。Svelte Native 是 Svelte 4 的一个可用选项,但 Svelte 5 目前并不支持它。Svelte Native 让你能够使用包含 NativeScript UI 组件(而非 DOM 元素)的 Svelte 组件来编写 NativeScript 应用,这对来自 React Native 的用户来说可能比较熟悉。

我能告诉 Svelte 不要移除我未使用的样式吗?

不能。Svelte 会从组件中移除这些样式,并就此向你发出警告,以避免原本会由此引发的问题。

Svelte 的组件样式作用域机制会生成一个对给定组件唯一的类,将其添加到组件中处于 Svelte 控制之下的相关元素上,然后再将其添加到该组件样式中的每个选择器上。当编译器无法看出某个样式选择器适用于哪些元素时,要保留它只有两种糟糕的选择:

  • 如果它保留了选择器并为其添加作用域类,该选择器很可能无法匹配组件中的预期元素,而如果它们是由子组件或 {@html ...} 创建的,那就肯定匹配不上。
  • 如果它保留了选择器却没有为其添加作用域类,该样式就会变成全局样式,影响你的整个页面。

如果你需要为 Svelte 在编译时无法识别的内容设置样式,你需要通过使用 :global(...) 显式地选择加入全局样式。但也要记住,你可以只将 :global(...) 包裹在选择器的一部分外面。.foo :global(.bar) { ... } 会为出现在组件 .foo 元素内部的任何 .bar 元素设置样式。只要当前组件中有某个父元素可以作为起点,像这样的部分全局选择器几乎总能让你得到想要的效果。

Svelte v2 还可用吗?

它不会再添加新特性,而且 bug 大概只会在极其恶劣或存在某种安全漏洞时才会被修复。

文档仍可在 这里 获取。

如何进行热模块替换?

我们推荐使用 SvelteKit,它开箱即用地支持 HMR,并且构建在 Vitesvelte-hmr 之上。社区也有 rollupwebpack 的插件可用。