全书目录

第三十篇:SvelteKit 完全指南 —— 轻量反应式剧场宇宙

第十三章:私密道具不能上前台 —— server-only 模块与环境变量

1 分钟 342 字 第 551 / 962 个阅读单元

因为 SvelteKit 同时写前端和后端,所以一个非常真实的危险是:

text
把数据库客户端、私钥、服务端秘密
顺手 import 到了会发给浏览器的代码里

SvelteKit 对这件事相当认真。

它提供两条主航道:

  • 把服务端专用模块放在 $lib/server
  • 或者给文件名加 .server.ts

例如:

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
});

然后:

ts
// 只允许服务端代码 import 这个模块
import { db } from '$lib/server/db';

如果你把它错误地从会发到浏览器的代码里间接引入,SvelteKit 会直接报错拦住你。

环境变量同理:

  • 私密变量用 $env/static/private$env/dynamic/private
  • 公开变量用 $env/static/public$env/dynamic/public
  • 默认只有 PUBLIC_ 前缀变量允许进客户端

简单说:

text
没有 PUBLIC_ 前缀的东西
默认就该待在后台道具间

这是 SvelteKit 很值得信任的一点:
它不只是“提醒你注意”,而是尽量从机制上防你泄密