Vite 环境变量为什么不会自动暴露给客户端
Vite 环境变量不会“自动全部暴露”给客户端,通常是因为变量名没有使用默认的 VITE_ 前缀。比如 VITE_PUBLIC_API_URL 可以通过 import.meta.env.VITE_PUBLIC_API_URL 读取,而 DB_PASSWORD 默认不会进入客户端代码。这个限制不是故障,而是 Vite 用来避免把服务端配置误打进前端包的一道边界。
- 先查变量名前缀,再查当前命令对应的 mode 和 env 文件。
envPrefix可以自定义暴露前缀,但扩大范围也会扩大泄露面。- 数据库密码、私钥、内部 Token 不应靠改前缀传给浏览器,应留在服务端。
先确认 Vite 只筛选带 VITE_ 的变量
排查时先不要修改配置,直接把“文件里存在”和“客户端可见”分开。Vite 会把符合前缀规则的值提供给 import.meta.env,并且环境变量按字符串处理;变量名没有 VITE_,在前端读取时得到 undefined 是预期结果。
| 变量 | 客户端默认结果 | 适合放什么 |
|---|---|---|
VITE_PUBLIC_API_URL | 可见,值为字符串 | 公开 API 地址、功能开关 |
DB_PASSWORD | 不可见 | 服务端数据库凭证 |
APP_MODE | 不可见 | 只给构建脚本或服务端使用的配置 |
// 只读取允许进入客户端的公开配置 const apiUrl = import.meta.env.VITE_PUBLIC_API_URL const dbPassword = import.meta.env.DB_PASSWORD console.log(apiUrl) // 公开地址,仍然是字符串 console.log(dbPassword) // undefined:默认前缀筛选不会暴露它

再核对 .env 文件与 mode 是否对应
如果变量已经带了 VITE_ 仍然读不到,第二层通常是文件或模式不匹配。Vite 默认在开发命令使用 development mode,构建命令使用 production mode;因此 .env.development 不会替代所有环境的 .env,vite build --mode staging 则会寻找 .env.staging。
- 确认变量位于项目实际的 env 目录,而不是误放在父目录。
- 确认执行命令的 mode,例如
vite --mode staging或vite build --mode staging。 - 修改
.env*后重启开发服务器,避免旧进程继续使用已加载的值。
还要注意优先级:命令行中已经存在的环境变量可能覆盖 env 文件中的同名值。遇到“文件写了新地址但页面还是旧地址”,先检查启动命令和 shell 环境,再怀疑 Vite 没有加载。
检查 envPrefix 是否被自定义
Vite 配置支持 envPrefix。一旦项目把默认的 VITE_ 改成其他前缀,排查重点就从“有没有 VITE_”变成“当前配置到底允许哪些前缀”。配置可以是字符串,也可以是字符串数组;这项设置不是读取服务端秘密的开关,而是定义哪些名字会进入客户端代码。
import { defineConfig } from 'vite'
export default defineConfig({
// 只增加业务公开配置的前缀,不要把 SECRET_ 纳入其中
envPrefix: ['VITE_', 'PUBLIC_']
})
建议全项目搜索 envPrefix,确认没有在多个配置文件或不同 mode 分支中产生不同结果。尤其不要为了让变量“能读到”就写一个过宽的前缀;前缀匹配到的值会随客户端构建产物一起发布。

