Vite項(xiàng)目中打包環(huán)境變量教程
1. 環(huán)境變量基礎(chǔ)概念
環(huán)境變量是在構(gòu)建過(guò)程中注入應(yīng)用程序的值,用于區(qū)分不同的運(yùn)行環(huán)境(開發(fā)、測(cè)試、生產(chǎn)等)。在Vite中,環(huán)境變量通過(guò) import.meta.env 對(duì)象在客戶端代碼中訪問(wèn)。
為什么需要環(huán)境變量?
- 區(qū)分開發(fā)、測(cè)試、生產(chǎn)環(huán)境的配置
- 隱藏敏感信息(API密鑰、數(shù)據(jù)庫(kù)連接等)
- 靈活調(diào)整應(yīng)用行為而無(wú)需修改代碼
- 實(shí)現(xiàn)不同環(huán)境的特定配置
2. Vite環(huán)境變量的工作原理
2.1 文件約定
Vite使用以下約定來(lái)管理環(huán)境變量:
.env # 所有環(huán)境下都會(huì)加載 .env.local # 所有環(huán)境下都會(huì)加載(本地覆蓋,.gitignore中) .env.[mode] # 特定模式下加載(如.env.production) .env.[mode].local # 特定模式下加載(本地覆蓋)
加載優(yōu)先級(jí)(后面覆蓋前面):
- .env
- .env.local
- .env.[mode]
- .env.[mode].local
2.2 模式概念
Vite的模式是指不同的構(gòu)建或開發(fā)環(huán)境。默認(rèn)模式:
- development - 運(yùn)行 vite 時(shí)
- production - 運(yùn)行 vite build 時(shí)
可以通過(guò)命令指定模式:
vite build --mode staging npm run build -- --mode test
3. 環(huán)境變量文件配置
3.1 基礎(chǔ)配置示例
.env
VITE_APP_TITLE=My App VITE_BASE_URL=http://localhost:3000
.env.production
VITE_APP_TITLE=My App Pro VITE_BASE_URL=https://api.example.com
.env.development
VITE_APP_TITLE=My App Dev VITE_BASE_URL=http://localhost:5173
.env.local(不提交到版本控制)
VITE_SECRET_KEY=xxx-secret-key-xxx
3.2 變量命名規(guī)則
重要:為了安全性,只有以 VITE_ 開頭的變量才會(huì)被暴露給客戶端代碼。
? 正確: VITE_API_URL=https://api.example.com VITE_APP_NAME=MyApp VITE_MAX_UPLOAD_SIZE=10485760 ? 錯(cuò)誤(不會(huì)被暴露): API_URL=https://api.example.com SECRET_KEY=secret-value
如需自定義前綴,可在 vite.config.js 中配置:
export default defineConfig({
envPrefix: 'APP_' // 暴露以 APP_ 開頭的變量
})4. 在代碼中訪問(wèn)環(huán)境變量
4.1 基本用法
// 在任何JavaScript/TypeScript文件中
console.log(import.meta.env.VITE_API_URL)
console.log(import.meta.env.VITE_APP_TITLE)
// 條件判斷
if (import.meta.env.PROD) {
// 生產(chǎn)環(huán)境邏輯
}
if (import.meta.env.DEV) {
// 開發(fā)環(huán)境邏輯
}4.2 Vite內(nèi)置變量
import.meta.env.MODE // 當(dāng)前模式 (development/production) import.meta.env.DEV // 是否開發(fā)環(huán)境 (boolean) import.meta.env.PROD // 是否生產(chǎn)環(huán)境 (boolean) import.meta.env.SSR // 是否SSR構(gòu)建 (boolean) import.meta.env.BASE_URL // 應(yīng)用的基礎(chǔ)路徑
4.3 創(chuàng)建環(huán)境變量工具類
為了更好地管理環(huán)境變量,推薦創(chuàng)建一個(gè)配置文件:
// src/config/env.js
export const env = {
apiUrl: import.meta.env.VITE_API_URL,
appTitle: import.meta.env.VITE_APP_TITLE,
isDev: import.meta.env.DEV,
isProd: import.meta.env.PROD,
}
// 使用
import { env } from '@/config/env'
console.log(env.apiUrl)4.4 TypeScript類型提示
env.d.ts
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_API_URL: string
readonly VITE_APP_TITLE: string
readonly VITE_MAX_UPLOAD_SIZE: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}5. 打包(構(gòu)建)過(guò)程中的處理
5.1 構(gòu)建命令
# 默認(rèn)以production模式構(gòu)建 npm run build vite build # 以特定模式構(gòu)建 vite build --mode staging vite build --mode development # 預(yù)覽生產(chǎn)構(gòu)建 npm run preview
5.2 打包過(guò)程中的替換
Vite在構(gòu)建時(shí)會(huì)進(jìn)行靜態(tài)字符串替換:
// 源代碼 const apiUrl = import.meta.env.VITE_API_URL // 打包后(以production模式) const apiUrl = "https://api.example.com"
5.3 條件編譯示例
if (import.meta.env.PROD) {
// 生產(chǎn)環(huán)境才會(huì)包含的代碼
console.log('Production build')
} else if (import.meta.env.DEV) {
// 開發(fā)環(huán)境代碼
console.log('Development build')
}
// 打包后(production模式)
if (true) {
// 這個(gè)分支會(huì)被包含
console.log('Production build')
} else if (false) {
// 這個(gè)分支會(huì)被Tree-shake移除
console.log('Development build')
}
6. 實(shí)戰(zhàn)配置示例
6.1 多環(huán)境配置方案
.env
VITE_APP_TITLE=My Application VITE_VERSION=1.0.0
.env.development
VITE_API_BASE_URL=http://localhost:8000 VITE_API_TIMEOUT=30000 VITE_LOG_LEVEL=debug VITE_MOCK_API=true
.env.staging
VITE_API_BASE_URL=https://staging-api.example.com VITE_API_TIMEOUT=30000 VITE_LOG_LEVEL=info VITE_MOCK_API=false
.env.production
VITE_API_BASE_URL=https://api.example.com VITE_API_TIMEOUT=60000 VITE_LOG_LEVEL=error VITE_MOCK_API=false
.env.local(.gitignore中)
VITE_SECRET_TOKEN=abc123xyz
6.2 應(yīng)用級(jí)配置文件
src/config/index.js
export default {
appTitle: import.meta.env.VITE_APP_TITLE,
version: import.meta.env.VITE_VERSION,
api: {
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: parseInt(import.meta.env.VITE_API_TIMEOUT),
},
logger: {
level: import.meta.env.VITE_LOG_LEVEL,
},
mockApi: import.meta.env.VITE_MOCK_API === 'true',
isDev: import.meta.env.DEV,
isProd: import.meta.env.PROD,
}6.3 API客戶端配置
src/api/client.js
import axios from 'axios'
import config from '@/config'
const client = axios.create({
baseURL: config.api.baseURL,
timeout: config.api.timeout,
})
// 條件添加mock攔截器
if (config.mockApi) {
client.interceptors.response.use(response => {
// Mock響應(yīng)邏輯
return response
})
}
export default client6.4 Vite配置文件
vite.config.js
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig(({ command, mode }) => {
// 根據(jù)當(dāng)前模式加載環(huán)境變量
const env = loadEnv(mode, process.cwd(), '')
return {
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
server: {
port: 5173,
proxy: {
'/api': {
target: env.VITE_API_BASE_URL,
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
},
},
},
envPrefix: 'VITE_',
define: {
__APP_VERSION__: JSON.stringify(env.npm_package_version),
},
}
})
7. 常見問(wèn)題與解決方案
7.1 環(huán)境變量不生效
問(wèn)題:修改了.env文件,但應(yīng)用中看不到新的值。
解決:
- 重啟開發(fā)服務(wù)器(
vite在啟動(dòng)時(shí)加載環(huán)境變量) - 檢查變量名是否以
VITE_開頭 - 確保文件在項(xiàng)目根目錄(與
package.json同級(jí))
7.2 敏感信息泄露
問(wèn)題:私有密鑰被打包到生產(chǎn)代碼中。
解決:
- 敏感信息放在
.env.local中(添加到.gitignore) - 使用
.env.[mode].local文件進(jìn)行本地覆蓋 - 不使用
VITE_前綴的變量不會(huì)被暴露 - 考慮在構(gòu)建時(shí)從環(huán)境變量注入敏感信息
# 在CI/CD中注入 VITE_API_KEY=xxx npm run build
7.3 TypeScript提示不準(zhǔn)確
問(wèn)題:import.meta.env.VITE_* 沒(méi)有類型提示。
解決:創(chuàng)建 env.d.ts 文件定義類型(見第4.4節(jié))
7.4 變量在條件語(yǔ)句中不工作
問(wèn)題:使用變量值進(jìn)行條件判斷時(shí),分支沒(méi)有被tree-shake。
解決:使用內(nèi)置變量(如 import.meta.env.PROD)進(jìn)行條件判斷,而非自定義變量值
// ? 會(huì)被正確tree-shake
if (import.meta.env.PROD) { ... }
// ? 可能不會(huì)被tree-shake
if (import.meta.env.VITE_ENABLE_FEATURE === 'true') { ... }
8. 最佳實(shí)踐
- 明確的命名約定:使用
VITE_前綴,使用下劃線分隔單詞 - 分離配置文件:創(chuàng)建專門的配置模塊來(lái)管理環(huán)境變量
- 類型安全:為TypeScript項(xiàng)目編寫
env.d.ts - 安全性:敏感信息使用
.local文件,添加到.gitignore - 文檔化:在README或wiki中說(shuō)明所有可用的環(huán)境變量及其含義
- 驗(yàn)證:在應(yīng)用啟動(dòng)時(shí)驗(yàn)證必要的環(huán)境變量是否存在
- CI/CD集成:在構(gòu)建流程中動(dòng)態(tài)注入環(huán)境變量
9. 快速參考
# 開發(fā)環(huán)境運(yùn)行 npm run dev # 使用.env和.env.development # 生產(chǎn)環(huán)境構(gòu)建 npm run build # 使用.env和.env.production # 自定義模式構(gòu)建 npm run build -- --mode staging # 列出當(dāng)前所有加載的環(huán)境變量(Vite 3.1+) # 在vite.config.js中使用loadEnv() // 快速訪問(wèn) import.meta.env.MODE // 當(dāng)前模式 import.meta.env.DEV // 開發(fā)環(huán)境 import.meta.env.PROD // 生產(chǎn)環(huán)境 import.meta.env.VITE_* // 自定義變量
到此這篇關(guān)于Vite項(xiàng)目中打包環(huán)境變量教程的文章就介紹到這了,更多相關(guān)Vite 打包環(huán)境變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從Vue2升級(jí)Vue3過(guò)程中遇到作用域插槽語(yǔ)法變更問(wèn)題的解決方法
在將項(xiàng)目從 Vue 2 升級(jí)到 Vue 3 的過(guò)程中,遇到了兩處典型的兼容性問(wèn)題,主要涉及 作用域插槽語(yǔ)法變更 和 響應(yīng)式數(shù)據(jù)類型處理差異,本文通過(guò)具體代碼示例,說(shuō)明問(wèn)題原因、Vue 版本機(jī)制差異,并給出推薦改法,需要的朋友可以參考下2026-02-02
elementUI如何動(dòng)態(tài)給el-tree添加子節(jié)點(diǎn)數(shù)據(jù)children詳解
element-ui 目前基本成為前端pc網(wǎng)頁(yè)端標(biāo)準(zhǔn)ui框架,下面這篇文章主要給大家介紹了關(guān)于elementUI如何動(dòng)態(tài)給el-tree添加子節(jié)點(diǎn)數(shù)據(jù)children的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
VUE 動(dòng)態(tài)組件的應(yīng)用案例分析
這篇文章主要介紹了VUE 動(dòng)態(tài)組件的應(yīng)用,結(jié)合具體案例形式分析了vue.js動(dòng)態(tài)組件的應(yīng)用場(chǎng)景、解決方案及相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面的示例代碼(直播平臺(tái)源碼)
這篇文章主要介紹了vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
vite打包部署圖標(biāo)偶爾亂碼的問(wèn)題及解決過(guò)程
文章介紹了在使用Vite+Vue3項(xiàng)目打包時(shí)遇到的自定義圖標(biāo)偶爾亂碼問(wèn)題的解決方法,通過(guò)研究vite.config.js的配置項(xiàng),發(fā)現(xiàn)將cssMinify設(shè)置為false可以解決圖標(biāo)亂碼問(wèn)題,同時(shí)并不會(huì)顯著增加打包文件的大小2025-12-12

