一个现代化的全栈模板,集成了 SvelteKit、Cloudflare Workers、Prisma ORM 和 Tailwind CSS,用于快速构建高性能的全栈应用。
# 克隆模板
git clone <template-url> my-app
cd my-app
# 安装依赖
pnpm install
编辑 wrangler.jsonc,设置你的数据库 ID:
{
"d1_databases": [
{
"binding": "DB",
"database_name": "sveltekit_template",
"database_id": "<YOUR_DATABASE_ID>",
"preview_database_id": "<YOUR_PREVIEW_DATABASE_ID>"
}
]
}
获取数据库 ID 的步骤:
# 创建 D1 数据库
wrangler d1 create sveltekit_template
# 查看已创建的数据库
wrangler d1 list
# 生成初始迁移文件
pnpm run db:init
# 本地执行迁移
pnpm run db:local
# 远程执行迁移(生产环境)
pnpm run db:remote
pnpm run dev
访问 http://localhost:5173 查看你的应用。
.
├── src/
│ ├── routes/ # SvelteKit 路由
│ ├── lib/
│ │ ├── components/ # Svelte 组件
│ │ ├── generated/ # 生成的代码(Prisma、Paraglide)
│ │ ├── utils.ts # 工具函数
│ │ ├── prisma.ts # Prisma 客户端初始化
│ │ └── paraglide/ # 国际化配置
│ ├── hooks.server.ts # 服务器钩子
│ ├── app.html # HTML 模板
│ └── app.css # 全局样式
├── prisma/
│ ├── schema.prisma # 数据库 Schema
│ └── dev.db # 本地开发数据库(SQLite)
├── migrations/ # 数据库迁移脚本
├── public/ # 静态资源
├── package.json # 项目依赖
├── svelte.config.js # SvelteKit 配置
├── vite.config.ts # Vite 配置
├── wrangler.jsonc # Cloudflare Workers 配置
└── tailwind.config.ts # Tailwind CSS 配置
# 启动开发服务器
pnpm run dev
# 构建生产版本
pnpm run build
# 预览构建结果
pnpm run preview
# 代码检查
pnpm run check
pnpm run check:watch
# 代码检查和修复
pnpm run lint
# 生成 Prisma 类型
pnpm run db:types
# 初始化数据库迁移
pnpm run db:init
# 本地执行数据库迁移
pnpm run db:local
# 远程执行数据库迁移
pnpm run db:remote
编辑 prisma/schema.prisma:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String
userId Int
createdAt DateTime @default(now())
}
# 修改 schema 后,生成迁移脚本
pnpm run db:init
在 +server.ts 或其他服务器文件中:
import type { RequestHandler } from "@sveltejs/kit";
import { getPrismaClient } from "$lib/prisma";
export const GET: RequestHandler = async ({ platform }) => {
const prisma = getPrismaClient(platform!.env);
const users = await prisma.user.findMany();
return Response.json(users);
};
利用 SvelteKit 的 load 函数从 API 获取数据:
// src/routes/+page.ts
import type { PageLoad } from "./$types";
export const load: PageLoad = async ({ fetch }) => {
const response = await fetch("/api/users");
const users = await response.json();
return { users };
};
然后在页面中使用:
<!-- src/routes/+page.svelte -->
<script lang="ts">
import type { PageData } from './$types';
export let data: PageData;
</script>
<h1>Users</h1>
<ul>
{#each data.users as user (user.id)}
<li>{user.name} ({user.email})</li>
{/each}
</ul>
项目使用 Paraglide JS 实现国际化,支持多语言。
语言翻译文件位于 messages/ 目录:
messages/
├── en.json # 英文
├── es.json # 西班牙文
└── zh.json # 中文
示例 messages/en.json:
{
"greeting": "Hello, {name}!",
"welcome": "Welcome to our app"
}
<script>
import * as m from '$lib/paraglide/messages';
</script>
<h1>{m.greeting({ name: 'John' })}</h1>
<p>{m.welcome()}</p>
import { getLanguageTag } from "$lib/paraglide/runtime";
const currentLang = getLanguageTag(); // 'en', 'es', 'zh'
项目使用 Bits UI 提供无样式的可访问组件,你可以根据需要自定义样式。
src/lib/components/ui/accordion/src/lib/components/ui/avatar/src/lib/components/ui/aspect-ratio/<script>
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '$lib/components/ui/accordion';
</script>
<Accordion>
<AccordionItem value="item-1">
<AccordionTrigger>Section 1</AccordionTrigger>
<AccordionContent>Content for section 1</AccordionContent>
</AccordionItem>
</Accordion>
# 构建项目
pnpm run build
# 部署到 Cloudflare
wrangler deploy
wrangler.jsonc 中设置正确的数据库 IDpnpm run check 检查代码pnpm run build 构建生产版本创建 .env.local 文件(本地开发):
# 仅在需要时添加敏感信息
# 大部分配置应在 wrangler.jsonc 中进行
在 wrangler.jsonc 中定义变量:
{
"vars": {
"API_URL": "https://api.example.com",
"APP_NAME": "My App"
}
}
在代码中访问环境变量:
export const load = async ({ platform }) => {
const apiUrl = platform?.env.API_URL;
return { apiUrl };
};
创建 src/routes/api/users/+server.ts:
import type { RequestHandler } from "@sveltejs/kit";
import { getPrismaClient } from "$lib/prisma";
import { json } from "@sveltejs/kit";
export const GET: RequestHandler = async ({ platform }) => {
const prisma = getPrismaClient(platform!.env);
const users = await prisma.user.findMany();
return json(users);
};
export const POST: RequestHandler = async ({ request, platform }) => {
const prisma = getPrismaClient(platform!.env);
const data = await request.json();
const user = await prisma.user.create({
data: {
email: data.email,
name: data.name,
posts: data.posts || "",
},
});
return json(user, { status: 201 });
};
# 运行 svelte-check 进行类型检查
pnpm run check
# 监听模式下进行类型检查
pnpm run check:watch
| 包名 | 版本 | 用途 |
|---|---|---|
@sveltejs/kit |
^2.48.5 | SvelteKit 框架 |
svelte |
^5.43.8 | Svelte 组件框架 |
@sveltejs/adapter-cloudflare |
^7.2.4 | Cloudflare 适配器 |
prisma |
^6.19.0 | ORM 工具 |
@prisma/client |
^6.19.0 | Prisma 客户端 |
@prisma/adapter-d1 |
^6.19.0 | Cloudflare D1 适配器 |
tailwindcss |
^4.1.17 | CSS 框架 |
@inlang/paraglide-js |
^2.5.0 | 国际化库 |
bits-ui |
^2.14.3 | 组件库 |
wrangler |
^4.47.0 | Cloudflare CLI |
A: 编辑 prisma/schema.prisma,添加新的 model,然后运行 pnpm run db:init 生成迁移脚本。
A: 如果迁移脚本有冲突,手动编辑 migrations/ 目录中的 SQL 文件,确保语法正确,然后重新执行迁移。
A: 运行 pnpm run dev 时,Wrangler 会自动在本地启动 D1 模拟器。数据存储在 .wrangler/ 目录中。
A: 在 <script lang="ts"> 标签中编写代码,SvelteKit 会自动支持 TypeScript。
A: 在 messages/ 目录中创建新的语言文件(例如 fr.json),按照已有文件的结构填写翻译内容。Paraglide 会自动识别。
MIT
欢迎提交 Issue 和 Pull Request!
提示:这是一个模板项目,请根据你的需求进行自定义和扩展。