盛夏
盛夏
  • 发布:2022-04-03 22:33
  • 更新:2023-12-01 10:57
  • 阅读:2733

根据运行环境自定义环境变量

分类:uni-app

本文使用的项目是通过hbuilderX创建的,仅讨论hbuilderX创建项目的自定义环境变量设置,使用cli创建的项目怎么样自定义环境变量,官方文档上有说明。
本文CSDN图文链接uni-app根据运行环境自定义环境变量

需求背景

随着用户使用平台的增多,WEB、H5、微信小程序、钉钉小程序、各种小程序,都需要前端来维护,uniapp一套代码多端应用解决了这个问题,但是又有一个新的问题,
大部分系统部署到生产环境之前,或多或少的要经过:本地开发、测试环境测试、预生产环境测试这几个环节。而且每一步对应的系统参数有可能是不一样的。
官方也给出了一些思路:
运行环境管理

H5或者WEB怎么区分是在测试环境还是在生产环境?
大家都会想到:可以通过process.env.NODE_ENV==='development'区分,

但是怎么区分打包部署在测试环境还是生产环境呢?
自定义环境变量呗,
还好,uniapp可以设置环境变量,我在vue.config.js里面配置个环境变量参数不就解决了。但是HBuilderX创建的项目只能在vue.config.js里添加环境变量,配置.env文件不可以。(使用cli创建的uniapp项目我还没有试过可不可以)

H5是的环境变量应该是解决了。。。但是,每次打包之前都确认和修改一下环境变量参数,是个很烦人的操作。

而且大部分开发者用uni-app,意图绝对不是在写h5页面或者web页面(如果是vue、react不香吗?)。微信小程序差不多和H5使用同样的方法解决,(其他小程序我没有试)。
然而uniapp运行app,发行app的process.env.NODE_ENV 是'product',根本没有development一说,那APP怎么区分这是在本地开发还是生产上线了呢?

解决思路

扩展平台

uniapp技术文档--扩展新的平台
那是不是也可以专门针对测试环境和生产环境扩展一个平台,然后在扩展参数里写一下我的自定义环境变量。
于是乎,我就照着官方例子,扩展了一个WEB平台,参数如下

"h5-web": {  
            "title": "WEB本地开发和测试环境打包",  
            "env": {  
                "UNI_PLATFORM": "h5",  
                "browser": "chrome",  
                "VUE_APP_TITLE": "Hbuilder环境参数配置示例-WEB" // 其他自定义环境变量  
            },  
            "define": {  
                "H5-WEB": true  
            }  
        },

运行和打包都可以使用这个扩展平台了,环境变量的问题也解决了?
但是其他自定义环境变量不生效,被知道为什么,process.env里就是没有(要是有在扩展平台自定义环境变量成功的朋友,能不能告诉我哪里写错了。)
那怎么办?我灵机一动想到了条件编译,于是就有了下面的代码

const is_development = process.env.NODE_ENV === 'development'  
export const config = {  
    CURRENT_MODE: 'dev',  
    BASE_URL: '/dev',  
    ALERT_MSG: '这是H5测试页面,所有数据和业务仅为测试使用,不会产生实际业务影响',  
    MODE_CN: '测试环境H5',  
    CONFIG_PLATFORM: 'DEV_H5',  
    // #ifdef H5-WEB  
    ALERT_MSG: '这是WEB测试页面,所有数据和业务仅为测试使用,不会产生实际业务影响',  
    MODE_CN: '测试环境WEB',  
    CONFIG_PLATFORM: 'DEV_WEB'  
    // #endif  
}

判断AppId

APP自定义环境变量得另想方法了,翻阅了以下参考文档:
基础配置
DCloud appid 用途/作用/使用说明
APP专题 HTML5PULS
HTML5+ API Reference--runtime
想到了一个方法,测试环境和生产环境的appid不能一样,而且appid是可以使用代码获取到的,那是不是可以判断appid,确定是在哪个环境,然后使用不同的环境变量。有了下面的代码

const PRO_APPID = "开发环境appid", // 开发环境appid  
    DEV_APPID = "生产环境appid", // 生产环境appid  
    HB_APPID = "HBuilder"; // HBuilder调试基座  
// puls是app才有的变量  
const APP_ID = plus.runtime.appid;  
// 测试环境的配置  
let config = {  
    BASE_URL: 'http://dev/url',  
    CURRENT_MODE: 'dev',  
    MODE_CN: '测试环境APP'  
}  

// HBuilder调试基座  
if (APP_ID === HB_APPID) {  
    config.ALERT_MSG = "您正在使用HBuilder调试基座,请切换至本系统开发环境调试基座,如有技术问题,请咨询工号124546";  
    config.CONFIG_PLATFORM= 'HBuilder_APP'  
}  
// 开发环境  
if (APP_ID === DEV_APPID) {  
    config.ALERT_MSG = "您正在使用本系统开发环境调试基座,所有数据和业务仅为测试使用,不会产生实际业务影响,如要办理实际业务,请在应用市场下载本app。"  
    config.CONFIG_PLATFORM = 'DEV_APP'  
}  
if (APP_ID === PRO_APPID) {  
    // 生产环境的配置  
    config = {  
        BASE_URL: 'https://product/url',  
        CURRENT_MODE: 'product',  
        CONFIG_PLATFORM: 'APP',  
        MODE_CN: '生产环境APP'  

    }  
}  

