vue3+ts項目中.env配置環境變量與情景配置

一、環境變量配置

官網https://cn.vitejs.dev/guide/env-and-mode.html#intellisense

1. 新建.env開頭的文件在根目錄

為了防止意外地將一些環境變量泄漏到客戶端,只有以 VITE_ 為前綴的變量才會暴露給經過 vite 處理的代碼

.env 所有環境默認加載
.env.development 開發模式默認加載
.env.production 生產模式默認加載
.env.check 自定義環境文件

示例:如.env文件

# title
VITE_APP_TITLE = vue-guide-project
a. 模式

默認情況下,開發服務器 (dev 命令) 運行在 development (開發) 模式,而 build 命令則運行在 production (生產) 模式。
這意味著當執行 vite build 時,它會自動加載 .env.production 中可能存在的環境變量。
在某些情況下,若想在 vite build 時運行不同的模式來渲染不同的標題,可以通過傳遞 --mode 選項標志來覆蓋命令使用的默認模式。例如,如果你想在 staging (預發布)模式下構建應用:

vite build --mode staging# package.json
{# ..."type": "module","scripts": {"dev": "vite","build": "vite build --mode staging",},
}

還需要新建一個 .env.staging 文件:

# .env.staging
VITE_APP_TITLE = My App (staging)
b. 簡單了解下NODE_ENV和模式Mode
  • NODE_ENV
    定義:技術上講,NODE_ENV是一個由Node.js暴露給執行腳本的系統環境變量。
    作用:通常用于確定服務器工具、構建腳本和客戶端library在開發環境(development)還是生產環境(production)下的行為。它的值通常為"production"或"development",用于區分不同環境下的邏輯行為。
  • 模式(Mode):
    定義:模式指項目運行或構建時的一種特定狀態或配置。
    作用:在前端框架中,模式用于定義項目在不同階段(如開發、生產、測試)下的行為和配置。它可以包含多個環境變量,并通過特定的文件(如.env.production.env.development等)來管理這些變量。

所以,我們所寫的.env可以理解為創建的不同的模式變量

2. TypeScript 智能提示,設置全局類型定義

就是在編碼過程中應用這些自定義環境變量的時候,給出的智能提示。

  1. src 目錄下創建一個 vite-env.d.ts 或者 env.d.ts 文件
  2. src同級別types目錄下創建文件env.d.ts
/// <reference types="vite/client" />interface ImportMetaEnv {readonly VITE_APP_TITLE: string// 更多環境變量...
}interface ImportMeta {readonly env: ImportMetaEnv
}interface ViteEnv  extends ImportMetaEnv {}
  1. tsconfig.app.json文件中

專門用于處理項目src文件中的TypeScript配置文件,

  • include配置項加入文件:(會提示自定義設置的環境變量)
"include": [// ...// 第一種方式對應配置"vite-env.d.ts", // 或者 "env.d.ts" // 第二種方式對應配置"types/**.d.ts" // 或者直接 "types" 
],

效果圖:
在這里插入圖片描述

  • 或者compilerOptions中加入types:(只會提示默認環境變量)
{"compilerOptions": {// ..."types": ["vite/client"]}
}

效果圖:
在這里插入圖片描述

3. 訪問環境變量

  1. 客戶端源碼(就是src文件)中訪問:import.meta.env.VITE_APP_TITLE
  2. html中訪問環境變量:%VITE_APP_TITLE%,如果環境變量不存在,則會將被忽略而不被替換,
  3. 在配置(src文件外)文件中訪問環境變量

Vite 默認是不加載 .env 文件的,因為這些文件需要在執行完 Vite 配置后才能確定加載哪一個,舉個例子,rootenvDir 選項會影響加載行為。不過當你的確需要時,你可以使用 Vite 導出的 loadEnv 函數來加載指定的 .env 文件。

import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ command, mode }) => {// command: "build" | "serve" // mode 當前模式// 根據當前工作目錄中的 `mode` 加載 .env 文件// 設置第三個參數為 '' 來加載所有環境變量,而不管是否有 `VITE_` 前綴。const env = loadEnv(mode, process.cwd(), '')return {// vite 配置define: {__APP_ENV__: JSON.stringify(env.APP_ENV),},}
})

輸出:console.log(env)

在這里插入圖片描述

二、情景配置-根據不同模式使用不同插件

1. 新建build/getEnv.ts 文件處理環境文件變量

loadEnv()獲取的環境變量env從輸出的值可以看出,全是字符串,所以我們可以自定義方法去轉換變量類型

