要部署到 Netlify,请使用[`adapter-netlify`](https://github.com/sveltejs/kit/tree/main/packages/adapter-netlify)。 此适配器将在您使用[`adapter-auto`](adapter-auto)时默认安装,但将其添加到您的项目中允许您指定 Netlify 特定的选项。 ## 使用 安装 `npm i -D @sveltejs/adapter-netlify` 后,将适配器添加到您的`svelte.config.js`中: ```js // @errors: 2307 /// file: svelte.config.js import adapter from '@sveltejs/adapter-netlify'; 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](https://docs.netlify.com/configure-builds/file-based-configuration) 文件。这将根据 `build.publish` 设置确定静态资源的位置,如本示例配置所示: ```toml [build] command = "npm run build" publish = "build" ``` 如果`netlify.toml`文件或`build.publish`值缺失,将使用默认值`"build"`。请注意,如果您已在 Netlify UI 中将发布目录设置为其他内容,那么您也需要在`netlify.toml`中设置它,或者使用默认值`"build"`。 ### 节点版本 新项目将默认使用当前 Node LTS 版本。然而,如果您升级的是您很久以前创建的项目,它可能卡在较旧版本上。请参阅[Netlify 文档](https://docs.netlify.com/configure-builds/manage-dependencies/#node-js-and-javascript)以获取有关手动指定当前 Node 版本的详细信息。 ## Netlify Edge Functions SvelteKit 支持 [Netlify Edge Functions](https://docs.netlify.com/netlify-labs/experimental-features/edge-functions/)。如果您将选项 `edge: true` 传递给 `adapter` 函数,服务器端渲染将在部署在接近网站访客的基于 Deno 的边缘函数中发生。如果设置为 `false`(默认值),网站将部署到基于 Node 的 Netlify Functions。 ```js // @errors: 2307 /// file: svelte.config.js import adapter from '@sveltejs/adapter-netlify'; 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。 ### `_headers` 和 `_redirects` The [`_headers`](https://docs.netlify.com/routing/headers/#syntax-for-the-headers-file) 和 [`_redirects`](https://docs.netlify.com/routing/redirects/redirect-options/) 文件是针对 Netlify 的,可以将它们放入项目根目录以用于静态资源响应(如图片)。 ### 重定向规则 在编译过程中,重定向规则会自动添加到您的 `_redirects` 文件中。(如果尚不存在,则会创建。)这意味着: * `[[重定向]]` 在 `netlify.toml` 中永远不会与 `_redirects` 匹配,因为 [优先级更高](https://docs.netlify.com/routing/redirects/#rule-processing-order)。所以请始终将您的规则放在 [`_redirects` 文件](https://docs.netlify.com/routing/redirects/#syntax-for-the-redirects-file) 中。 * `_redirects` 不应包含任何自定义的 "catch all" 规则,例如 `/* /foobar/:splat`。否则,自动附加的规则将永远不会被应用,因为 Netlify 只处理 [第一个匹配的规则](https://docs.netlify.com/routing/redirects/#rule-processing-order)。 ### Netlify 表单 1. 创建您的 Netlify HTML 表单,如[此处](https://docs.netlify.com/forms/setup/#html-forms)所述,例如:`/routes/contact/+page.svelte`。(别忘了添加隐藏的`form-name`输入元素!) 2. Netlify 的构建机器人会在部署时解析您的 HTML 文件,这意味着您的表单必须作为 HTML 进行[预渲染](page-options#prerender)。您可以选择将`export const prerender = true`添加到您的`contact.svelte`中,以仅预渲染该页面,或者设置`kit.prerender.force: true`选项以预渲染所有页面。 3. 如果您 Netlify 表单有一个[自定义成功消息](https://docs.netlify.com/forms/setup/#success-messages)如 `
` ,那么请确保相应的`/routes/success/+page.svelte`存在并且已预渲染。 ### Netlify 函数 使用此适配器,SvelteKit 端点作为[Netlify Functions](https://docs.netlify.com/functions/overview/)托管。Netlify 函数处理程序具有额外的上下文,包括[Netlify Identity](https://docs.netlify.com/visitor-access/identity/)信息。您可以通过在您的钩子中的`event.platform.context`字段或`+page.server`或`+layout.server`端点中访问此上下文。当适配器配置中的`edge`属性为`false`时,这些是[无服务器函数](https://docs.netlify.com/functions/overview/);当它为`true`时,则是[边缘函数](https://docs.netlify.com/edge-functions/overview/#app)。 ```js // @errors: 2705 7006 /// file: +page.server.js export const load = async (event) => { const context = event.platform.context; console.log(context); // shows up in your functions log in the Netlify app }; ``` 另外,您可以通过创建目录并为它们添加配置到您的 `netlify.toml` 文件中来添加自己的 Netlify 函数。例如: ```toml [build] command = "npm run build" publish = "build" [functions] directory = "functions" ``` ## 故障排除 ### 访问文件系统 您不能在边缘部署中使用`fs`。 您可以使用它进行无服务器部署,但由于文件没有从您的项目复制到您的部署中,它可能不会按预期工作。相反,请使用来自 `$app/server` 的 [`read`]($app-server#read) 函数来访问您的文件。`read` 在边缘部署中不起作用(这可能在将来改变)。 或者,您也可以[预渲染](page-options#prerender)相关的路由。