跳至主要内容

构建和部署

Netlify

在 GitHub 上编辑此页面

要部署到 Netlify,请使用 adapter-netlify

当你使用 adapter-auto 时,此适配器将默认安装,但将其添加到你的项目中允许你指定特定于 Netlify 的选项。

用法

使用 npm i -D @sveltejs/adapter-netlify 安装,然后将适配器添加到你的 svelte.config.js

svelte.config.js
ts
import adapter from '@sveltejs/adapter-netlify';
Cannot find module '@sveltejs/adapter-netlify' or its corresponding type declarations.2307Cannot find module '@sveltejs/adapter-netlify' or its corresponding type declarations.
export default {
kit: {
// default options are shown
adapter: adapter({
// if true, will create a Netlify Edge Function rather
// than using standard Node-based functions
edge: false,
// if true, will split your app into multiple functions
// instead of creating a single one for the entire app.
// if `edge` is true, this option cannot be used
split: false
})
}
};

然后,确保你在项目根目录中有一个 netlify.toml 文件。这将根据 build.publish 设置确定静态资源的写入位置,如下面的示例配置所示

[build]
	command = "npm run build"
	publish = "build"

如果 netlify.toml 文件或 build.publish 值缺失,将使用默认值 "build"。请注意,如果你在 Netlify UI 中将发布目录设置为了其他内容,那么你也需要在 netlify.toml 中进行设置,或使用默认值 "build"

Node 版本

新项目将默认使用当前 Node LTS 版本。但是,如果你要升级一个你很久之前创建的项目,它可能停留在较旧的版本上。请参阅 Netlify 文档,了解有关手动指定当前 Node 版本的详细信息。

Netlify Edge 函数

SvelteKit 支持 Netlify Edge 函数。如果你将选项 edge: true 传递给 adapter 函数,服务器端渲染将在部署在接近网站访问者的基于 Deno 的 edge 函数中发生。如果设置为 false(默认值),网站将部署到基于 Node 的 Netlify 函数。

svelte.config.js
ts
import adapter from '@sveltejs/adapter-netlify';
Cannot find module '@sveltejs/adapter-netlify' or its corresponding type declarations.2307Cannot find module '@sveltejs/adapter-netlify' or its corresponding type declarations.
export default {
kit: {
adapter: adapter({
// will create a Netlify Edge Function using Deno-based
// rather than using standard Node-based functions
edge: true
})
}
};

Netlify SvelteKit 功能的替代方案

你可以使用 SvelteKit 直接提供的功能来构建你的应用,而不依赖于任何 Netlify 功能。使用 SvelteKit 版本的这些功能将允许它们在开发模式下使用,通过集成测试进行测试,并且在将来决定从 Netlify 切换时与其他适配器一起使用。但是,在某些情况下,你可能会发现使用 Netlify 版本的这些功能很有用。一个例子是,如果你正在将一个已经托管在 Netlify 上的应用迁移到 SvelteKit。

重定向规则

在编译期间,重定向规则会自动附加到您的 _redirects 文件中。(如果该文件不存在,则会创建。)这意味着

  • netlify.toml 中的 [[redirects]] 永远不会匹配,因为 _redirects 具有 更高的优先级。因此,请始终将您的规则放入 _redirects 文件 中。
  • _redirects 不应有任何自定义“全部捕获”规则,例如 /* /foobar/:splat。否则,自动附加的规则将永远不会应用,因为 Netlify 仅处理 第一个匹配的规则

Netlify 表单

  1. 按照 此处的说明创建您的 Netlify HTML 表单,例如 /routes/contact/+page.svelte。(别忘了添加隐藏的 form-name 输入元素!)
  2. Netlify 的构建机器人会在部署时解析您的 HTML 文件,这意味着您的表单必须以 HTML 形式 预渲染。您可以将 export const prerender = true 添加到您的 contact.svelte 中,以仅预渲染该页面,或设置 kit.prerender.force: true 选项以预渲染所有页面。
  3. 如果您的 Netlify 表单具有 自定义成功消息,例如 <form netlify ... action="/success">,则确保相应的 /routes/success/+page.svelte 存在且已预渲染。

Netlify 函数

使用此适配器,SvelteKit 端点将作为 Netlify 函数 托管。Netlify 函数处理程序具有附加上下文,包括 Netlify Identity 信息。您可以在钩子和 +page.server+layout.server 端点中通过 event.platform.context 字段访问此上下文。当适配器配置中的 edge 属性为 false 时,这些是 无服务器函数,当该属性为 true 时,这些是 边缘函数

+page.server.js
ts
export const load = async (event) => {
Parameter 'event' implicitly has an 'any' type.7006Parameter 'event' implicitly has an 'any' type.
const context = event.platform.context;
console.log(context); // shows up in your functions log in the Netlify app
};
+page.server.ts
ts
export const load = async (event) => {
Parameter 'event' implicitly has an 'any' type.7006Parameter 'event' implicitly has an 'any' type.
const context = event.platform.context;
console.log(context); // shows up in your functions log in the Netlify app
};

此外,您还可以通过为它们创建一个目录并在 netlify.toml 文件中添加配置来添加自己的 Netlify 函数。例如

[build]
	command = "npm run build"
	publish = "build"

[functions]
	directory = "functions"

故障排除

访问文件系统

您无法在边缘部署中使用 fs

可以在无服务器部署中使用它,但它无法按预期工作,因为文件不会从您的项目复制到您的部署中。相反,使用 $app/server 中的 read 函数来访问您的文件。read 在边缘部署中不起作用(这可能会在未来发生改变)。

或者,您可以预渲染相关路由。

下一个 Vercel