为你的项目安装 zod
pnpm i zod
创建 env.ts
vue 项目中使用
提醒
我这里的 toast 是使用 shadcn-vue 组件库的提示插件,如果您的项目中使用其他的组件库,可以替换为您使用的组件库的提示插件。它只是为了全局提醒您的 env 变量某些部分与规定的类型不一致。
import { h } from 'vue' import { z } from 'zod' import { toast } from '@/components/ui/toast' /** * Load .env file and validate it against the schema * Has this file, it will be loaded automatically by vite and we will be have environment variables available type * If EnvSchema Object has Key but not in .env file, it will be have a error in page */ const EnvSchema = z.object({ // Add your environment variables here, for example: VITE_API_BASE_URL: z.string().url(), }) export type env = z.infer<typeof EnvSchema> const { data: env, error } = EnvSchema.safeParse(import.meta.env) if (error) { console.error('❌ Invalid env') console.error(error.flatten().fieldErrors) toast({ title: `Env error: you should check your .env file`, variant: 'destructive', description: h('pre', { class: 'mt-2 w-[340px] rounded-md bg-slate-950 p-4' }, h('code', { class: 'text-white' }, JSON.stringify(error, null, 2))), }) } export default env!
在 vue 入口文件引入它
import '@/utils/env'
有了这个文件后,如果您的环境变量中没有 VITE_API_BASE_URL
,就会全局提示一个错误,提醒您配置对应的环境变量。
node项目中使用
当然,它也可以运行至node 项目中,且可以在 env 变量与规定不一致时,退出程序
import { config } from "dotenv"; import { expand } from "dotenv-expand"; import { z } from "zod"; expand(config()); const EnvSchema = z.object({ NODE_ENV: z.string().default("development"), LOG_LEVEL: z.enum(["fatal", "error", "warn", "info", "debug", "trace", "silent"]), PORT: z.coerce.number().default(9999), // database DB_HOST: z.string(), DB_USER: z.string(), DB_PASSWORD: z.string(), DB_NAME: z.string(), DB_PORT: z.coerce.number(), DATABASE_URL: z.string(), // jwt ACCESS_TOKEN_SECRET: z.string(), REFRESH_TOKEN_SECRET: z.string(), COOKIE_SECRET: z.string(), }); export type env = z.infer<typeof EnvSchema>; const { data: env, error } = EnvSchema.safeParse(process.env); if (error) { console.error("❌ Invalid env"); console.error(error.flatten().fieldErrors); process.exit(1); } export default env!;
使用技巧
提醒
- 我们可以使用
.default()
来给它一个默认值,如NODE_ENV: z.string().default("development"),
就是在 NODE_ENV 没有设置时设置为 development - 在 node 端,使用
process.exit(1)
会在必填的环境变量没有时退出