因为 SvelteKit 同时写前端和后端,所以一个非常真实的危险是:
把数据库客户端、私钥、服务端秘密
顺手 import 到了会发给浏览器的代码里SvelteKit 对这件事相当认真。
它提供两条主航道:
- 把服务端专用模块放在
$lib/server - 或者给文件名加
.server.ts
例如:
// src/lib/server/db.ts
import { DATABASE_URL } from '$env/static/private';
import { PrismaClient } from '@prisma/client';
export const db = new PrismaClient({
datasourceUrl: DATABASE_URL
});然后:
// 只允许服务端代码 import 这个模块
import { db } from '$lib/server/db';如果你把它错误地从会发到浏览器的代码里间接引入,SvelteKit 会直接报错拦住你。
环境变量同理:
- 私密变量用
$env/static/private或$env/dynamic/private - 公开变量用
$env/static/public或$env/dynamic/public - 默认只有
PUBLIC_前缀变量允许进客户端
简单说:
没有 PUBLIC_ 前缀的东西
默认就该待在后台道具间这是 SvelteKit 很值得信任的一点:
它不只是“提醒你注意”,而是尽量从机制上防你泄密。