Loading...
{:then component}
` 已不再必要。
###
src/节点模块
一个常见的模式是在 Sapper 应用中将您的内部库放在 `src/node_modules` 目录内。这在 Vite 中不适用,所以我们使用 [`src/lib`]($lib) 代替。
##
页面和布局
###
重命名文件
路由现在完全由文件夹名称组成,以消除歧义,直到`+page.svelte`的文件夹名称对应于路由。请参阅[路由文档](routing)以获取概述。以下显示的是新旧比较:
| 旧 | 新 |
| --- | --- |
| routes/about/index.svelte | routes/about/+page.svelte |
| routes/关于.svelte | routes/about/+page.svelte |
您的自定义错误页面组件应从`_error.svelte`重命名为`+error.svelte`。任何`_layout.svelte`文件也应相应重命名为`+layout.svelte`。[其他文件将被忽略](routing#Other-files)。
###
导入
The `goto`、`prefetch` 和 `prefetchRoutes` 从 `@sapper/app` 的导入应分别替换为从 [`$app/navigation`]($app-navigation) 的 `goto`、`preloadData` 和 `preloadCode` 导入。
The `stores` import from `@sapper/app` should be replaced — see the [Stores](migrating#Pages-and-layouts-Stores) section below.
任何您之前从`src/node_modules`目录中导入的文件都需要替换为`$lib`导入。
###
预加载
与之前一样,页面和布局可以导出一个功能,允许在渲染之前加载数据。
此函数已从 `preload` 重命名为 [`load`](load),现在位于其 `+page.js`(或 `+layout.js`)旁边,紧挨着其 `+page.svelte`(或 `+layout.svelte`),并且其 API 已更改。不再是两个参数——`page` 和 `session`——而是一个 `event` 参数。
没有更多 `此` 对象,因此也没有 `this.fetch`、`this.error` 或 `this.redirect`。相反,您可以从输入方法中获取 [`fetch`](load#Making-fetch-requests),而 [`error`](load#Errors) 和 [`redirect`](load#Redirects) 现在都会抛出。
###
商店
在 Sapper 中,你会这样获取提供的 store 引用:
```js
// @filename: ambient.d.ts
declare module '@sapper/app';
// @filename: index.js
// ---cut---
import { stores } from '@sapper/app';
const { preloading, page, session } = stores();
```
页面存储仍然存在;`预加载`已被替换为包含`from`和`to`属性的`导航`存储。`页面`现在有`url`和`params`属性,但没有`path`或`query`。
您在 SvelteKit 中访问它们的方式不同。\``stores`\`现在变为\``getStores`\`,但在大多数情况下这是不必要的,因为您可以直接从\`[`$app/stores`]($app-stores)\`导入\``navigating`\`和\``page`\`。如果您使用的是 Svelte 5 和 SvelteKit 2.12 或更高版本,请考虑使用\`[`$app/state`]($app-state)\`代替。
###
路由
正则表达式路由不再受支持。相反,请使用[高级路由匹配](advanced-routing#Matching)。
###
段
之前,布局组件接收一个 `segment` 属性来指示子段。这已被移除;您应使用更灵活的 `$page.url.pathname`(或 `page.url.pathname`)值来获取您感兴趣的段。
### URLs
在 Sapper 中,所有相对 URL 都是相对于基础 URL 解析的——通常是`/`,除非使用了`basepath`选项——而不是相对于当前页面。
这导致了问题,并且在 SvelteKit 中不再是这样。相反,相对 URL 是相对于当前页面(或目标页面,对于在`fetch` URL 中的`load`函数)解析的。在大多数情况下,使用根相对 URL(即以`/`开头)更容易,因为它们的含义不依赖于上下文。
###
属性
* `سپارک:prefetch` 现在是 `data-sveltekit-preload-data`
* `سپارک:noscroll` 现在是 `data-sveltekit-noscroll`
##
端点
在 Sapper 中,[服务器路由](routing#server)接收了 Node 的`http`模块(或 Polka 和 Express 等框架提供的增强版本)暴露的`req`和`res`对象。
SvelteKit 设计为对应用程序运行的位置无感知——它可以在 Node 服务器上运行,但同样也可以在无服务器平台或 Cloudflare Worker 上运行。因此,您不再直接与`req`和`res`交互。您的端点需要更新以匹配新的签名。
为了支持这种环境无关的行为,现在全局上下文中可用 `fetch`,因此您无需导入 `node-fetch`、`cross-fetch` 或类似的服务器端 fetch 实现,即可使用它。
##
集成
查看[集成](./integrations)以获取有关集成的详细信息。
###
HTML 压缩器
Sapper 默认包含 `html-minifier`。SvelteKit 不包含此功能,但您可以将它作为生产依赖项添加,然后通过一个 [钩子](hooks#Server-hooks-handle) 使用它:
```js
// @filename: ambient.d.ts
///
declare module 'html-minifier';
// @filename: index.js
// ---cut---
import { minify } from 'html-minifier';
import { building } from '$app/environment';
const minification_options = {
collapseBooleanAttributes: true,
collapseWhitespace: true,
conservativeCollapse: true,
decodeEntities: true,
html5: true,
ignoreCustomComments: [/^#/],
minifyCSS: true,
minifyJS: false,
removeAttributeQuotes: true,
removeComments: false, // some hydration code needs comments, so leave them in
removeOptionalTags: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
sortAttributes: true,
sortClassName: true
};
/** @type {import('@sveltejs/kit').Handle} */
export async function handle({ event, resolve }) {
let page = '';
return resolve(event, {
transformPageChunk: ({ html, done }) => {
page += html;
if (done) {
return building ? minify(page, minification_options) : page;
}
}
});
}
```
请注意,当使用 `vit 预览` 测试网站的生成构建时,`预渲染` 为 `false`,因此要验证压缩结果,您需要直接检查构建的 HTML 文件。
# Additional resources
##
常见问题解答
请参阅[SvelteKit 常见问题解答](faq)以获取常见问题的解决方案和有用的技巧。
The [Svelte FAQ](../svelte/faq) 和 [`vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md) 也可能对那些库的问题有所帮助。
##
示例
我们编写并发布了一些不同的 SvelteKit 网站作为示例:
* [`سلتيف`](https://github.com/sveltejs/realworld) 包含一个示例博客网站
* [
黑客新闻克隆](https://github.com/sveltejs/sites/tree/master/sites/hn.svelte.dev)
* [
`https://svelte.dev`](https://github.com/sveltejs/svelte.dev)
SvelteKit 用户还在 GitHub 上发布了大量示例,在[#sveltekit](https://github.com/topics/sveltekit)和[#sveltekit-template](https://github.com/topics/sveltekit-template)主题下,以及[Svelte Society 网站](https://sveltesociety.dev/templates?category=sveltekit)上。请注意,这些示例尚未经过维护者的审核,可能不是最新的。
##
支持
您可以在[Discord](/chat)和[StackOverflow](https://stackoverflow.com/questions/tagged/sveltekit)上寻求帮助。请首先在 FAQ、Google 或另一个搜索引擎、问题跟踪器和 Discord 聊天历史中搜索与您问题相关的信息,以尊重他人的时间。提问的人比回答的人多,这样有助于让社区以可扩展的方式增长。
# Glossary
SvelteKit 的核心提供了一个高度可配置的渲染引擎。本节描述了在讨论渲染时使用的某些术语。上述文档中提供了设置这些选项的参考。
## CSR
客户端渲染(CSR)是使用 JavaScript 在网页浏览器中生成页面内容的过程。
在 SvelteKit 中,默认将使用客户端渲染,但您可以通过[在`csr = false`页面选项](page-options#csr)中关闭 JavaScript。
##
边缘
边缘渲染指的是在靠近用户的内容分发网络(CDN)中运行应用程序。边缘渲染允许页面请求和响应的传输距离更短,从而提高延迟。
##
补水
Svelte 组件存储一些状态,并在状态更新时更新 DOM。在 SSR 期间获取数据时,默认情况下 SvelteKit 会存储这些数据并将其与服务器端渲染的 HTML 一起传输到客户端。然后,组件可以使用这些数据在客户端初始化,而无需再次调用相同的 API 端点。Svelte 将检查 DOM 是否处于预期的状态,并在一个称为“水合”的过程中附加事件监听器。一旦组件完全水合,它们就可以像任何新创建的 Svelte 组件一样对其属性的变化做出反应。
在 SvelteKit 中,页面默认会进行激活,但您可以通过[使用`csr = false`页面选项](page-options#csr)关闭 JavaScript。
## ISR
增量静态再生(ISR)允许您在访客请求页面时生成网站上的静态页面,无需重新部署。这可能与拥有大量页面的[SSG](#SSG)网站相比减少构建时间。您可以使用[ISR 与`adapter-vercel`](adapter-vercel#Incremental-Static-Regeneration)进行。
## MPA
传统应用在服务器上渲染每个页面视图——例如用除 JavaScript 以外的语言编写的应用——通常被称为多页面应用(MPA)。
##
预渲染
预渲染意味着在构建时计算页面内容并保存 HTML 以供显示。这种方法与传统服务器端渲染页面具有相同的优点,但避免了为每位访客重新计算页面,因此随着访客数量的增加,几乎可以免费扩展。代价是构建过程更昂贵,预渲染内容只能通过构建和部署应用程序的新版本来更新。
并非所有页面都可以预渲染。基本规则是:要使内容可预渲染,任何两个直接访问该内容的用户必须从服务器获得相同的内容,并且页面不得包含[操作](form-actions)。请注意,只要所有用户都将看到相同的预渲染内容,您仍然可以预渲染基于页面参数加载的内容。
预渲染页面不仅限于静态内容。如果从客户端获取用户特定数据并渲染,您可以构建个性化页面。但这需要遵守上述讨论的缺点,即不进行服务器端渲染的内容将带来的不利影响。
在 SvelteKit 中,您可以通过[“`prerender`页面选项](page-options#prerender)”和[`prerender`配置](configuration#prerender)在`svelte.config.js`中控制预渲染。
## PWA
一个渐进式 Web 应用(PWA)是一个使用 Web API 和技术构建的应用,但其功能类似于移动或桌面应用。作为 PWA 提供的网站可以被安装,允许您在启动器、主屏幕或开始菜单中添加应用程序的快捷方式。许多 PWA 将利用[服务工作者](service-workers)来构建离线功能。
##
路由
默认情况下,当您导航到新页面(通过点击链接或使用浏览器的前进或后退按钮)时,SvelteKit 将拦截尝试的导航并处理它,而不是允许浏览器向服务器发送请求以获取目标页面。然后,SvelteKit 将通过渲染新页面的组件来更新客户端显示的内容,该组件随后可以调用必要的 API 端点。这种在尝试导航时对客户端页面进行更新的过程称为客户端路由。
在 SvelteKit 中,默认将使用客户端路由,但您可以使用[`data-sveltekit-reload`](link-options#data-sveltekit-reload)来跳过它。
## SPA
单页应用程序(SPA)是一种应用程序,其中所有对服务器的请求都加载单个 HTML 文件,然后根据请求的 URL 在客户端对请求的内容进行渲染。所有导航都在客户端通过称为客户端路由的过程处理,每页内容更新,而常见布局元素基本保持不变。SPA 不提供 SSR,因此性能和 SEO 特性较差。然而,一些应用程序受这些缺点的影响不大,例如登录后的复杂业务应用程序,其中 SEO 可能不是很重要,并且已知用户将从一致的计算环境中访问应用程序。
在 SvelteKit 中,您可以使用[adapter-static](single-page-apps)构建一个 SPA。
## SSG
静态站点生成(SSG)是指每个页面都预先渲染的网站。完全预先渲染站点的优点是您不需要维护或支付服务器以执行 SSR。一旦生成,网站可以从 CDN 提供服务,从而实现出色的“首次字节时间”性能。这种交付模式通常被称为 JAMstack。
在 SvelteKit 中,您可以通过使用`adapter-static`或通过配置每个页面使用`prerender`页面选项或`prerender`配置来预渲染,在`svelte.config.js`中实现静态站点生成。
## SSR
服务器端渲染(SSR)是在服务器上生成页面内容。SSR 通常更受 SEO 青睐。虽然一些搜索引擎可以索引客户端动态生成的内容,即使在这些情况下,也可能需要更长的时间。它还倾向于提高感知性能,并在 JavaScript 失败或禁用时使您的应用对用户可用(这种情况比您可能想象的要常见)。
在 SvelteKit 中,页面默认由服务器端渲染。您可以通过[在`ssr`页面选项](page-options#ssr)中禁用 SSR。
# @sveltejs/kit
```js
// @noErrors
import {
Server,
VERSION,
error,
fail,
isActionFailure,
isHttpError,
isRedirect,
json,
normalizeUrl,
redirect,
text
} from '@sveltejs/kit';
```
## Server
```dts
class Server {/*…*/}
```
```dts
constructor(manifest: SSRManifest);
```
```dts
init(options: ServerInitOptions): Promise
;
```
```dts
respond(request: Request, options: RequestOptions): Promise
;
```
## VERSION
```dts
const VERSION: string;
```
## error
Throws an error with a HTTP status code and an optional message.
When called during request handling, this will cause SvelteKit to
return an error response without invoking `handleError`.
Make sure you're not catching the thrown error, which would prevent SvelteKit from handling it.
```dts
function error(status: number, body: App.Error): never;
```
```dts
function error(
status: number,
body?: {
message: string;
} extends App.Error
? App.Error | string | undefined
: never
): never;
```
## fail
Create an `ActionFailure` object. Call when form submission fails.
```dts
function fail(status: number): ActionFailure;
```
```dts
function fail<
T extends Record | undefined = undefined
>(status: number, data: T): ActionFailure;
```
## isActionFailure
Checks whether this is an action failure thrown by `fail`.
```dts
function isActionFailure(e: unknown): e is ActionFailure;
```
## isHttpError
Checks whether this is an error thrown by `error`.
```dts
function isHttpError(
e: unknown,
status?: T | undefined
): e is HttpError_1 & {
status: T extends undefined ? never : T;
};
```
## isRedirect
Checks whether this is a redirect thrown by `redirect`.
```dts
function isRedirect(e: unknown): e is Redirect_1;
```
## json
Create a JSON `Response` object from the supplied data.
```dts
function json(
data: any,
init?: ResponseInit | undefined
): Response;
```
## normalizeUrl
Available since 2.18.0
Strips possible SvelteKit-internal suffixes and trailing slashes from the URL pathname.
Returns the normalized URL as well as a method for adding the potential suffix back
based on a new pathname (possibly including search) or URL.
```js
// @errors: 7031
import { normalizeUrl } from '@sveltejs/kit';
const { url, denormalize } = normalizeUrl('/blog/post/__data.json');
console.log(url.pathname); // /blog/post
console.log(denormalize('/blog/post/a')); // /blog/post/a/__data.json
```
```dts
function normalizeUrl(url: URL | string): {
url: URL;
wasNormalized: boolean;
denormalize: (url?: string | URL) => URL;
};
```
## redirect
Redirect a request. When called during request handling, SvelteKit will return a redirect response.
Make sure you're not catching the thrown redirect, which would prevent SvelteKit from handling it.
Most common status codes:
* `303 See Other`: redirect as a GET request (often used after a form POST request)
* `307 Temporary Redirect`: redirect will keep the request method
* `308 Permanent Redirect`: redirect will keep the request method, SEO will be transferred to the new page
[See all redirect status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages)
```dts
function redirect(
status:
| 300
| 301
| 302
| 303
| 304
| 305
| 306
| 307
| 308
| ({} & number),
location: string | URL
): never;
```
## text
Create a `Response` object from the supplied body.
```dts
function text(
body: string,
init?: ResponseInit | undefined
): Response;
```
## Action
Shape of a form action method that is part of `export const actions = {...}` in `+page.server.js`.
See [form actions](/docs/kit/form-actions) for more information.
```dts
type Action<
Params extends Partial
> = Partial<
Record
>,
OutputData extends Record | void = Record<
string,
any
> | void,
RouteId extends string | null = string | null
> = (
event: RequestEvent
) => MaybePromise;
```
## ActionFailure
```dts
interface ActionFailure<
T extends Record
| undefined = undefined
> {/*…*/}
```
```dts
status: number;
```
```dts
[uniqueSymbol]: true;
```
## ActionResult
When calling a form action via fetch, the response will be one of these shapes.
```svelte