当前位置: 首页 > news >正文

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录

  • 前言
  • 一、自定义条件编译平台是什么?
  • 二、新增自定义条件编译平台
  • 三、动态设置服务器请求地址
    • 四、动态修改manifest.json
      • 1.根目录新增文件 modifyManifest.js
      • 2.vue.config.js引入modifyManifest.js
    • 总结
    • 示例代码


前言

企业项目开发流程上一般都要配置多个运行环境(不同的服务器请求地址)。不同环境有不同用途,主要用于区分开发、测试、上线,对应的环境称为开发环境、测试环境、生产环境。实际开发中经常要在不同环境进行联调或者打包,对于uniapp每次都要手动修改服务请求地址很是麻烦,有什么方法能实现按需运行按需打包呢,答案是——自定义条件编译平台


一、自定义条件编译平台是什么?

HBuildex默认编译平台例如有H5端、小程序端、APP端,像小程序端细分还有微信小程序,钉钉小程序等,不同编译平台我们可以用条件编译来指定特殊代码运行在哪种平台上。例如:

         // #ifdef H5   let	baseUrl = 'h5'         //H5端才执行// #endif	// #ifdef MP-WEIXINlet	baseUrl ='weixin' 		//微信小程序端才执行// #endif

而所有编译平台我们都可以在编辑器-运行菜单或者发现菜单下找到,自定义新的条件编译平台其实就是在编辑器发现/运行菜单新增一种编译类型,并和上面一样支持条件编译。
在这里插入图片描述

更多的条件编译官方文档说明可以点击查看


二、新增自定义条件编译平台

uni-app 通过在package.json文件中增加uni-app扩展节点,可实现自定义条件编译平台。
例如:

