uni-app自定義多環境配置,動態修改appid

背景

在企業級項目開發中,一般都會分為開發、測試、預發布、生產等多個環境,在工程化中使用不同的打包命令改變環境變量解決不同環境各種變量需要手動修改的問題,比如接口請求地址,不同環境的請求路徑前綴都是不同的。在使用uni-app開發項目時,一般都是選擇使用HbuilderX可視化創建項目,也不建議使用cli工程化方式創建uni-app項目。在HbuilderX中,默認只支持開發和生產兩個環境,點擊“運行”編譯出來的代碼是開發環境(development),點擊“發行”編譯出來的代碼是生產環境(production),可以通過process.env.NODE_ENV獲取當前環境。但在很多企業中,可能就2個環境并不能滿足實際場景,同時在開發微信小程序時,測試和生產都是不同的appid,每次部署都要手動修改切換很容易出現問題。為了解決上述問題,通過在package.json中增加uni-app擴展節點,實現自定義條件編譯平臺,讓每種編譯具有不同環境標識。再擴展vite.config.js配置文件,用環境標識判斷重寫文件中的appid

解決方案

一、創建基礎項目

選擇默認模板,注意vue版本選擇3

![[外鏈圖片轉存

二、增加擴展節點

根據官方文檔說明,擴展節點配置說明如下:

{/*** package.json其它原有配置 * 拷貝代碼后請去掉注釋!*/"uni-app": {// 擴展配置"scripts": {"custom-platform": { //自定義編譯平臺配置,可通過cli方式調用"title":"自定義擴展名稱", // 在HBuilderX中會顯示在 運行/發行 菜單中"browser":"",  //運行到的目標瀏覽器,僅當UNI_PLATFORM為h5時有效"env": {//環境變量"UNI_PLATFORM": "",  //基準平臺"MY_TEST": "", // ... 其他自定義環境變量},"define": { //自定義條件編譯"CUSTOM-CONST": true //自定義條件編譯常量,建議為大寫}}}}
}

注意:

  • UNI_PLATFORM僅支持填寫uni-app默認支持的基準平臺,目前僅限如下枚舉值:h5mp-weixinmp-alipaymp-baidump-toutiaomp-qq
  • browser 僅在UNI_PLATFORMh5時有效,目前僅限如下枚舉值:chromefirefoxieedgesafarihbuilderx
  • package.json文件中不允許出現注釋,否則擴展配置無效
  • vue-cli需更新到最新版,HBuilderX需升級到 2.1.6+

實際使用時,暫時不用的變量直接刪除,新建package.json文件,代碼如下:

{"uni-app": {"scripts": {"wx-test": {"title":"微信小程序 測試環境","env": {"UNI_PLATFORM": "mp-weixin","NAME": "test"}},"wx-prod": {"title":"微信小程序 生產環境","env": {"UNI_PLATFORM": "mp-weixin","NAME": "production"}},"h5-dev": {"title":"H5 開發環境","browser":"chrome","env": {"UNI_PLATFORM": "h5","NAME": "development"}},"h5-test": {"title":"H5 測試環境","browser":"chrome","env": {"UNI_PLATFORM": "h5","NAME": "test"}},"h5-prod": {"title":"H5 生產環境","browser":"chrome","env": {"UNI_PLATFORM": "h5","NAME": "production"}}}}
}

上面代碼片段只以微信小程序和H5兩個端為例,其中只增加了常量NAME用于區分當前環境,類似于process.env.NODE_ENV獲取環境變量的作用。一般小程序也就測試和生產兩個環境,環境太多都要重新申請賬號也麻煩。H5按照常規的配置本地開發、測試、生產三個環境。配置好后我們點擊頂部菜單欄的“運行”和“發行”即可看到效果。

在這里插入圖片描述
在這里插入圖片描述

當在業務里需要使用添加的NAME變量時,直接通過process.env.NAME即可獲取。

四、配置其他變量

根目錄下新建config目錄,用于放一些業務配置項,再新建環境相關變量配置文件env.js,代碼如下:

// 不同的環境變量配置
const development = {requestBaseUrl: 'http://development', appid: '', 
}const test = {requestBaseUrl: 'http://test',appid: 'wxd5xxxxee0fce1c81', 
}const production = {requestBaseUrl: 'http://production',appid: 'wx3xxxx1ce403cab3', 
}export default {development,test,production
}

其中變量對象名稱developmenttestproduction要和package.json文件中定義的NAME保持一致,方便后續通過對象方式直接取值。變量對象中添加的是需要根據不同環境配置的變量,比如后端服務請求地址,小程序appid和一些別的插件key。配置后我們就可以配合環境NAME獲取到不同環境的其他變量了,簡單使用方式如下:

import ENV_CONFIG from '@/config/env.js'
console.log(ENV_CONFIG[process.env.NAME].requestBaseUrl)  // 運行H5 開發環境結果 http://development

每次引入獲取方式肯定不夠友好,在uni-app中還可以通過修改vite配置添加全局變量,更方便在全局使用。

首先根目錄下新建vite.config.js文件,內容如下:

import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import ENV_CONFIG from './env/index.js'export default defineConfig({plugins: [uni()],define: {'process.env.config': ENV_CONFIG,},
});

通過定義一個全局變量process.env.config,賦值為ENV_CONFIGprocess.env.config可以改為任何一個字符串,這里主要是為了保持和默認通過process.env獲取環境變量的語義一致性。此時使用時就無需在業務中單獨引入,從全局對象process.env.config上取值即可:

console.log(process.env.config[process.env.NAME].requestBaseUrl)  // 運行H5 開發環境結果 http://development

五、動態修改小程序appid

appid是在根目錄下的manifest.json文件中,點擊后最下面有源碼視圖。修改的方式就是運用nodefs模塊,先讀取manifest.json文件,然后根據當前環境,動態替換掉appid或者其他參數,最后重新寫入到當前目錄下。具體也是在vite.config.js中處理:

import { defineConfig } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';
import ENV_CONFIG from './config/env.js'// 引入fs模塊
import fs  from 'fs'// 讀取 manifest.json ,修改后重新寫入
const manifestPath = `${__dirname}/manifest.json`;
let Manifest = fs.readFileSync(manifestPath, { encoding: 'utf-8' });
function replaceManifest(path, value) {const arr = path.split('.');const len = arr.length;const lastItem = arr[len - 1];    let i = 0;let ManifestArr = Manifest.split(/\n/);for (let index = 0; index < ManifestArr.length; index++) {const item = ManifestArr[index];if (new RegExp(`"${arr[i]}"`).test(item)) ++i;if (i === len) {const hasComma = /,/.test(item);ManifestArr[index] = item.replace(new RegExp(`"${lastItem}"[\\s\\S]*:[\\s\\S]*`),`"${lastItem}": ${typeof value === 'string'? '"'+value+'"' : value}${hasComma ? ',' : ''}`);break;}}Manifest = ManifestArr.join('\n');
}
// 具體使用,找到對應key值替換為新的值
// replaceManifest('app-plus.usingComponents', false);const appid = ENV_CONFIG[JSON.parse(process.env.UNI_CUSTOM_DEFINE).NAME].appid
replaceManifest('mp-weixin.appid', appid);fs.writeFileSync(manifestPath, Manifest, { flag: 'w' });export default defineConfig({plugins: [uni()],define: {'process.env.config': ENV_CONFIG,},
});

這個修改方案是根據官方提供的代碼片段修改,其中進行了一些變動:

  • manifest.json文件路徑由相對路徑改為__dirname獲取的絕對路徑
  • replaceManifest方法中的value進行了typeof類型判斷,如果是字符串加上雙引號。因為測試時傳個字符串會替換成沒引號的變量或者數字

同時關于當前環境變量的獲取,此時通過process.env.NAME是獲取不到package.json配置的NAME的,通過打印process.env可以發現此時它是個包含很多變量的json,在UNI_CUSTOM_DEFINE下面是可以找到NAME,這樣就能根據不同環境獲取不同的appid

在這里插入圖片描述

然后也可以用下面這種更容易理解的方式修改manifest.json,但是修改后內容排在一行,想要美觀還需要手動格式化。

// appid獲取只做參考,這里只是說明簡單的只有兩個環境,可以直接取process.env.NODE_ENV判斷
let appid = process.env.NODE_ENV == "production" ? '生產的appid' : "開發的appid"
// manifest.json 路徑
let manifestFileUrl = `${__dirname}/manifest.json`
// 讀取文件數據
let manifestFileData = fs.readFileSync(manifestFileUrl, { encoding: 'utf8' });
// 移除// 和 /* */注釋
manifestFileData = manifestFileData.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => g ? "" : m)
// // 將txt轉成obj
let manifestFileDataObj = JSON.parse(manifestFileData)
// 修改指定key對應的valuemanifestFileDataObj['mp-weixin']['appid'] = appid
// 把修改后的對象以json寫入文件
fs.writeFileSync(manifestFileUrl, JSON.stringify(manifestFileDataObj), { encoding: 'utf8' })

六、使用方式

  1. 需要本地調試時,點擊工具欄“運行”,選擇自定義的對應開發或測試環境;
  2. 業務中通過process.env.config[process.env.NAME]獲取配置的變量對象;
  3. 上線時,點擊工具欄“發行”,選擇自定義的對應測試或生產環境;

運行環境

以上代碼是運行在Hbuilderx 3.7.9版本,項目為vue3版本,基于vite構建。如在vue2版本上使用,請按照vite.config.js邏輯自行探索配置vue.config.js文件。

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

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

相關文章

Docker中為RabbitMQ安裝rabbitmq_delayed_message_exchange延遲隊列插件

1、前言 rabbitmq_delayed_message_exchange是一款向RabbitMQ添加延遲消息傳遞&#xff08;或計劃消息傳遞&#xff09;的插件。 插件下載地址&#xff1a;https://www.rabbitmq.com/community-plugins.html 1、下載插件 首先需要確定我們當前使用的RabbitMQ的版本&#xff0c…

Android隱藏輸入法

1、方法一(如果輸入法在窗口上已經顯示&#xff0c;則隱藏&#xff0c;反之則顯示) InputMethodManager imm (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 2、方法二(view為接受軟…

實踐教程|基于 pytorch 實現模型剪枝

PyTorch剪枝方法詳解&#xff0c;附詳細代碼。 一&#xff0c;剪枝分類 1.1&#xff0c;非結構化剪枝 1.2&#xff0c;結構化剪枝 1.3&#xff0c;本地與全局修剪 二&#xff0c;PyTorch 的剪枝 2.1&#xff0c;pytorch 剪枝工作原理 2.2&#xff0c;局部剪枝 2.3&#…

前端如何安全的渲染HTML字符串?

在現代的Web 應用中&#xff0c;動態生成和渲染 HTML 字符串是很常見的需求。然而&#xff0c;不正確地渲染HTML字符串可能會導致安全漏洞&#xff0c;例如跨站腳本攻擊&#xff08;XSS&#xff09;。為了確保應用的安全性&#xff0c;我們需要采取一些措施來在安全的環境下渲染…

QString常用函數介紹

此篇博客核心介紹QT中的QString類型的常用函數&#xff0c;介紹到的函數均從幫助手冊或其他博客中看到 QString 字符串類 Header: #include qmake: QT core 一、QString字符串轉換 1、QString類字符串轉換為整數 int toInt(bool *ok Q_NULLPTR, int base 10) cons…

Python 基礎 -- Tutorial(二)

5、數據結構 本章更詳細地描述了一些你已經學過的東西&#xff0c;并添加了一些新的東西。 5.1. 更多關于Lists 列表(list)數據類型有更多的方法。下面是列表對象的所有方法: list.append(x) 在列表末尾添加一項。相當于a[len(a):] [x]。 list.extend(iterable) 通過添加可…

如何使用SpringBoot 自定義轉換器

&#x1f600;前言 本篇博文是關于SpringBoot 自定義轉換器的使用&#xff0c;希望你能夠喜歡&#x1f60a; &#x1f3e0;個人主頁&#xff1a;晨犀主頁 &#x1f9d1;個人簡介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以幫助到大家&#xff0c;您的…

02-前端基礎第二天-HTML5

01-HTML標簽&#xff08;下&#xff09;導讀 目標&#xff1a; 能夠書寫表格能夠寫出無序列表能夠寫出3~4個常用input表單類型能夠寫出下拉列表表單能夠使用表單元素實現注冊頁面能夠獨立查閱W3C文檔 目錄&#xff1a; 表格標簽列表標簽表單標簽綜合案例查閱文檔 02-表格標…

Nginx搭建本地服務器,無需購買服務器即可測試vue項目打包后的效果

一.前言 本文是在windows環境&#xff08;Linux環境下其實也大同小異&#xff09;下基于Nginx實現搭建本地服務器&#xff0c;手把手教你部署vue項目。 二.Nginx入門 1&#xff09;下載安裝 進入Nginx官網下載&#xff0c;選擇stable版本下的windows版本下載即可 2&#xff09;…

Ubuntu 20.04配置靜態ip

ip配置文件 cd /etc/netplan配置 根據需求增加 # Let NetworkManager manage all devices on this system network:version: 2renderer: NetworkManager # 管理 不是必須ethernets:enp4s0: #網卡名dhcp4: no #關閉ipv4動態分配ip地址dhcp6: no #關閉ipv6動態分配…

Arrays.asList() 返回的list不能add,remove

一.Arrays.asList() 返回的list不能add,remove Arrays.asList()返回的是List,而且是一個定長的List&#xff0c;所以不能轉換為ArrayList&#xff0c;只能轉換為AbstractList 原因在于asList()方法返回的是某個數組的列表形式,返回的列表只是數組的另一個視圖,而數組本身并沒…

Wireshark 抓包過濾命令匯總

Wireshark 抓包過濾命令匯總 Wireshark 是一個強大的網絡分析工具&#xff0c;它可以幫助網絡管理員和安全專家監控和分析網絡流量。通過捕獲網絡數據包&#xff0c;Wireshark 能夠幫助我們識別網絡中的問題、瓶頸以及潛在的安全威脅。在使用 Wireshark 進行網絡數據包分析時&…

SQL Server基礎之游標

一&#xff1a;認識游標 游標是SQL Server的一種數據訪問機制&#xff0c;它允許用戶訪問單獨的數據行。用戶可以對每一行進行單獨的處理&#xff0c;從而降低系統開銷和潛在的阻隔情況&#xff0c;用戶也可以使用這些數據生成的SQL代碼并立即執行或輸出。 1.游標的概念 游標是…

DELL PowerEdge R720XD 磁盤RAID及Hot Spare熱備盤配置

一臺DELL PowerEdge R720XD服務器&#xff0c;需進行磁盤RAID及Hot Spare熱備盤配置&#xff0c;本文記錄配置過程示例。 一、設備環境 服務器型號&#xff1a;DELL PowerEdge R720XD 硬盤配置&#xff1a;800G硬盤共24塊 二、配置計劃 1、當前狀態&#xff1a;2塊盤配置RAID…

AIGC+游戲:一個被忽視的長賽道

&#xff08;圖片來源&#xff1a;Pixels&#xff09; AIGC徹底變革了游戲&#xff0c;但還不夠。 數科星球原創 作者丨苑晶 編輯丨大兔 消費還沒徹底復蘇&#xff0c;游戲卻已經出現拐點。 在游戲熱度猛增的背后&#xff0c;除了版號的利好因素外&#xff0c;AIGC技術的廣泛…

js下載后端返回的文件

文件流下載 后端返回文件流形式&#xff0c;前端下載 // res 為請求返回的數據對象const file_data res.data // 后端返回的文件流const blob new Blob([file_data]) const href window.URL.createObjectURL(blob) // 創建下載的鏈接 const file_name decodeURI(res.header…

4. 軟件開發的環境搭建

目錄 1. 搭建環境 1.1 檢查 JDK 1.2 檢查 MySQL 數據庫 1.3 檢查 Maven 1.4 檢查 GITEEGIT 1.5 安裝插件 1.5.1 安裝 Spring Boot Helper 1.5.2 安裝 lombok 1.6 創建倉庫 1.6.1 登錄 GITEE 創建倉庫并復制倉庫地址 1.6.2 克隆到本地 1.7 創建工程 1.7.1 設置編碼…

【Spring】Bean的實例化

1、簡介 在容器中的Bean要實例化為對象有三種方式 1、構造方法 2、靜態工廠 3、實例工廠 4、實現工廠接口 2、構造方法 構造方法實例化Bean即是直接通過構造方法創建對象 <bean id"bookDao" class"com.wn.spring.dao.impl.BookDaoImpl"/> 當不存在…

怎么把pdf壓縮到5m以內?壓縮辦法非常多

怎么把pdf壓縮到5m以內&#xff1f;PDF文件是我們辦公過程中較為常用的文件格式&#xff0c;PDF文件所包含的內容通常較多&#xff0c;比如文本、圖像以及音視頻等等。這樣的話&#xff0c;PDF文件占用內存也較大。如果需要對PDF文件進行使用、傳輸、分享等的話&#xff0c;可能…

單片機之從C語言基礎到專家編程 - 4 C語言基礎 - 4.8 運算符

1.算術運算符 運算符名稱備注加法運算符雙目運算&#xff0c;a b-減法運算符雙目運算&#xff0c;a - b*乘法運算符雙目運算&#xff0c;a * b/除法運算符雙目運算&#xff0c;a / b%求余運算符雙目運算, a % b自增運算符單目運算, a–自減運算符單目運算, a– 2.關系運算符…