编译前预处理config文件,切换环境
背景:
小程序项目有“开发版,QA版,QAP版,正式版”多个环境,每个环境都与多个服务器有交互。
其中部分服务器访问需要basic认证。
因为一些特殊原因,basic密匙现在阶段只能写在前端。但是又规定git上的代码中不能有密匙明文。
以上问题导致切换环境时,HOST URL和其他常量能够自动切换,但是HOST URL对应的basic认证密匙,必须手动填写。开发过程如果频繁切换环境的话会非常繁琐。版本发布时,也需要手动补全basic密匙,风险较高。
解决方案:
发现开发者工具有自定义处理命令的功能,在编译前可以对文件预处理。
基于这个功能尝试了在每次编译前,使用脚本修改config.js文件。而脚本存储在本地不传git,规避了密匙上传的问题。
[图片]
脚本思路很简单,就是使用fs读取config.js,然后通过正则匹配replace相应变量,重写config.js
env.js:
[代码]const path = require("path");
const fs = require("fs");
const ENV = "dev"
const BASIC_AUTH = {
dev: "**********",
qa: "**********",
prod: "**********",
qap: "**********",
}
// 配置文件地址
let pathName = path.join(__dirname, "config.js")
// 读取文件 格式为utf-8
fs.readFile(pathName, { encoding: "utf-8" }, function (err, data) {
// 正则替换变量
data = data.replace(new RegExp("BASIC_AUTH:.*'"), `BASIC_AUTH: '${BASIC_AUTH[ENV]}'`)
fs.writeFile(pathName, data, function (err) {
console.log(err);
})
})
[代码]
总结:
其他环境变量的切换也可以用相同方式完成。至此,每次环境的切换只需要修改env.js中 ENV的值,点击开发者工具编译按钮,就可以完成。
[图片]
考虑过一些其他思路,比如用云函数从云数据库中拿到密匙,保存在全局变量中,但是考虑到这种方式需要修改线上代码,且可能存在一些异步的问题,所以没有使用。如果有更好的解决方案,欢迎回帖~~