"uni-app": {"scripts": {"h5-dev": {"title": "h5开发环境","env": {"UNI_PLATFORM": "h5","ENV_TYPE": "h5-dev"},"define": {"H5-DEV": true}}.....

字段说明:

{/*** package.json其它原有配置 * 拷贝代码后请去掉注释!*/"uni-app": {// 扩展配置"scripts": {"custom-platform": { //自定义编译平台配置,可通过cli方式调用"title":"自定义扩展名称", // 在HBuilderX中会显示在 运行/发行 菜单中"browser":"",  //运行到的目标浏览器,仅当UNI_PLATFORM为h5时有效"env": {//环境变量"UNI_PLATFORM": "",  //基准平台"MY_TEST": "", // ... 其他自定义环境变量},"define": { //自定义条件编译"CUSTOM-CONST": true //自定义条件编译常量,建议为大写}}}    }
}

如果项目没有package.json文件可通过npm init初始化出来

注意说明

  1. UNI_PLATFORM只支持下列值:h5、mp-weixin、mp-alipay、mp-baidu、mp-toutiao、mp-qq,不支持app端,也即只支持小程序和H5自定义条件编译平台
  2. package.json文件中不允许出现注释,否则扩展配置无效

uniapp默认运行是开发环境,打包是生产环境,可通过 process.env.NODE_ENV 判断当前环境是开发环境还是生产环境。

if (process.env.NODE_ENV === 'development') {console.log('开发环境');
} else {console.log('生产环境');
}

通过上面字段配置说明可以看到env下我们可以自定义字段来标识该编译平台的环境变量 ,例如上面截图1那样,可以通过process.env.ENV_TYPE来获取环境值

console.log(process.env.ENV_TYPE)//h5-dev

通过自定义节点扩展可以在编辑器运行或者发现下拉菜单看到新增的编译平台(自定义环境)

在这里插入图片描述

更多package.json配置说明点击查看

三、动态设置服务器请求地址

  • 先定义各端环境变量文件env.js
// h5开发环境
const h5Dev = {baseUrl: 'https://devh5.....'
}// h5测试环境
const h5Test= {baseUrl: 'https://testh5.....'}// h5生产环境
const h5Prod= {baseUrl: 'https://prodh5.....'}// 微信小程序开发环境
const mpWeixinDev = {baseUrl: 'https://devwx.....'
}// 微信小程序测试环境
const mpWeixinTest= {baseUrl: 'https://testwx.....'}// 微信小程序生产环境
const mpWeixinProd= {baseUrl: 'https://productionwx.....'}
// app开发环境
const appDev = {baseUrl: 'https://devApp.....'
}// app测试环境
const appTest= {baseUrl: 'https://testApp.....'}// app生产环境
const appProd= {baseUrl: 'https://productionApp.....'}const envConfig = {'h5-dev':h5Dev,'h5-test':h5Test,'h5-prod':h5Prod,'mp-weixin-dev':mpWeixinDev,'mp-weixin-test':mpWeixinTest,'mp-weixin-prod':mpWeixinProd,'app-dev':appDev,'app-test':appTest,'app-prod':appProd,	
}
module.exports=envConfig

此处定义的环境字段要跟package.json对应环境字段一致

  • package.json添加H5和小程序自定义环境
{{"name": "","version": "1.0.1","description": "","main": "main.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC","uni-app": {"scripts": {"h5-dev": {"title": "h5开发环境","env": {"UNI_PLATFORM": "h5","ENV_TYPE": "h5-dev"},"define": {"H5-DEV": true}},"h5-test": {"title": "h5测试环境","env": {"UNI_PLATFORM": "h5","ENV_TYPE": "h5-test"},"define": {"H5-TEST": true}},"h5-prod": {"title": "h5生产环境","env": {"UNI_PLATFORM": "h5","H5_NODE_ENV": "h5-prod"},"define": {"H5-PROD": true}},"mp-weixin-dev": {"title": "小程序开发环境","env": {"UNI_PLATFORM": "mp-weixin","ENV_TYPE": "mp-weixin-dev"},"define": {"MP-WEIXIN-DEV": true}},"mp-weixin-test": {"title": "小程序测试环境","env": {"UNI_PLATFORM": "mp-weixin","ENV_TYPE": "mp-weixin-test"},"define": {"MP-WEIXIN-TEST": true}},"mp-weixin-prod": {"title": "小程序生产环境","env": {"UNI_PLATFORM": "mp-weixin","ENV_TYPE": "mp-weixin-prod"},"define": {"MP-WEIXIN-PROD": true}}}},}
}

此处ENV_TYPE定义值最好和编译平台名称字段一致

  • request.js接口请求动态获取baseUrl
import envConfig from './env.js'
//服务器请求地址
const baseUrl = envConfig[process.env.ENV_TYPE].baseUrl

至此小程序端和H5好像没啥问题了,但是APP端不支持自定编译平台,所以只能手动切换

import envConfig from './env.js'
const appEnv="app-dev";//定义一个变量控制APP端环境
// #ifndef APP
const baseUrl = envConfig[process.env.ENV_TYPE].baseUrl
// #endif
// #ifdef APP
const baseUrl = envConfig[appEnv].baseUrl
// #endif

从上面代码看我们定义了一个appEnv变量来手动控制APP打包或运行环境,只需每次手动切换即可。

到此三端配置是不是结束了?仔细想想——H5端有个大问题,我们知道H5端有跨域问题一般不能直接访问baseUrl,在开发时候常规做法是通过manifest.json下配置代理解决跨域问题。
例如:

manifest.json

"h5" : {"devServer" : {"disableHostCheck" : true,//配置代理"proxy" : {"/api" : {"target" : "https://devh5.....",//h5开发环境"changeOrigin" : true,"secure" : false,"ws" : true}}}},

显然问题转化为根据不同编译环境动态修改target值,比如运行h5测试环境,target值就要变成env.js定义的h5Test.baseUrl

四、动态修改manifest.json

说明:manifest.json下是无法读取process.env.ENV_TYPE值,我们只能通过node文件流写入方式去修改target值

具体如下:

1.根目录新增文件 modifyManifest.js

写入:

const fs = require('fs')
//自定义的环境变量根据实际对应路径引入
const envConfig=require('./config/env.js')
//读取manifest.json内容
fs.readFile(`${__dirname}/manifest.json`, (error, res)=> {if (!error) {let data = JSON.parse(res.toString());//此时process.env.ENV_TYPE依然无法读取到但是可以读取process.env.UNI_SCRIPT,该值为自定义编译平台配置字段名称,这就是上面取字段时候要求和自定义编译平台字段一样原因let env =process.env.UNI_SCRIPTif (env&&env.includes('h5')) {if ( data?.h5?.devServer?.proxy) {let proxy= data.h5.devServer.proxyfor (let key in proxy) {proxy[key].target =envConfig[env].baseUrl}// console.log(JSON.stringify(data.h5),'proxy')//重新写入修改后内容fs.writeFile(`${__dirname}/manifest.json`,JSON.stringify(data),{encoding: 'utf-8'},(error)=>{if (error) {console.log(error,'修改失败')} else {console.log('修改成功')}})}}}
})

2.vue.config.js引入modifyManifest.js

vue.config.js(没有该文件新建,位于项目根目录)新增:

require('./modifyManifest.js')

注意:兼容性写法此处用require非import

至此,每次通过运行-编译不同的环境,编辑器会动态修改manifest.json-target值,代理指向对应的环境

总结

通过上面介绍我们实现了自定义编译平台、自定义环境运行和打包,了解了如何动态修改manifest.json内部值,也可以根据实际场景需求扩展比如动态修改小程序appid值、不同自定义环境运行不同逻辑代码等扩展。

示例代码

传送门:点击查看

相关文章:

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么?二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…...

centos 显卡驱动安装(chatglm2大模型安装步骤一)

1.服务器配置 服务器系统:Centos7.9 x64 显卡:RTX3090 (24G) 2.安装环境 2.1 检查显卡驱动是否安装 输入命令:nvidia-smi(显示显卡信息) 如果有以下显示说明,已经有显卡驱动。否则需要重装。 2.2 下载显卡驱动 第一步:浏览器输入https://www.nvidia.cn/Downloa…...

05_属性描述符

05_属性描述符 文章目录 05_属性描述符一、属性描述符是什么?二、属性描述符①:查看属性描述②:设置属性描述符③:案例01.代码实现02.代码实现(优化) 一、属性描述符是什么? 属性描述符的结构 在…...

vue day2

1、指令修饰符:.指明一些指令后缀,不同后缀封装不同处理操作 按键修饰符:keyup.enter v-model修饰符: v-model.trim:去首位空格 v-model.number:转数字 事件修饰符: 阻止事件冒泡&#xff1…...

四川劳动保障杂志社四川劳动保障编辑部四川劳动保障杂志2023年第10期目录

主题报道 四川抢抓“金九银十”招聘季多措并举稳就业促就业 举措频“上新” 金秋送岗忙 张玉芳; 2-5 法眼《四川劳动保障》投稿:cnqikantg126.com 筑牢长期护理保险基金安全防线 李科仲;赖晓薇; 6-7 调研 提升职业技能培训工作的举措 寇爵; 8-9 城乡…...

python数据类型

int 整型 i 1str 字符串 name1Emliy name2"你好" content""" Emily:你好! """ test你最"帅" test2"你最帅"float 浮点类型 height182.5 weight45.3bool 布尔类型 f1True f2Falselist …...

大数据-之LibrA数据库系统告警处理(ALM-37004 Datanode主备不同步或者断连)

告警解释 当DN主实例与DN备实例连接异常时,产生该告警。 告警属性 告警ID 告警级别 可自动清除 37004 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产生告警的主机名 Instance 产生…...

带你用uniapp从零开发一个仿小米商场_2.创建空白项目及公共样式引入

创建空白项目 打开uniapp 点击新建->项目 如下, 是编辑你项目的名字的地方是你项目存放地址,可以点击浏览器去文件管理里面选地址是模板选择,这里选择默认模板就好是一些其他选择比如uvue能让你项目在编译成软件时运行更快,unicloud能让你用js写后端,且直接就是云开发,g…...

1144. 连接格点,Kruskal算法,二维矩阵压缩为一维

有一个 m 行 n 列的点阵,相邻两点可以相连。 一条纵向的连线花费一个单位,一条横向的连线花费两个单位。 某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。 输入格式 第一行输入两个正整数 m 和 n。 以下若…...

C++ : 友元(未完结)

不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元 类或友元函数,可使用关键字 friend,通过让函数成为类的友元,可以赋予该函数与类的成员函数 同的访问权限。 生活中你的家有客厅 (Public)…...

Nginx 服务器 SSL 证书安装部署

操作场景 本文档以证书名称 menglinfeng.top 为例。 Nginx 版本以 nginx/1.18.0 为例。 当前服务器的操作系统为 CentOS 7,由于操作系统的版本不同,详细操作步骤略有区别。 安装 SSL 证书前,请您在 Nginx 服务器上开启 “443” 端口&#xf…...

GC9118S低压 5V 全桥驱动芯片,内置过温保护,低电流睡眠模式,可替代TMI8118

GC9118S 是一款低压 5V 全桥驱动芯 片,为摄像机、消费类产品、玩具和其他低 压或者电池供电的运动控制类应用提供了集 成的电机驱动解决方案。 GC9118S 能提供高达 1.1A 的持续输出 电流。可以工作在 2~6V 的电源电压上。 GC9118S 具有 PWM ( IN/…...

windows dockerdesktop 安装sqlserver2022

1.下载windows dockertop软件 下载连接 2.安装完成配置,下载源地址 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": …...

在ubuntu系统安装SVN服务端,并通过客户端进行远程访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...

STL函数对象-C++

1. 函数对象 1.1 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的 () 时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不…...

Ubuntu 设置Nginx开机自启

1.建立自启动服务文件 vim /usr/lib/systemd/system/nginx.service Descriptionnginx - high performance web server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx…...

npm中的npx命令

1.概念 npx是一个执行npm软件包的二进制文件&#xff0c;通俗的讲&#xff0c;他可以执行npm的一些指令。 2.示例 用babel将ES6语法转为ES5语法 npx babel src/js -d dist/js会执行babel的相关功能&#xff0c;如果没有安装&#xff0c;也会自动安装。 当在执行npx <co…...

python绘制Z形图 青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析2023年5月

目录 python绘制Z形图 一、题目要求 二、算法分析 三、程序代码...

conda环境下module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

1 问题描述 在训练语音模型时&#xff0c;出现如下错误&#xff1a; Traceback (most recent call last):File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 660, in <module>run()File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 282, in run…...

蓝桥杯每日一题2023.11.26

题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举&#xff0c;如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…...

【人工智能】CCF-A/B/C类期刊最新解析:影响因子、分区与投稿指南

1. CCF期刊分类体系解析 第一次接触CCF期刊目录时&#xff0c;我也被A/B/C的分类搞得一头雾水。简单来说&#xff0c;中国计算机学会&#xff08;CCF&#xff09;将计算机领域的国际学术期刊分为A、B、C三个等级&#xff0c;其中A类代表该领域的顶级期刊&#xff0c;相当于学术…...

OpenClaw长期运行方案:Phi-3-mini-128k-instruct服务的稳定性保障

OpenClaw长期运行方案&#xff1a;Phi-3-mini-128k-instruct服务的稳定性保障 1. 为什么需要长期运行方案&#xff1f; 去年冬天的一个深夜&#xff0c;我被手机警报惊醒——部署在家庭服务器的OpenClaw服务崩溃了。当时正在运行的自动化周报生成任务因此中断&#xff0c;导致…...

OpenClaw成本优化:Qwen3.5-9B长任务拆解与Token消耗监控

OpenClaw成本优化&#xff1a;Qwen3.5-9B长任务拆解与Token消耗监控 1. 为什么需要关注OpenClaw的Token消耗 上周我让OpenClaw帮我整理一个季度的工作报告&#xff0c;结果第二天发现账户里的大模型调用额度几乎见底。查看日志才发现&#xff0c;这个看似简单的任务竟然消耗了…...

RP2040硬件加速步进电机控制库picoasyncstepper

1. picoasyncstepper&#xff1a;面向RP2040平台的硬件加速异步步进电机控制库1.1 工程定位与核心价值picoasyncstepper 是一款专为 Raspberry Pi Pico 及兼容 RP2040 微控制器设计的轻量级、高精度步进电机驱动库。其根本设计目标并非简单实现“电机转动”&#xff0c;而是在极…...

Go语言的Context上下文管理

Go语言的Context上下文管理 Context的概念 Context&#xff08;上下文&#xff09;是Go语言中一个非常重要的包&#xff0c;它提供了一种在goroutine之间传递请求范围的值、取消信号和截止时间的方法。Context在处理HTTP请求、数据库操作、RPC调用等场景中非常有用。 Context的…...

丹青识画零基础上手:无编程经验也能操作的水墨AI交互流程

丹青识画零基础上手&#xff1a;无编程经验也能操作的水墨AI交互流程 1. 认识丹青识画&#xff1a;科技与艺术的完美融合 丹青识画是一款让人惊艳的智能影像识别系统&#xff0c;它用最前沿的AI技术来解读图片内容&#xff0c;然后用中国传统书法和水墨画风格来呈现识别结果。…...

梦幻动漫魔法工坊实战:用LoRA轻松打造专属动漫风格

梦幻动漫魔法工坊实战&#xff1a;用LoRA轻松打造专属动漫风格 1. 为什么你需要这个动漫生成工具 想象一下&#xff0c;你脑海中浮现出一个可爱的猫耳少女形象&#xff0c;粉色长发在微风中飘动&#xff0c;穿着精致的洛丽塔裙子站在糖果色的背景前。传统方式下&#xff0c;你…...

陈强的笔记

1. 原子性要求&#xff1a;关系的分量必须是不可分的数据项&#xff0c;禁止“表中表”&#xff0c;这是关系模型的核心约束。2. 三类完整性的区分&#xff1a;实体完整性针对主码&#xff0c;参照完整性针对外码&#xff0c;用户定义完整性针对业务规则&#xff0c;三者缺一不…...

个人情况随笔

自我介绍技术世界的探索者&#xff0c;一名对代码充满热情的初学者。虽然起步较晚&#xff0c;但始终相信编程是解决问题的艺术&#xff0c;而不仅仅是敲键盘。过往的经历或许与技术无关&#xff0c;但逻辑分析、团队协作和持续学习的能力&#xff0c;是无论哪个领域都通用的财…...

终极指南:3步永久解密科学文库PDF文档,告别7天访问限制

终极指南&#xff1a;3步永久解密科学文库PDF文档&#xff0c;告别7天访问限制 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档&#xff0c;支持破解科学文库、标准全文数据库下载的文档。无损破解&#xff0c;保留文字和目录&#xff0c;解除有效期限制。 …...