最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vite項(xiàng)目中打包環(huán)境變量教程

 更新時(shí)間:2026年06月02日 08:56:58   作者:像素行者  
本文詳細(xì)介紹了在Vite項(xiàng)目中配置和使用環(huán)境變量的完整流程,幫助開發(fā)者安全高效地管理不同環(huán)境下的應(yīng)用配置,感興趣的可以了解下

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í)(后面覆蓋前面):

  1. .env
  2. .env.local
  3. .env.[mode]
  4. .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 client

6.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í)踐

  1. 明確的命名約定:使用 VITE_ 前綴,使用下劃線分隔單詞
  2. 分離配置文件:創(chuàng)建專門的配置模塊來(lái)管理環(huán)境變量
  3. 類型安全:為TypeScript項(xiàng)目編寫 env.d.ts
  4. 安全性:敏感信息使用 .local 文件,添加到 .gitignore
  5. 文檔化:在README或wiki中說(shuō)明所有可用的環(huán)境變量及其含義
  6. 驗(yàn)證:在應(yīng)用啟動(dòng)時(shí)驗(yàn)證必要的環(huán)境變量是否存在
  7. 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)題的解決方法

    從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詳解

    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 虛擬列表的實(shí)戰(zhàn)示例

    Vue 虛擬列表的實(shí)戰(zhàn)示例

    這篇文章主要介紹了Vue 虛擬列表的實(shí)現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下
    2021-03-03
  • VUE 動(dòng)態(tài)組件的應(yīng)用案例分析

    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
  • vue3.0中setup使用(兩種用法)

    vue3.0中setup使用(兩種用法)

    這篇文章主要介紹了vue3.0中setup使用,本文通過(guò)兩種用法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面的示例代碼(直播平臺(tái)源碼)

    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打包部署圖標(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
  • vue中如何解除數(shù)據(jù)之間的雙向綁定

    vue中如何解除數(shù)據(jù)之間的雙向綁定

    這篇文章主要介紹了vue中如何解除數(shù)據(jù)之間的雙向綁定,具有很好的參考價(jià)值,希望對(duì)
    2022-09-09
  • Vue鼠標(biāo)右鍵畫矩形和Ctrl按鍵多選組件方式

    Vue鼠標(biāo)右鍵畫矩形和Ctrl按鍵多選組件方式

    文章介紹了一個(gè)Vue組件,該組件允許用戶通過(guò)鼠標(biāo)右鍵在畫布上繪制矩形,并且支持通過(guò)Ctrl鍵進(jìn)行多選,文章附帶了組件代碼和一個(gè)示例,建議讀者將代碼復(fù)制到自己的開發(fā)環(huán)境中進(jìn)行調(diào)試
    2024-12-12
  • Vue文本模糊匹配功能如何實(shí)現(xiàn)

    Vue文本模糊匹配功能如何實(shí)現(xiàn)

    這篇文章主要介紹了Vue文本模糊匹配功能如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

大化| 酒泉市| 博乐市| 宁国市| 南澳县| 泽库县| 靖边县| 宁化县| 北宁市| 敖汉旗| 许昌县| 台江县| 贺兰县| 太仆寺旗| 茶陵县| 武夷山市| 宣威市| 麻阳| 罗江县| 敦化市| 乌鲁木齐市| 绥江县| 邵阳县| 广东省| 交城县| 阳谷县| 鹤峰县| 小金县| 深水埗区| 富宁县| 鸡西市| 祁门县| 保靖县| 新化县| 肥乡县| 阿克| 吉安市| 区。| 东明县| 汾西县| 阳城县|