export const envConfig = {  
    APP_ID,  
    ...config  
}

注:自定义调试基座的appid为制作自定义调试基座的时候mainfest.json中配置的appid。
在结合
static 目录的条件编译
进行代码优化。
然后又扩展了个平台

"uni-app": {  
        "scripts": {  
            "h5-web": {  
                "title": "WEB本地开发和测试环境打包",  
                "env": {  
                    "UNI_PLATFORM": "h5",  
                    "browser": "chrome",  
                    "VUE_APP_OUTPUT_DIR": "Hbuilder环境参数配置示例-WEB"  
                },  
                "define": {  
                    "H5-WEB": true  
                }  
            },  
            "h5-webpro": {  
                "title": "WEB生产环境打包",  
                "env": {  
                    "UNI_PLATFORM": "h5",  
                    "browser": "chrome",  
                    "VUE_APP_OUTPUT_DIR": "Hbuilder环境参数配置示例-WEB"  
                },  
                "define": {  
                    "H5-WEBPRO": true  
                }  
            },  
            "h5-pro": {  
                "title": "h5生产环境打包",  
                "env": {  
                    "UNI_PLATFORM": "h5",  
                    "browser": "chrome",  
                    "VUE_APP_OUTPUT_DIR": "Hbuilder环境参数配置示例-WEB"  
                },  
                "define": {  
                    "H5-PRO": true  
                }  
            },  
            "mp-weixin-pro": {  
                "title": "微信小程序生产环境打包",  
                "env": {  
                    "UNI_PLATFORM": "mp-weixin",  
                    "VUE_APP_OUTPUT_DIR": "Hbuilder环境参数配置示例-WEB"  
                },  
                "define": {  
                    "MP-WEIXIN-PRO": true  
                }  
            }  
        }  
    }

整理以后的项目地址uniapp环境配置,有需要的可以自行下载测试。

成果检验

扩展平台

H5

本地调试H5测试环境

操作:运行到浏览器

本地调试生产环境H5

操作:运行>>h5生产环境打包

测试环境H5发行部署

操作:发行>>网站-PC WEB或手机H5(仅适用于uni-app)

生产环境H5发行部署

操作:发行>>自定义发行>>h5生产环境打包

web

本地调试测试环境web

操作:运行>>WEB本地开发和测试环境打包

本地调试生产环境web

操作:运行>>WEB生产环境打包

测试环境web发行部署

操作:发行>>自定义发行>>WEB本地开发和测试环境打包

生产环境web发行部署

操作:发行>>自定义发行>>WEB生产环境打包

微信小程序

本地调试测试环境微信小程序

操作:运行到小程序模拟器>>微信开发者工具

本地调试生产环境微信小程序

操作:运行>>微信小程序生产环境打包

测试环境微信小程序发行部署

操作:发行>>小程序微信(仅适用于uni-app)

生产环境微信小程序发行部署

操作:发行>>自定义发行>>微信小程序生产环境打包

判断APPID

APP

使用默认调试基座

操作:运行>运行到手机或模拟器>模拟器(基座选择默认调试基座)

使用自定义调试基座或者使用测试appid打包

自定义调试基座操作:运行>运行到手机或模拟器>模拟器(基座选择自定义调试基座)
测试app:打包流程和app打包流程一致,注意修改mainfest.json文件中的appid。
注:本文测试省事,测试环境和自定义调试基座使用了同一个appid。但是建议自定义调试基座,测试环境,生产环境不要使用同一个appid。

生产环境app打包安装

操作:打包流程和app打包流程一致,注意修改mainfest.json文件中的appid。

项目使用须知

1、请升级Hbuilder到最新版本,要不然可能有些条件编译的样式不生效。
2、请修改\static\app-plus\config.js不同环境的appid为自己项目的
3、运行之前cnpm install 安装一下依赖呦
4、使用cli创建的项目我还没有测试,后面会专门更新一遍cli创建的项目怎么配置环境变量,敬请期待!

3 关注 分享
3***@qq.com phoeniix 喜欢技术的前端

要回复文章请先登录注册

9***@qq.com

9***@qq.com

回复 hhyyjj :
生效的,只是console.log()中无法打印,直接使用就行,貌似编译时对应key会被替换成value
2023-12-01 10:57
GogoCao

GogoCao

优秀!确实可以这样玩,但是我觉得uniapp-cli只要支持 NODE_ENV 透传就可以了,把一部分环境变量,透传到编译进程中,就可以减少太多没有必要的工作
2023-09-18 08:31
hhyyjj

hhyyjj

问我也发现扩展平台中定义的env不生效
2023-09-14 15:22
g***@qq.com

g***@qq.com

所以这env里面变量没生效还没解决嘛
2023-05-05 09:53