uni-app 多环境部署方案_开发uniapp的环境配置
liuian 2025-09-01 08:17 5 浏览
前言
最近几周都在处理公司的移动业务,而为在后期能统一多端,解放自己,迎合公司的技术栈;选用了 uni-app 来开发。开发前期重新对公司移动业务做深入了解,重构大部分业务逻辑,也抽离出基础组件;但实际到部署的时候,出现来问题;由于现在只考虑 H5 端,部署和测试会出现多环境配置,但是我使用的 HBuilderX 工具创建的工程,所以只存在开发环境:development 和生产环境: production。
尝试几种方式
查询官网 和论坛并没有很好的配置方案;官网的一些配置可以提供参考。
- package.json
对于根目录下 package.json 里可以提供对不同平台的编译处理,这里指不同平台并不是不同环境,环境还是只有开发和生产两种环境
- vue.config.js
由于没有使用 VUE3 来开发,所以默认的配置项还是基于 webpack 。如果项目根目录没有该配置项,可以自行创建 vue.config.js 文件,但是很遗憾还是没有可以处理多种环境下的一个配置。而且它还存在一些约束:
image.png
不过它可以添加一些自定义的变量
const webpack = require('webpack')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
args[0]['process.env'].VUE_APP_TEST = '"test"'
return args
})
}
}
解决方案
多环境部署,实际是需要对应自己部署环境,存在不同配置项。而实际业务中存在的环境可以是无限的,一般最基础而言需要三种:
- 开发环境
- 测试环境
- 生产环境
对于公司现有业务,只针对 H5 端,需要的配置可能只有:
- 接口:开发、测试、生产对应的接口配置不同
- 部署路径:测试、开发对应的部署路径不同
如果我们解决这两个,那部署方案实现一大半。对于环境配置,从 vue-cli 中可以看到很多;cli 配置基于 .env.x 不同文件来获取不同配置项,这里我们可以参考它来自己实现获取配置项。
部署方式
部署方式,通过命令行来解决;后续可以更好的对接自动化部署,而项目中通过 HBuilderX 工具创建,需要使用它的 cli 程序,它支持常见的三端打包;H5 端打包命令,在 package.json 设置:
"build": "cli publish --platform h5 --project 项目名称",
获取接口
项目根目录创建不同环境下需要的配置:.env.test、.env.prod。
# .env.test
NODE_ENV=test
BASE_API = '/test'
h5.router.base_config = '/h5/'
h5.title_config = 'h5'
实际上我们只需要测试和生产两种配置,开发配置项在代码内部修改,这样可以增加效率,不用每次修改后,再重启项目。
配置项对应不同环境,而环境可以通过在 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 < args.length; ++i) {
let cur = args[i];
if (/^(--)(\S*)(=)/.test(cur)) {
const keys = cur.split('=')
argv[keys[0].slice(2)] = keys[1];
}
}
return argv
}
/**
* {
* mode: 'test'
* }
*/
获取配置后,需要读取配置,这里直接使用 node 的 fs 模块读取文件内容
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',
// ...
}
解析出配置内容,接下来动态配置文件;由于项目存在可能部署在客户内网环境下,这里采用动态生产一个共用的配置文件,在项目获取该配置项;后续运维人员可以想配置什么就配置什么。
// 写入 /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 方式。只能动态修改 manifest.json 文件。
uni-app 的部署路径是修改 manifest.json 中 h5.router.base。对应 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(/\n/)
for (let index = 0; index < ManifestArr.length; index++) {
const item = ManifestArr[index]
if (new RegExp(`"${arr[i]}"`).test(item)) ++i;
if (i === len) {
const hasComma = /,/.test(item)
ManifestArr[index] = item.replace(new RegExp(`"${lastItem}"[\\s\\S]*:[\\s\\S]*`), `"${lastItem}": ${value}${hasComma ? ',' : ''}`)
break;
}
}
Manifest = ManifestArr.join('\n')
}
module.exports = function(options) {
for (let key in options) {
replaceManifest(key, `"${options[key]}"`)
}
fs.writeFileSync(manifestPath, Manifest, {
"flag": "w"
})
}
前面我们已经获取到配置文件内容,这里可以直接修改文件;这里需要给一个标明这是修改 manifest.json 的后缀。
h5.router.base_config = '/h5/'
h5.title_config = 'h5'
这里配置项如果 _confg 结束的变量就是修改 manifest.json 。
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 是个部署命令,也是我以前基于业务需要开发的一个前端简易部署命令。
其他
这里只针对 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
})
}
}
总结
在开发阶段完成后,需要特别注意一些重复的步骤或者是需要手动修改的操作,只要是手动修改,就会增加上线分险,特别是后来者接受项目的时候。当然也要文档齐全。
相关源码:地址
- END -
相关推荐
- 小程序微信登录反映慢原来因为login和getUserProfile关系造成的
-
在我开发算盘记账APP小程序的过程中,遇到了UNIAPP开发微信小程序微信登录反映特别慢的问题。经反复查找原因,原来是因为微信登录界面代码的uni.login中包含了uni.getUserProfil...
- uniapp主题切换功能的方式终结篇(全平台兼容)
-
前面我已经给大家介绍了两种主题切换的方式,每种方式各有自己的优势与缺点,例如“scss变量+vuex”方式兼容好但不好维护与扩展,“scss变量+require”方式好维护但兼容不好,还不清楚的可点下...
- UNI又来秀了 新功能不懂玩 这份说明书带你玩遍所有潮科技
-
当您在车辆仪表盘上看到如下图标时是否一脸迷茫?是否手忙脚乱翻用户手册找不到答案?近段时间,有不少车主反馈长安UNI-T很多功能太新潮了,自己有点跟不上时代的节奏了……莫慌,本期推出长安UNI-T“AR...
- 一款商用品质的开源商城系统(Yii2+Vue2.0+uniapp)
-
一、项目简介这是一套很成熟的开源商城系统【开店星】,之前推过一次,后台感兴趣的还不少,今天再来详细介绍一下:基于Yii2+Vue2.0+uniapp框架研发,代码质量堪称商用品质,下载安装无门槛,UI...
- 惊了,这个国产软件居然这么牛,比 uniapp 还全能
-
最近跟同事闲聊,大家都在吐槽一个问题:!App是越做越像平台了,但开发却越做越痛苦了。你想加个活动页,产品说今晚上线;你想做个业务扩展,运营说要不你再写个低代码工具;你想适配鸿蒙,领导说最好做个...
- JeecgUniapp 全新版本 3.0 发布,采用 uniapp+vue3 最新架构
-
项目介绍JeecgUniapp是JeecgBoot的配套APP移动框架,项目采用Uniapp、Vue3.0、Vite、Wot-design-uni、TypeScript等最新技术栈,包括...
- AIGC+UniApp:自动生成跨平台代码实践
-
一、颠覆传统的开发革命2024年GitHub统计显示,采用AIGC辅助的UniApp项目平均开发效率提升217%。我们在某APP项目中,用ChatGPT-4o生成基础框架代码,原本需要3人日的登录模块...
- 长安引力UNI-K iDD OTA无法升级,还算问题吗?车主小题大做?
-
OTA无法升级,在我看来都不算问题。因为它本来就是锦上添花的配置!并不是雪中送炭的配置!车还可以正常开,导航用手机就可以,听歌连手机蓝牙就可以。但是要说OTA这个配置,最早是特斯拉干的。2012年特斯...
- uni-app 多环境部署方案_开发uniapp的环境配置
-
前言最近几周都在处理公司的移动业务,而为在后期能统一多端,解放自己,迎合公司的技术栈;选用了uni-app来开发。开发前期重新对公司移动业务做深入了解,重构大部分业务逻辑,也抽离出基础组件;但实际...
- 3分钟拥有一个属于自己的博客网站「腾讯云篇」
-
一、前言想要搭建一个让全世界的人都可以访问的网站,我们最少需要准备三样东西:①服务器腾讯云服务器首年低至40元/年,「链接」阿里云服务器新用户可以免费使用6个月,新人特惠_云产品推荐_云服务器-阿里云...
- 3月18号分享一个最新Cursor无限续杯的方法,亲测有效~
-
1、执行脚本MacOS&Linux系统curl-fsSLhttps://aizaozao.com/accelerate.php/https://raw.githubusercontent.co...
- 什么是IPFS,如何搭建IPFS节点_ipfs简单理解
-
IPFS是一个分布式系统,用于存储和访问文件、网站、应用程序和数据。星际文件系统(InterPlanetaryFileSystem).IPFS是一个分布式的web,点到点超媒体协议.可以...
- Claude Code:完爆 Cursor 的编程体验
-
前言最近,听说ClaudeCode这款代码辅助编写产品很强,有人把Cursor比作实习生水平,ClaudeCode比作高级工程师水平。起初不以为意,因为特殊原因,Claude无法直接访问。然而,...
- 10分钟搞定gitlab-ci自动化部署_gitlab ci 自动化部署
-
gitlab-ci是持续集成工具/自动化部署工具,类似jenkins。持续集成是将代码集成到共享存储库并尽可能早地自动构建/测试每个更改的实践-通常一天几次。概述在编码完成时都会进行打包发布...
- 「 小白玩树莓派系列」Raspberry Pi 4 Ubuntu USB 大容量存储启动指南
-
Canonical对RaspberryPi的官方支持已经走过了漫长的道路。我们现在可以在Pi安装官方支持的Ubuntu!在我之前的Pi上的Ubuntu18.04指南中,Raspb...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
-
- 小程序微信登录反映慢原来因为login和getUserProfile关系造成的
- uniapp主题切换功能的方式终结篇(全平台兼容)
- UNI又来秀了 新功能不懂玩 这份说明书带你玩遍所有潮科技
- 一款商用品质的开源商城系统(Yii2+Vue2.0+uniapp)
- 惊了,这个国产软件居然这么牛,比 uniapp 还全能
- JeecgUniapp 全新版本 3.0 发布,采用 uniapp+vue3 最新架构
- AIGC+UniApp:自动生成跨平台代码实践
- 长安引力UNI-K iDD OTA无法升级,还算问题吗?车主小题大做?
- uni-app 多环境部署方案_开发uniapp的环境配置
- 3分钟拥有一个属于自己的博客网站「腾讯云篇」
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)