找回密码
 立即注册
首页 业界区 安全 SvelteKit 最新中文文档教程(9)—— 部署静态站点与单 ...

SvelteKit 最新中文文档教程(9)—— 部署静态站点与单页应用

莠畅缕 2025-6-1 20:32:00
前言

Svelte,一个语法简洁、入门容易,面向未来的前端框架。
从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1
1.png

Svelte 以其独特的编译时优化机制著称,具有轻量级高性能易上手等特性,非常适合构建轻量级 Web 项目
为了帮助大家学习 Svelte,我同时搭建了 Svelte 最新的中文文档站点。
如果需要进阶学习,也可以入手我的小册《Svelte 开发指南》,语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!
欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。
静态站点生成

要将 SvelteKit 用作静态站点生成器(SSG),请使用 adapter-static。
这将把您的整个站点预渲染为静态文件集合。如果您想只预渲染某些页面而动态渲染其他页面,您需要使用不同的适配器,并结合prerender 选项。
使用方法

通过 npm i -D @sveltejs/adapter-static 安装,然后将适配器添加到您的 svelte.config.js 中:
  1. // @errors: 2307
  2. /// file: svelte.config.js
  3. import adapter from '@sveltejs/adapter-static';
  4. export default {
  5.         kit: {
  6.                 adapter: adapter({
  7.                         // 显示默认选项。在某些平台上
  8.                         // 这些选项会自动设置 — 见下文
  9.                         pages: 'build',
  10.                         assets: 'build',
  11.                         fallback: undefined,
  12.                         precompress: false,
  13.                         strict: true
  14.                 })
  15.         }
  16. };
复制代码
...并在根布局中添加 prerender 选项:
  1. /// file: src/routes/+layout.js
  2. // 如果您使用 fallback(即 SPA 模式),这可以设为 false
  3. export const prerender = true;
复制代码
[!NOTE] 您必须确保 SvelteKit 的 trailingSlash 选项适合您的环境。如果您的主机在收到 /a 的请求时不渲染 /a.html,那么您需要在根布局中设置 trailingSlash: 'always' 以创建 /a/index.html。
零配置支持

部分平台已支持零配置(未来将支持更多):

  • Vercel
在这些平台上,您应该省略适配器选项,以便 adapter-static 可以提供最佳配置:
  1. // @errors: 2304
  2. /// file: svelte.config.js
  3. export default {
  4.         kit: {
  5.                 adapter: adapter(---{...}---)
  6.         }
  7. };
复制代码
选项

pages

预渲染页面的写入目录。默认为 build。
assets

写入静态资源(包括 static 的内容,以及 SvelteKit 生成的客户端 JS 和 CSS)的目录。通常这应该与 pages 相同,它会默认使用 pages 的值,但在极少数情况下,您可能需要将页面和资源输出到不同的位置。
fallback

为 SPA 模式 指定一个后备页面,例如 index.html 或 200.html 或 404.html。
precompress

如果为 true,则使用 brotli 和 gzip 预压缩文件。这将生成 .br 和 .gz 文件。
strict

默认情况下,adapter-static 会检查您的应用的所有页面和端点(如果有)是否都已预渲染,或者您是否设置了 fallback 选项。这个检查的存在是为了防止您意外发布一个部分内容无法访问的应用,因为这些内容不包含在最终输出中。如果您知道这是可以的(例如当某个页面只在特定条件下存在时),您可以将 strict 设置为 false 来关闭这个检查。
GitHub Pages

在为 GitHub Pages 构建时,如果您的仓库名称不等同于 your-username.github.io,请确保更新 config.kit.paths.base 以匹配您的仓库名称。这是因为站点将从 https://your-username.github.io/your-repo-name 而不是根目录提供服务。
您还需要生成一个后备 404.html 页面来替换 GitHub Pages 显示的默认 404 页面。
GitHub Pages 的配置可能如下所示:
  1. // @errors: 2307 2322
  2. /// file: svelte.config.js
  3. import adapter from '@sveltejs/adapter-static';
  4. /** @type {import('@sveltejs/kit').Config} */
  5. const config = {
  6.         kit: {
  7.                 adapter: adapter({
  8.                         fallback: '404.html'
  9.                 }),
  10.                 paths: {
  11.                         base: process.argv.includes('dev') ? '' : process.env.BASE_PATH
  12.                 }
  13.         }
  14. };
  15. export default config;
