uniapp多環境部署解決方案詳解

目錄
  • 前言
  • 嘗試幾種方式
  • 解決方案
    • 部署方式
    • 獲取接口
    • 部署路徑
    • 命令行
    • 其他
  • 總結

    最近幾周都在處理公司的移動業務,而為在后期能統一多端,解放自己,迎合公司的技術棧;選用了 uni-app 來開發。愛掏網 - it200.com開發前期重新對公司移動業務做深入了解,重構大部分業務邏輯,也抽離出基礎組件;但實際到部署的時候,出現來問題;由于現在只考慮 H5 端,部署和測試會出現多環境配置,但是我使用的 HBuilderX 工具創建的工程,所以只存在開發環境:development 和生產環境:production愛掏網 - it200.com

    查詢官網和論壇并沒有很好的配置方案;官網的一些配置可以提供參考。愛掏網 - it200.com

    • package.json

    對于根目錄下 package.json 里可以提供對不同平臺的編譯處理,這里指不同平臺并不是不同環境,環境還是只有開發和生產兩種環境

    • vue.config.js

    由于沒有使用 VUE3 來開發,所以默認的配置項還是基于 webpack。愛掏網 - it200.com如果項目根目錄沒有該配置項,可以自行創建 vue.config.js 文件,但是很遺憾還是沒有可以處理多種環境下的一個配置。愛掏網 - it200.com而且它還存在一些約束:

    不過它可以添加一些自定義的變量

    const webpack = require("webpack")
    
    module.exports = {
      chainWebpack: cOnfig=> {
        config
          .plugin("define")
          .tap(args => {
            args[0]["process.env"].VUE_APP_TEST = ""test""
            return args
          })
      }
    }

    多環境部署,實際是需要對應自己部署環境,存在不同配置項。愛掏網 - it200.com而實際業務中存在的環境可以是無限的,一般最基礎而言需要三種:

    • 開發環境

    • 測試環境

    • 生產環境

    對于公司現有業務,只針對 H5 端,需要的配置可能只有:

    • 接口:開發、測試、生產對應的接口配置不同

    • 部署路徑:測試、開發對應的部署路徑不同

    如果我們解決這兩個,那部署方案實現一大半。愛掏網 - it200.com對于環境配置,從 vue-cli 中可以看到很多;cli 配置基于 .env.x 不同文件來獲取不同配置項,這里我們可以參考它來自己實現獲取配置項。愛掏網 - it200.com

    部署方式

    部署方式,通過命令行來解決;后續可以更好的對接自動化部署,而項目中通過 HBuilderX 工具創建,需要使用它的 cli 程序,它支持常見的三端打包;H5 端打包命令,在 package.json 設置:

    "build": "cli publish --platform h5 --project 項目名稱",

    獲取接口

    項目根目錄創建不同環境下需要的配置:.env.test、.env.prod。愛掏網 - it200.com

    # .env.test
    NODE_ENV=test
    BASE_API = "/test"
    h5.router.base_cOnfig= "/h5/"
    h5.title_cOnfig= "h5"

    實際上我們只需要測試和生產兩種配置,開發配置項在代碼內部修改,這樣可以增加效率,不用每次修改后,再重啟項目。愛掏網 - it200.com

    配置項對應不同環境,而環境可以通過在 package.json 中設置不同參數來區分;

    	"scripts": {
    		"build:config:test": "node ./deploy/index --mode=test",
    		"build:config:prod": "node ./deploy/index --mode=prod",
    	},

    可以獲取 process.argv 變量讀取到設置的環境;后續還想設置什么變量也可以在后面直接添加,類似:--test=test

    // yargs.js
    module.exports = function() {
    	let args = process.argv;
    	let argv = {};
    	for (let i = 2; i 

    獲取配置后,需要讀取配置,這里直接使用 nodefs 模塊讀取文件內容

    const fs = require("fs")
    const path = require("path")
    // 解析函數
    function parse() {
        ...
    }
    
    module.exports = function() {
        // 獲取環境
    	const cOnfig= yargs();
    	
    	const env = config.mode;
    	const envPath = path.resolve(__dirname, "../../") + "/.env." + env
    	
    	try{
    		const data = fs.readFileSync(envPath, "utf8")
            // 解析文件
    		return parse(data)
    	}catch(e){
    		console.log("讀取env出錯:" + JSON.stringify(e));
    	}
    }

    其中解析函數,由于不想新增依賴增加項目負擔,直接參考 dotenv 的 parse 函數解析出文件內容;得到類似的對象:

    {
        NODE_ENV: "test",
        BASE_API: "/test",
        // ...
    }

    解析出配置內容,接下來動態配置文件;由于項目存在可能部署在客戶內網環境下,這里采用動態生產一個共用的配置文件,在項目獲取該配置項;后續運維人員可以想配置什么就配置什么。愛掏網 - it200.com

    // 寫入 /static/global.js
    writeGlobalConfig()
    
    function writeGlobalConfig() {
    	const _global = {}
    	for (let key in config) {
    		if (key.includes("_API")) {
    			_global[key] = config[key]
    		}
    	}
    	const data = `window._GLOBAL__ = ${JSON.stringify(_global)}`
    	fs.writeFileSync(path.resolve(__dirname, "../static/global.js"), data)
    }

    在項目中生產環境下取公用配置項

    const NODE_ENV = process.env.NODE_ENV;
    
    /// 默認根目錄模板 tempalte.h5 模板引入全局接口 static/global.js
    const GLOBAL_COnFIG= window._GLOBAL__ || {};
    
    const defaultAPI = {
    	BASE_API: {
    		development: ["/test"],
    		production: GLOBAL_CONFIG.BASE_API,
    	},
    	SOCKET_API_BIDDIGN: {
    		development: ["ws://test"],
    		production: GLOBAL_CONFIG.SOCKET_API_BIDDIGN,
    	},
        // ...
    }

    部署路徑

    PC 端或者是 H5 測試和生產環境上的部署路徑可能會不同;由于創建項目使用其開發工具創建,需要統一工具和更方便的更新 uni-app,不考慮使用 vue-cli 方式。愛掏網 - it200.com只能動態修改 manifest.json 文件。愛掏網 - it200.com

    uni-app 的部署路徑是修改 manifest.jsonh5.router.base愛掏網 - it200.com對應 Router 中的 base

    // manifest.js
    const fs = require("fs")
    const path = require("path")
    
    const manifestPath = path.resolve(__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(/
    /)
    
      for (let index = 0; index 

    前面我們已經獲取到配置文件內容,這里可以直接修改文件;這里需要給一個標明這是修改 manifest.json 的后綴。愛掏網 - it200.com

    h5.router.base_cOnfig= "/h5/"
    h5.title_cOnfig= "h5"

    這里配置項如果 _confg 結束的變量就是修改 manifest.json愛掏網 - it200.com

    const path = require("path")
    const fs = require("fs")
    const env = require("./modules/readEnv")
    const parseManifest = require("./modules/manifest")
    const cOnfig= env();
    
    function writeManifest() {
    	const _global = {}
    	for (let key in config) {
    		if (key.includes("_config")) {
    			const k = key.slice(0, -7)
    			_global[k] = config[key]
    		}
    	}
    	parseManifest(_global);
    }

    命令行

    準備工作完成后,可以編寫對應的命令,來簡化我們的操作;

    	"scripts": {
    		"build": "cli publish --platform h5 --project test-h5",
    		"build:config:test": "node ./deploy/index --mode=test",
    		"build:config:prod": "node ./deploy/index --mode=prod",
    		"build:prod": "npm run build:config:prod && npm run build",
    		"deploy:test": "npm run build:config:test && npm run build && fd-cli"
    	},

    && 符號是串行命令;& 是并行命令,其中 fd-cli 是個部署命令,也是我以前基于業務需要開發的一個前端簡易部署命令。愛掏網 - it200.com

    其他

    這里只針對 H5 端做了處理,如果需要做多平臺,也可以在命令行后面接不同平臺參數,然后在部署打包前處理好邏輯;比如在打包前根據自己定義的環境變量添加參數

    // vue.config.js
    const webpack = require("webpack")
    
    // 生成不同環境不同平臺的配置
    const cOnfig= require("./config")
    
    module.exports = {
      chainWebpack: cOnfig=> {
        config
          .plugin("define")
          .tap(args => {
            // config.VUE_APP_TEST
            for(let key in config) {
                args[0]["process.env"][key] = `"${config.VUE_APP_TEST}"`
            }
            return args
          })
      }
    }

    在開發階段完成后,需要特別注意一些重復的步驟或者是需要手動修改的操作,只要是手動修改,就會增加上線分險,特別是后來者接受項目的時候。愛掏網 - it200.com當然也要文檔齊全。愛掏網 - it200.com

    相關源碼:地址

    到此這篇關于uni-app多環境部署解決的文章就介紹到這了,更多相關uni-app多環境部署內容請搜索編程筆記以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持編程筆記!


    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 久久97久久97精品免视看秋霞| 亚洲免费一级片| 黄色福利小视频| 成人午夜精品视频在线观看| 亚洲香蕉久久一区二区三区四区| 456亚洲视频| 成品网站nike源码1688免费| 亚洲精品乱码久久久久久蜜桃不卡 | 少妇丰满爆乳被呻吟进入| 高清毛片免费看| 九九在线精品视频| 国产午夜亚洲精品国产| 少妇高潮惨叫喷水在线观看| 成年女人黄小视频| 免费看小12萝裸体视频国产| 99ri精品国产亚洲| 欧美videos另类极品| 国产乱子伦精品无码码专区 | 无码人妻精一区二区三区| 免费无毒A网站在线观看| 538精品视频在线观看| 日韩在线视频免费| 性感美女视频免费网站午夜| 人妻av一区二区三区精品| 福利免费在线观看| 无码精品一区二区三区免费视频| 偷拍区小说区图片区另类呻吟| 足恋玩丝袜脚视频免费网站| 日批免费观看视频| 亚洲色偷偷色噜噜狠狠99| 国产精品乳摇在线播放| 尤物精品视频一区二区三区| 亚洲成a人片在线观看中文app| 青梅竹马嗯哦ch| 天堂网www在线观看| 五月婷日韩中文字幕| 精品国产三级a∨在线观看| 国产精品无码无卡在线播放| 丰满少妇高潮惨叫久久久一| 欧美黑人激情性久久| 国产亚洲视频在线播放大全|