/* eslint-disable */
// Read all environment variable configuration files to process.env
export function wrapperEnv(envConf: any): ViteEnv {const ret: any = {}for (const envName of Object.keys(envConf)) {let realName = envConf[envName].replace(/\\n/g, '\n')realName = realName === 'true' ? true : realName === 'false' ? false : realNameif (envName === 'VITE_PORT') {realName = Number(realName)}if (envName === 'VITE_PROXY' && realName) {try {realName = JSON.parse(realName.replace(/'/g, '"'))} catch (error) {realName = ''}}ret[envName] = realName}return ret
}

2. build/plugins/index.ts

新建build/plugins 文件夾處理各種plugins,將每一個plugin配置單獨抽離

  • plugins文件目錄
    在這里插入圖片描述

  • 入口文件build/plugins/index.ts

// 插件配置 入口文件index.ts
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { PluginOption } from 'vite'
import VueDevTools from 'vite-plugin-vue-devtools'import { Px2remPlugin } from './Px2rem' // rem
import { svgLoaderPlugin } from './SvgLoader' // SVG
import { UnocssPlugin } from './Unocss' // unocss
import { VisualizerPlugin } from './Visualizer' // 打包分析
import { ViteCompressionPlugin } from './ViteCompression' // 壓縮gzip
import { ViteImageOptimizerPlugin } from './ViteImageOptimizer' // 圖片壓縮
import { ViteRestartPlugin } from './ViteRestartPlugin' // 修改配置文件自動重啟export const usePlugins = (isBuild: boolean, viteEnv: ViteEnv) => {const { VITE_OPEN_VISUALIZER, VITE_OPEN_SVG_LOADER, VITE_OPEN_PX2REM, VITE_OPEN_COMPRESSION } =viteEnvconst plugins: PluginOption[] = [vue(), vueJsx()]plugins.push(UnocssPlugin())if (VITE_OPEN_PX2REM) plugins.push(Px2remPlugin())if (VITE_OPEN_SVG_LOADER) plugins.push(svgLoaderPlugin())// 開發模式下if (!isBuild) {plugins.push(VueDevTools())plugins.push(ViteRestartPlugin())}if (isBuild) {plugins.push(ViteImageOptimizerPlugin())// 壓縮gzipVITE_OPEN_COMPRESSION && plugins.push(ViteCompressionPlugin())// 打包分析VITE_OPEN_VISUALIZER && plugins.push(VisualizerPlugin())}return plugins
}
  • 單個plugin示例:
    在這里插入圖片描述

4. tsconfig.node.json

專門用于Node.js環境中的TypeScript配置文件,它定義了用于Node.js應用程序的TypeScript編譯器選項

tsconfig.node.json文件中:

"include": [// ..."build/**/*.ts","types" // 全局類型
],

5. .eslintrc.cjs中添加:

overrides: [{files: ['*.ts', '*.tsx', '*.vue'],rules: {// 解決 ts 全局類型定義后,eslint報錯的問題'no-undef': 'off'}}
],
// ...
'no-unused-expressions': 'off' // 關閉禁止使用表達式

3. vite.config.ts

import { usePlugins } from './build/plugins'
// ...
export default defineConfig(({ command, mode }) => {const isBuild = command === 'build'const root = process.cwd()const env = loadEnv(mode, root)const viteEnv = wrapperEnv(env)return {plugins: usePlugins(isBuild, viteEnv),// ...}
})

三、情景配置-serverbuild配置

build文件夾中創建server.tsbuild.ts文件

1. 將build配置寫入build.ts文件中

export const useBuild = () => {return {// 10kb以下,轉Base64assetsInlineLimit: 1024 * 10,// chunkSizeWarningLimit: 1500,//配置文件大小提醒限制,默認500rollupOptions: {output: {// 每個node_modules模塊分成一個js文件manualChunks(id: string) {if (id.includes('node_modules')) {return 'vendor'// return id.toString().split('node_modules/.pnpm/')[1].split('/')[0].toString()}return undefined},// 用于從入口點創建的塊的打包輸出格式[name]表示文件名,[hash]表示該文件內容hash值entryFileNames: 'assets/js/[name].[hash].js', // 用于命名代碼拆分時創建的共享塊的輸出命名chunkFileNames: 'assets/js/[name].[hash].js', // 用于輸出靜態資源的命名,[ext]表示文件擴展名assetFileNames: 'assets/[ext]/[name].[hash].[ext]'}}}
}

2. 將server配置寫入server.ts文件中

import type { ProxyOptions } from 'vite'type ProxyItem = [string, string]
type ProxyList = ProxyItem[]
type ProxyTargetList = Record<string, ProxyOptions>/*** 創建代理,用于解析 .env.development 代理配置*/
const userProxy = (proxyList: ProxyList = []) => {const ret: ProxyTargetList = {}proxyList.forEach((item) => {const [prefix, target] = itemconst httpsRE = /^https:\/\//const isHttps = httpsRE.test(target)ret[prefix] = {target,changeOrigin: true,ws: true,rewrite: (path: string) => path.replace(new RegExp(`^${prefix}`), ''),// https is require secure=false// Verify SSL certificate...(isHttps ? { secure: false } : {})}})return ret
}/*** server 配置* @returns*/
export const useServer = (viteEnv: ViteEnv) => {const { VITE_PORT, VITE_PROXY } = viteEnvreturn {// 監聽所有公共ip// host: '0.0.0.0',cors: true,port: VITE_PORT,proxy: userProxy(VITE_PROXY)}
}

3. 完整vite.config.ts文件

import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'import { useBuild } from './build/build'
import { wrapperEnv } from './build/getEnv'
import { usePlugins } from './build/plugins'
import { useServer } from './build/server'export default defineConfig(({ command, mode }) => {const isBuild = command === 'build'const root = process.cwd()const env = loadEnv(mode, root)const viteEnv = wrapperEnv(env)return {plugins: usePlugins(isBuild, viteEnv),server: useServer(viteEnv),build: useBuild(),resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}},css: {preprocessorOptions: {scss: {additionalData: `@use "./src/styles/variables.scss" as *;@use "./src/styles/mixin.scss" as *;`,javascriptEnabled: true}}}}
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40923.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字化精益生產系統--MRP 需求管理系統

MRP&#xff08;Material Requirements Planning&#xff0c;物料需求計劃&#xff09;需求管理系統是一種在制造業中廣泛應用的計劃工具&#xff0c;旨在通過分析和計劃企業生產和庫存需求&#xff0c;優化資源利用&#xff0c;提高生產效率。以下是對MRP需求管理系統的功能設…

Raylib 坐標系

draftx 符號調整為正數 發現采樣坐標系原點0&#xff0c;0 在左上角&#xff0c;正方向 右&#xff0c;下 繪制坐標系 原點0&#xff0c;0 在左下角&#xff0c;正方向 右&#xff0c;上 拖拽可得 #include <raylib.h> // 重整原因&#xff1a;解決新函數放大縮小之下…

當需要對多個表進行聯合更新操作時,怎樣確保數據的一致性?

文章目錄 一、問題分析二、解決方案三、示例代碼&#xff08;以 MySQL 為例&#xff09;四、加鎖機制示例五、測試和驗證六、總結 在數據庫管理中&#xff0c;經常會遇到需要對多個表進行聯合更新的情況。這種操作帶來了一定的復雜性&#xff0c;因為要確保在整個更新過程中數據…

為什么需要服務器?服務器可以做些什么

目錄 一、服務器和電腦的區別二、什么是SSH三、什么是免密碼登錄四、服務器如何實現SSH免密碼登錄 一、服務器和電腦的區別 服務器和電腦是兩種不同類型的計算機系統&#xff0c;它們在設計、功能和用途上存在明顯的區別。首先&#xff0c;從硬件配置上看&#xff0c;服務器通…

vb.netcad二開自學筆記3:啟動與銷毀

Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.EditorInputImports Autodesk.AutoCAD.RuntimePublic Class WellcomCADImplements IExtensionApplicationPublic Sub Initialize() Implements IExtensionApplication.InitializeMsgBox("net程序已…

JDK都出到20多了,你還不會使用JDK8的Stream流寫代碼嗎?

目錄 前言 Stream流 是什么&#xff1f; 為什么要用Steam流 常見stream流使用案例 映射 map() & 集合 collect() 單字段映射 多字段映射 映射為其他的對象 映射為 Map 去重 distinct() 過濾 filter() Stream流的其他方法 使用Stream流的弊端 前言 當你某天看…

基于深度學習LightWeight的人體姿態檢測跌倒系統源碼

一. LightWeight概述 light weight openpose是openpose的簡化版本&#xff0c;使用了openpose的大體流程。 Light weight openpose和openpose的區別是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

公務員考試、事業編考試、教師資格證、面試、K12資料、電子書

點擊上方△騰陽 關注 作者 l 騰陽 轉載請聯系授權 你好&#xff0c;我是騰陽。 在這個自媒體的海洋里&#xff0c;我曾是一只迷失方向的小鳥&#xff0c;多次嘗試飛翔卻總是跌跌撞撞。 但每一次跌倒&#xff0c;都讓我更堅定地相信&#xff0c;只要不放棄&#xff0c;總…

【Unity2D 2022:Particle System】添加命中粒子特效

一、創建粒子特效游戲物體 二、修改粒子系統屬性 1. 基礎屬性 &#xff08;1&#xff09;修改發射粒子持續時間&#xff08;Duration&#xff09;為1s &#xff08;2&#xff09;取消勾選循環&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在時間&…

2024全網最全面及最新且最為詳細的網絡安全技巧五 之 SSRF 漏洞EXP技巧,典例分析以及 如何修復 (上冊)———— 作者:LJS

五——SSRF漏洞 EXP技巧&#xff0c;典例分析以及 如何修復 目錄 五——SSRF EXP技巧&#xff0c;典例分析以及 如何修復 5.1Apache mod_proxy SSRF&#xff08;CVE-2021-40438&#xff09;的一點分析和延伸 0x01 Apache Module綜述 0x02 漏洞原理分析 Apache在配置反代的后端…

Vue的學習之生命周期

一、生命周期 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的學習</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head>&l…

C#如何從中級進階到高級開發

從中級C#開發進階到高級開發&#xff0c;需要深入理解和掌握更復雜的技術和架構&#xff0c;同時培養解決問題的能力和創新思維。以下是一些關鍵的技能和步驟&#xff0c;可以幫助你從中級向高級開發邁進&#xff1a; 1. 深入理解C#語言特性 泛型&#xff1a;熟練使用泛型提高…

Java實現登錄驗證 -- JWT令牌實現

目錄 1.實現登錄驗證的引出原因 2.JWT令牌2.1 使用JWT令牌時2.2 令牌的組成 3. JWT令牌&#xff08;token&#xff09;生成和校驗3.1 引入JWT令牌的依賴3.2 使用Jar包中提供的API來實現JWT令牌的生成和校驗3.3 使用JWT令牌驗證登錄3.4 令牌的優缺點 1.實現登錄驗證的引出 傳統…

強化Linux系統安全性:從基礎命令到高級管理

強化Linux系統安全性&#xff1a;從基礎命令到高級管理 引言 在網絡安全領域&#xff0c;Linux系統因其穩定性和安全性而廣受歡迎。作為一名網絡安全專家&#xff0c;我將分享如何通過Linux基礎命令和高級管理技巧來加強系統的安全性。本文將基于《學神 IT 教育》提供的Linux…

Debezium報錯處理系列之第110篇: ERROR Error during binlog processing.Access denied

Debezium報錯處理系列之第110篇:ERROR Error during binlog processing. Last offset stored = null, binlog reader near position = /4 Access denied; you need at least one of the REPLICATION SLAVE privilege for this operation 一、完整報錯二、錯誤原因三、解決方法…

python 切入點(EntryPoints)使用

文章目錄 EntryPoints 介紹EntryPoints案例EntryPoints 介紹 官網參考 EntryPoints 是發布的python 項目的一種機制,可以提供對自身項目的切入點,供其他項目代碼使用。在python環境中可以通過importlib.metadata.entry_points 函數發現所有的切入點插件,并在代碼中加載、調…

08_排序

基本概念與分類 假設含有n個記錄的序列為 { r 1 , r 2 , . . . , r n } \{r_1,r_2,...,r_n\} {r1?,r2?,...,rn?}&#xff0c;其相應的關鍵字分別為 { k 1 , k 2 , . . . , k n } \{k_1,k_2,...,k_n\} {k1?,k2?,...,kn?}&#xff0c;需確定1&#xff0c;2&#xff0c;…&…

微服務: Nacos部署安裝與properties配置

Nacos 是阿里巴巴開源的一款用于動態服務發現、配置管理和服務管理的基礎設施。Nacos 這個名稱源自于 “Dynamic Naming and Configuration Service”。它主要是用于解決微服務架構中服務發現和配置管理的問題。 Nacos 單機模式的部署安裝 1. 安裝(Windows環境) Nacos是Java…

Java線程基礎知識總結

基礎概念 Java 線程是并發編程的基礎&#xff0c;涉及到線程的創建、管理、同步以及通信。理解和掌握線程的使用對于編寫高效和響應快速的應用程序至關重要。 1. 線程基礎 線程是程序中的執行流。每個Java程序至少有一個線程 — 主線程&#xff08;main&#xff09;。通過使…

從入門到深入,Docker新手學習教程

編譯整理&#xff5c;TesterHome社區 作者&#xff5c;Ishaan Gupta 以下為作者觀點&#xff1a; Docker 徹底改變了我們開發、交付和運行應用程序的方式。它使開發人員能夠將應用程序打包到容器中 - 標準化的可執行組件&#xff0c;將應用程序源代碼與在任何環境中運行該代碼…