把服务器秘密移出客户端代码
如果浏览器确实需要调用某个服务,应该只暴露公开地址或短期、受权限控制的业务结果。数据库密码、私钥、内部服务 Token 等不能通过改成 VITE_DB_PASSWORD 来“解决读取问题”,因为这样做只是把秘密从未定义变成可被用户查看。
更稳妥的结构是:浏览器读取 VITE_PUBLIC_API_URL,请求后端接口;后端在服务器环境读取 DB_PASSWORD,完成数据库操作后只返回必要数据。发布前还可以对构建产物执行一次关键词搜索,检查是否出现不应公开的变量名或值。搜索结果为空不能替代密钥轮换和权限控制,但能及时发现明显的命名错误。
- 读不到变量:先看前缀。
- 前缀正确仍为空:看 mode、文件位置和重启。
- 为了读到秘密而放宽前缀:停止修改,改用服务端接口。
常见问题
为什么 .env 里写了 VITE_API_URL,代码还是 undefined?
检查是否写成了 VITE_API_URL = value 这类带多余空格的格式、文件是否位于当前项目的 env 目录、启动命令是否使用了另一个 mode,并在改动后重启 Vite。
Vite 环境变量为什么都是字符串?
Vite 将读取到的自定义环境变量以字符串提供。数字、布尔值和 JSON 需要在业务代码中显式转换,并处理空值和格式错误。
能不能把 envPrefix 设置成空字符串?
不要这样做。过宽的前缀会让更多环境变量进入客户端构建结果,增加凭证泄露风险;应为公开配置设置清晰、专用的前缀。
Go reflect.ValueOf(nil).IsValid 为什么是 false
- 上一篇
- Go reflect.ValueOf(nil).IsValid 为什么是 false
- 下一篇
- Go 怎么用 httptest.ResponseRecorder 检查响应头和写入状态
-
- 文章 · 前端 | 1小时前 | typescript · 类型系统 · 事件映射 · TypeScript 模板字面量类型 事件名
- TypeScript 模板字面量类型怎么约束事件名
- 247浏览 收藏
-
- 文章 · 前端 | 3小时前 | 前端 · typescript · 类型系统 · TypeScript 泛型 联合类型 conditional types
- TypeScript 条件类型分发为什么得到联合结果
- 447浏览 收藏
-
- 文章 · 前端 | 5小时前 |
- Vue Router 切换路由后滚动位置怎么按页面恢复
- 133浏览 收藏
-
- 文章 · 前端 | 6小时前 | 依赖注入 · Vue · typescript · 组件通信 · TypeScript provide inject Vue 3 InjectionKey
- Vue 3 provide/inject 怎么避免跨组件状态类型丢失
- 247浏览 收藏
-
- 文章 · 前端 | 12小时前 | react · Suspense · 前端排错 · React suspense Error Boundary
- React Suspense 数据加载失败时怎么提供重试入口
- 379浏览 收藏
-
- 文章 · 前端 | 1天前 |
- CSS sticky 不生效怎么检查父容器 overflow
- 161浏览 收藏
-
- 文章 · 前端 | 1天前 | 响应式设计 · CSS布局 · Flex布局 · CSS flex overflow-wrap min-width flex-shrink
- CSS Flex 子元素撑破容器怎么处理
- 348浏览 收藏
-
- 文章 · 前端 | 1天前 |
- FormData 上传文件为什么不能手动设置 multipart 请求头
- 353浏览 收藏
-
- 文章 · 前端 | 1天前 |
- 前端下载文件怎么保留后端返回的文件名
- 231浏览 收藏
-
- 文章 · 前端 | 1天前 | javascript · fetch · 前端请求 · JavaScript 服务器监视 Http请求 Fetch
- JavaScript fetch 遇到 404 为什么不进入 catch
- 481浏览 收藏
-
- 文章 · 前端 | 1天前 | 前端 · typescript · 联合类型 ·
- TypeScript 怎么用区分联合表示请求状态
- 292浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 172次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 102次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 24次使用
-
- LangGPT
- LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
- 35次使用
-
- ClickPrompt
- ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
- 74次使用
-
- golang 在windows中设置环境变量的操作
- 2022-12-29 484浏览
-
- Golang常用环境变量说明与设置详解
- 2023-01-07 428浏览
-
- Go testing.T.Setenv 为什么不能和并行测试混用:环境变量隔离与清理顺序
- 2026-08-27 429浏览
-
- Go Cmd.Environ 如何确认子进程环境:变量继承、PATH 解析与可复现启动
- 2026-08-28 250浏览
-
- Go strconv.ParseBool 处理环境变量:大小写、空值与配置回滚边界
- 2026-08-22 333浏览

