跳到主要内容
Void

环境变量

在 env.ts 中声明环境变量,再通过 void/env 的 env 读取。本地值放在 .env,生产服务端值用 void secret put 设置。

预计阅读 3 分钟

定义 schema

在项目根目录创建 env.ts:

import { defineEnv, number, string, url } from 'void/env';

export default defineEnv({
  DATABASE_URL: url(),
  STRIPE_KEY: string(),
  PORT: number().default(3000),
  VITE_API_ORIGIN: url(),
});

在应用中导入带类型的 env 对象:

import { env } from 'void/env';

const databaseUrl = env.DATABASE_URL;

内置的辅助函数有 string()、number()、boolean()、url()、email()、oneOf([...]) 与 json<T>()。它们都支持 .optional() 与 .default(value)。任何 Standard Schema 校验器也可以直接使用。

本地开发

把本地值放在项目根目录的单个 .env 文件中:

DATABASE_URL=postgres://localhost/my-app
STRIPE_KEY=sk_test_example
VITE_API_ORIGIN=http://localhost:5173

请把 .env 排除在 Git 之外。其他 dotenv 文件,包括 .env.local、.env.production、.env.example 以及 Wrangler 的 .dev.vars*,都不受支持。

以 __VOID_ 开头的名称为 Void 保留。如果 .env 或 env.ts 定义了这类名称,Void 会直接报错退出。

随时可以运行本地检查:

void env check

本地数据库、迁移、认证与开发服务器工具都读取同一个 .env 文件。Shell 中的环境变量优先级更高。

生产服务端值

Schema 中每个不是客户端前缀的 key 都是服务端值。在远端设置它们:

void secret put DATABASE_URL
void secret put STRIPE_KEY

批量上传时,准备一个只包含生产服务端值的 dotenv 格式文件:

void secret sync production-secrets.txt

Secret 命令在上传前会用 env.ts 校验取值。生产值会被加密,并在 Worker 启动时再次校验。

带客户端前缀的 key 会被 secret 命令拒绝。请把本地开发凭据与 VITE_* 值排除在生产密钥文件之外。

void deploy 要求每个必填的服务端 key 在远端都存在。它绝不会上传 .env 中的值。

直接部署到 Cloudflare 时使用同样的 secret 命令。Schema 中声明的服务端值必须是 Worker secret,而不是明文变量。

客户端值

以 VITE_ 开头的 key 是客户端值,即使你的框架自定义了 Vite 的 envPrefix 也是如此。

客户端值会被内联进浏览器 JavaScript,因此永远不是密钥。通过构建时的 shell 提供,或在 schema 中给出默认值:

VITE_API_ORIGIN=https://api.example.com void deploy
export default defineEnv({
  VITE_API_ORIGIN: url().default('https://api.example.com'),
});

服务端渲染使用与浏览器相同的公开构建值。

校验与脱敏

void env check              # 为本地开发校验 .env 与 shell
void env check --remote     # 校验构建期客户端值与远端服务端名称
void env types              # 重新生成 .void/env.d.ts

无效值的诊断信息默认会对取值脱敏。只有在有意进行本地调试时才设置 VOID_ENV_UNMASK=1;关闭脱敏时 Void 会打印一条提示。

env.ts 中的导入

在 env.ts 内部使用相对导入或包名。TypeScript 路径别名以及需要 Vite 变换的导入不受支持。

目录