注:主要参考学习自索引2。
原因(需求)
区分环境:包含后端服务域名、AppId(不同的小程序主体)、其他环境变量。
分析与两种简单的实现
传统的前端工程项目有(webpack或vite构建)环境变量配置文件,在执行不同的script时,确定环境,然后读取对应的环境变量即可。
小程序原生工程项目不同之处,开发的和生产的代码无需npm run xx 等处理步骤,所以就没有环境变量配置文件的概念,
但小程序提供了一些相关的API:wx.getAccountInfoSync
const { miniProgram: { envVersion } } = wx.getAccountInfoSync();
// envVersion 三种可选值:
// develop 开发版(开发者工具、预览码、提审时审查人员看到的)
// trial 体验版(体验码)
// release 正式版(发布后)
通过__wxConfig.envVersion 也可获取到与上述同样的值。
第一种
如果仅仅需要修改请求域名,提前将配置的域名写在封装request的文件中,按读取读取到环境切换即可。
参考-索引1
第二种
如果是更完善的方案,需要加入一个npm 命令,手动写一个js,需要做以下事,主要参考-索引2、索引4,
- 根据命令判断环境,
- 读取对应的环境变量对象,修改config/env.js(在封装请求的文件中读取)、修改project.config.json
|- config
|- env.js
|- tools
|- request.js
|- script.env.js
|- package.json
{
"scripts": {
"switch:dev": "node script.env.js --dev",
"switch:prod": "node script.env.js --prod",
"test": "echo \"Error: no test specified\" && exit 1"
},
}
module.exports.title = '环境-dev';
module.exports.baseURL = 'https://dev-xx.xxxx.com/';
module.exports.appid = 'wx90dd2a614xxxxxx';
//...
const envConfig = require('../config/env');
const config = {
timeout: 15000,
host: envConfig.baseURL
};
//...
const fs = require('fs'); // 引入nodejs fs文件模块
// 写文件
const writeFile = (path, data) => {
// process.cwd()方法是流程模块的内置应用程序编程接口,用于获取node.js流程的当前工作目录。
fs.writeFile(`${process.cwd()}${path}`, data, (err) => {
if (err) throw err;
});
};
// 配置信息
const CONFIG = {
// 测试环境
dev: {
title: '环境-dev',
baseURL: 'https://dev.xxxx.com/',
appid: 'wx90xxxx'
},
uat: {
title: '环境-uat',
baseURL: 'uat环境url地址'
},
// 生产环境
prod: {
title: '环境-prod',
baseURL: 'https://prod.xxxx.com/',
appid: 'wxfe3xxxxx'
}
};
// 获取命令行参数
const cliArgs = process.argv.splice(2);
const env = cliArgs[0].slice(2);
const item = CONFIG[env];
// 更新env.js
let configString = '';
Object.keys(item).forEach(key => {
configString += `module.exports.${key} = '${item[key]}';\n`;
});
writeFile('/config/env.js', configString);
// 修改project.config.json里面的appid
fs.readFile(`${process.cwd()}/project.config.json`, (err, data) => {
if (err) throw err;
const _data = JSON.parse(data.toString());
_data.appid = item.appid;
writeFile('/project.config.json', JSON.stringify(_data, null, 2));
});
console.log('env', env);
如何使用
npm run switch:dev
切换dev环境npm run seitch:prod
切换prod环境
提示:由于这种方式,仍然是需要开发者手动去设置环境变量的,如果没有主动设置,可能会出现将dev配置发布到线上的情况,所以测试体验版数据是否正确仍是必要的,防止自己遗漏,在每次上传生产时执行生产的npm命令即可。
参考索引
- https://developers.weixin.qq.com/community/develop/article/doc/000aaecd1989c8fa070be68f651813
- https://developers.weixin.qq.com/community/develop/article/doc/000ae44d0e498032109edaad856813
- https://developers.weixin.qq.com/community/develop/doc/0004cc6fe543405bb0882c1b156800?highLine=%25E7%258E%25AF%25E5%25A2%2583%25E5%258F%2598%25E9%2587%258F
- https://juejin.cn/post/6844904178779717645
- https://juejin.cn/post/7055596499119374349