当前位置:首页 > 文章列表 > 文章 > 前端 > Vite 环境变量为什么不会自动暴露给客户端

Vite 环境变量为什么不会自动暴露给客户端

来源:17golang原创 2026-09-07 13:10:16 0浏览 收藏

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:默认前缀筛选不会暴露它
Vite 环境变量从 .env 配置经过 VITE_ 前缀筛选进入 import.meta.env,服务端秘密留在客户端边界之外
图1:Vite 默认以前缀筛选客户端可见变量,未加 VITE_ 的服务端秘密留在边界外。

再核对 .env 文件与 mode 是否对应

如果变量已经带了 VITE_ 仍然读不到,第二层通常是文件或模式不匹配。Vite 默认在开发命令使用 development mode,构建命令使用 production mode;因此 .env.development 不会替代所有环境的 .envvite build --mode staging 则会寻找 .env.staging

  1. 确认变量位于项目实际的 env 目录,而不是误放在父目录。
  2. 确认执行命令的 mode,例如 vite --mode stagingvite build --mode staging
  3. 修改 .env* 后重启开发服务器,避免旧进程继续使用已加载的值。

还要注意优先级:命令行中已经存在的环境变量可能覆盖 env 文件中的同名值。遇到“文件写了新地址但页面还是旧地址”,先检查启动命令和 shell 环境,再怀疑 Vite 没有加载。

检查 envPrefix 是否被自定义

Vite 配置支持 envPrefix。一旦项目把默认的 VITE_ 改成其他前缀,排查重点就从“有没有 VITE_”变成“当前配置到底允许哪些前缀”。配置可以是字符串,也可以是字符串数组;这项设置不是读取服务端秘密的开关,而是定义哪些名字会进入客户端代码。

import { defineConfig } from 'vite'

export default defineConfig({
  // 只增加业务公开配置的前缀,不要把 SECRET_ 纳入其中
  envPrefix: ['VITE_', 'PUBLIC_']
})

建议全项目搜索 envPrefix,确认没有在多个配置文件或不同 mode 分支中产生不同结果。尤其不要为了让变量“能读到”就写一个过宽的前缀;前缀匹配到的值会随客户端构建产物一起发布。

Vite envPrefix 默认前缀与自定义前缀连接客户端 bundle,公开配置和禁止外泄区域分开
图2:自定义 envPrefix 相当于扩大公开配置入口,前缀配置应与秘密命名规则一起审查。

把服务器秘密移出客户端代码

如果浏览器确实需要调用某个服务,应该只暴露公开地址或短期、受权限控制的业务结果。数据库密码、私钥、内部服务 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 设置成空字符串?

不要这样做。过宽的前缀会让更多环境变量进入客户端构建结果,增加凭证泄露风险;应为公开配置设置清晰、专用的前缀。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go reflect.ValueOf(nil).IsValid 为什么是 falseGo reflect.ValueOf(nil).IsValid 为什么是 false
上一篇
Go reflect.ValueOf(nil).IsValid 为什么是 false
Go 怎么用 httptest.ResponseRecorder 检查响应头和写入状态
下一篇
Go 怎么用 httptest.ResponseRecorder 检查响应头和写入状态
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    172次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    102次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    24次使用
  • LangGPT提示词框架:结构化Prompt设计方法与开源工具指南
    LangGPT
    LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
    35次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    74次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码