复制代码
您可以使用 GitHub actions 在进行更改时自动将您的站点部署到 GitHub Pages。以下是一个工作流示例:
  1. ### file: .github/workflows/deploy.yml
  2. name: Deploy to GitHub Pages
  3. on:
  4.   push:
  5.     branches: 'main'
  6. jobs:
  7.   build_site:
  8.     runs-on: ubuntu-latest
  9.     steps:
  10.       - name: Checkout
  11.         uses: actions/checkout@v4
  12.       # 如果您使用 pnpm,添加此步骤然后更改下面的命令和缓存键以使用 `pnpm`
  13.       # - name: Install pnpm
  14.       #   uses: pnpm/action-setup@v3
  15.       #   with:
  16.       #     version: 8
  17.       - name: Install Node.js
  18.         uses: actions/setup-node@v4
  19.         with:
  20.           node-version: 20
  21.           cache: npm
  22.       - name: Install dependencies
  23.         run: npm install
  24.       - name: build
  25.         env:
  26.           BASE_PATH: '/${{ github.event.repository.name }}'
  27.         run: |
  28.           npm run build
  29.       - name: Upload Artifacts
  30.         uses: actions/upload-pages-artifact@v3
  31.         with:
  32.           # 这应该与适配器静态选项中的 `pages` 选项匹配
  33.           path: 'build/'
  34.   deploy:
  35.     needs: build_site
  36.     runs-on: ubuntu-latest
  37.     permissions:
  38.       pages: write
  39.       id-token: write
  40.     environment:
  41.       name: github-pages
  42.       url: ${{ steps.deployment.outputs.page_url }}
  43.     steps:
  44.       - name: Deploy
  45.         id: deployment
  46.         uses: actions/deploy-pages@v4
复制代码
如果您不使用 GitHub actions 部署您的站点(例如,您将构建的站点推送到它自己的仓库),请在您的 static 目录中添加一个空的 .nojekyll 文件,以防止 Jekyll 干扰。
单页应用

通过在根布局中禁用 SSR,您可以将使用任何适配器的任何 SvelteKit 应用转换为完全客户端渲染的单页应用(SPA):
  1. /// file: src/routes/+layout.js
  2. export const ssr = false;
复制代码
[!NOTE] 在大多数情况下不推荐这样做:它会损害 SEO,往往会降低感知性能,并且如果 JavaScript 失败或被禁用(这种情况发生的频率可能比您想象的要高),会使您的应用对用户不可访问。
如果您没有任何服务端逻辑(即没有 +page.server.js、+layout.server.js 或 +server.js 文件),您可以使用 adapter-static 通过添加一个后备页面来创建您的 SPA。
用法

使用 npm i -D @sveltejs/adapter-static 安装,然后在您的 svelte.config.js 中添加适配器,并使用以下选项:
  1. // @errors: 2307
  2. /// file: svelte.config.js
  3. import adapter from '@sveltejs/adapter-static';
  4. export default {
  5.         kit: {
  6.                 adapter: adapter({
  7.                         fallback: '200.html' // 可能因主机而异
  8.                 })
  9.         }
  10. };
复制代码
fallback 页面是 SvelteKit 根据您的页面模板(例如 app.html)创建的 HTML 页面,用于加载您的应用并导航到正确的路由。例如静态网站托管服务 Surge,允许您添加一个 200.html 文件,用于处理任何不对应于静态资源或预渲染页面的请求。
在某些主机上,它可能是 index.html 或完全不同的名称 — 请查阅您的平台文档。
[!NOTE] 请注意,无论 paths.relative 的值如何,后备页面将始终包含绝对资源路径(即以 / 而不是 . 开头),因为它用于响应任意路径的请求。
Apache

要在 Apache 上运行 SPA,您应该添加一个 static/.htaccess 文件,将请求路由到后备页面:
  1. <IfModule mod_rewrite.c>
  2.         RewriteEngine On
  3.         RewriteBase /
  4.         RewriteRule ^200\.html$ - [L]
  5.         RewriteCond %{REQUEST_FILENAME} !-f
  6.         RewriteCond %{REQUEST_FILENAME} !-d
  7.         RewriteRule . /200.html [L]
  8. </IfModule>
复制代码
预渲染单个页面

如果您想预渲染特定页面,您可以仅对应用的这些部分重新启用 ssr 和 prerender:
  1. /// file: src/routes/my-prerendered-page/+page.js
  2. export const prerender = true;
  3. export const ssr = true;
复制代码
Svelte 中文文档

点击查看中文文档:

  • SvelteKit Node 服务端
  • SvelteKit 单页应用
系统学习 Svelte,欢迎入手小册《Svelte 开发指南》。语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!
此外我还写过 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答读者问等 14 个系列文章, 全系列文章目录:https://github.com/mqyqingfeng/Blog
欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册