今天跟大家分享一个实际工作中遇到的小程序环境切换问题。相信做过小程序开发的同学都遇到过这样的困扰:每次发布都要重复切换环境、重新打包、重新上传…搞得测试和发版效率特别低。今天我们就来聊聊如何优化这个过程。
现状分析
目前我们的 uniapp 小程序项目在测试发版时是这样的流程:
- 修改 baseUrl 为 test 环境
- 打包上传到微信小程序后台
- 设置为体验版供测试人员验证
- 测试通过后,再改回 prod 环境的地址
- 重新打包上传
- 最后提交审核
看到这个流程,你是不是也觉得特别繁琐?每次改个小功能都要这么折腾,时间都浪费在重复的打包上传上了。那么,有没有更好的方式呢?
常见解决方案探索
作为一个有追求的程序员,我首先想到的是参考 Vue 项目的环境变量配置方案。在 Vue 项目中,我们可以通过环境变量来自动选择不同环境的后端接口。所以我找到了uni.getAccountInfoSync().miniProgram.envVersion
这个 API,想通过判断小程序的版本环境来自动切换 baseUrl。
然而研究后发现,这个方案行不通。原因是小程序在审核时期,envVersion 的值是’develop’,这个问题官方一直没有解决。也就是说,我们无法准确判断当前是审核环境还是正式环境,这条路走不通。
折中方案:使用 uniapp 自定义发行
在寻找最终方案的过程中,我们还尝试过一个相对折中的方案 - 使用 uniapp 提供的自定义发行功能。这个方案虽然还是需要打两次包,但至少不用手动修改源代码了。
具体做法是在 package.json
中配置不同环境的打包命令:
{
"uni-app": {
"scripts": {
"wx-dev": {
"title": "微信小程序-dev",
"env": {
"UNI_PLATFORM": "mp-weixin",
"NAME": "develop"
},
"define": {
"DEV-SERVER": true
}
},
"wx-test": {
"title": "微信小程序-test",
"env": {
"UNI_PLATFORM": "mp-weixin",
"NAME": "trial"
},
"define": {
"TEST-SERVER": true
}
},
"wx-prod": {
"title": "微信小程序-prod",
"env": {
"UNI_PLATFORM": "mp-weixin",
"NAME": "release"
},
"define": {
"PROD-SERVER": true
}
}
}
}
}
然后在项目中使用条件编译来设置不同环境的 baseUrl:
let aptBaseUrl = ''
//#ifdef PROD-SERVER
aptBaseUrl = '<http://xx.xx.xx.xxx:8888/>'
//#endif
//#ifdef TEST-SERVER
aptBaseUrl = '<http://yy.yy.yy.yy:9999/>'
//#endif
这种方案的优点是:
- 不需要手动修改源代码中的 baseUrl
- 通过命令就能打包出对应环境的版本
- 配置灵活,易于维护
缺点是:
- 依然需要打两次包(测试包和正式包)
- 上传小程序管理后台的步骤没有减少
虽然这个方案没有完全解决我们的问题,但相比之前手动改 baseUrl 的方式还是更好的。不过,如果想要彻底解决重复打包的问题,我们还需要寻找更好的方案。
最终解决方案
经过反复研究和测试,最终我想到了一个既简单又实用的方案 - 在小程序内部做一个环境切换的功能。具体是这样的:
- 默认使用生产环境的接口地址
- 在个人中心页面增加一个环境切换开关
- 通过代码控制只对特定的测试账号显示这个开关
- 切换环境后,在本地存储(Storage)中记录当前环境
- 提示用户重启小程序使配置生效
- 下次启动时,自动读取存储的环境配置
这样的设计有几个关键点:
- 代码中硬编码测试人员的账号列表,保证只有测试人员能看到切换按钮
- 使用本地存储确保重启后依然保持选择的环境
- 切换后提示重启,避免运行时出现环境混乱的问题
方案优势与注意事项
这个方案最大的好处是:测试人员可以在同一个包里随时切换环境进行测试,测试通过后直接提审,不需要重新打包上传。这样不仅节省了开发和测试的时间,还降低了因重复打包可能带来的风险。
不过在实施这个方案时也要注意几点:
- 测试账号要严格控制,避免正式用户看到切换按钮
- 环境切换后一定要重启小程序,确保所有 API 请求都使用新的 baseUrl
- 建议在界面上清晰地显示当前环境,防止测试人员混淆
这个方案虽然简单,但确实解决了我们的实际问题。有时候解决方案不一定要多么高大上,能够切实解决问题、提高效率才是最重要的。