一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

news2024/11/15 11:14:59

前言

这篇文章主要介绍uniappHbuilderx 中,通过工程化,区分不同环境、动态修改小程序appid以及自定义条件编译,解决代码发布运行时手动切换到问题。

背景

在企业级的应用中,通常会分为,开发、联调、生产等多个环境,一个项目可能要发布到多个微信小程序,在工程化中,通过使用不同的打包命令设置不同的环境变量,解决不同环境各变量的内容需手动修改的问题,比如:接口、前缀、appid等;在使用uniapp开发项目时,通常使用Hbuilder可视化运行项目,点击运行编译出来都代码环境是(development),点击发布运行编译出来的代码是(production),分别对应开发和生产,使用process.env.NODE_ENV来获取运行环境。但是在很多企业项目中,就两个环境,很难满足使用场景。

为了解决以上问题,通过在package.json中增加增加 uni-app节点,自定义条件编译和环境,通过modifyManifest.js重写appid,扩展vue.config.js配置,用环境标识区分接口

一、自定义条件编译

以微信小程序为例,在做条件编译时候,只有一种判断条件

<!-- #ifdef MP-WEIXIN -->
    <view>我是微信</view>
<!-- #endif -->
<!-- #ifdef H5 -->
    <view>我是后</view>
<!-- #endif -->

但实际情况是,我们有两个微信主体,希望在不同主体展示不同信息:

<!-- #ifdef MP-CJN -->
    <view>我是CJN</view>
<!-- #endif -->
<!-- #ifdef MP-YYT -->
    <view>我是YYT</view>
<!-- #endif -->

package.json中新增uni-app官网自定义配置;

实际使用时,删除掉文件中所有的注释信息,否则编译时会报错。

{
    "uni-app": {
        "scripts": {
            "cjnDev": {
                "title":"小程序1-联调环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "cjnDev"
                },
                "define": {
                    "MP-CJN": true
                }
            },
            "cjnTest": {
                "title":"小程序1-测试环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "cjnTest"
                },
                "define": {
                    "MP-CJN": true
                }
            },
            "cjnProd": {
                "title":"小程序1-生产环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "cjnProd"
                },
                "define": {
                    "MP-CJN": true
                }
            },
            "yytDev": {
                "title":"小程序2-联调环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "yytDev"
                },
                "define": {
                    "MP-YYT": true
                }
            },
            "yytTest": {
                "title":"小程序2-测试环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "yytTest"
                },
                "define": {
                    "MP-YYT": true
                }
            },
            "yytProd": {
                "title":"小程序2-生产环境",
                "env": {
                    "UNI_PLATFORM": "mp-weixin",
                    "NAME": "yytProd"
                },
                "define": {
                    "MP-YYT": true
                }
            }
        }    
    }
}

注意:尽量保证yytProd和NAME值保持一致

以上代码以微信小程序在不同主体的展示为例,分别为小程序1(MP-CJN)、小程序2(MP-YYT),同时区分了三个环境,联调、测试和生产,配置好以后,我们在Hbuilder中点击运行和发行可以看到下面效果

ee70d202403091044358594.png

这时就可以使用<!-- #ifdef MP-YYT -->来实现在微信平台,区分不同主体的条件编译,通过环境变量process.env.NAME取得配置文件中NAME的信息

二、配置其他变量
创建`env.js`,存放相关环境变量的信息;我是在common中创建的,可以根据自己项目实际情况选择目录

module.exports = {
    // 小程序1联调环境
    cjnDev: {
        requestUrl: 'https://mp.com',
        appid: '小程序appid'
    },
    // 小程序1测试环境
    cjnTest: {
        requestUrl: '接口地址',
        appid: '小程序appid'
    },
    // 小程序1线上环境
    cjnProd: {
        requestUrl: '接口地址',
        appid: '小程序appid'
    }
    // 小程序2联调环境
    yytDev: {
        requestUrl: '接口地址',
        appid: '小程序appid'
    },
    // 小程序2测试环境
    yytTest: {
        requestUrl: '接口地址',
        appid: '小程序appid'
    },
    // 小程序2线上环境
    yytProd: {
        requestUrl: '接口地址',
        appid: '小程序appid'
    }
}

其中变量名 cjnDevcjnTestcjnProd等要跟package.json中的NAME一致,方便后续通过变量名取值。

在根目录下创建vue.config.js

let configUrl = require('./common/env.js');
// 动态修改appid,调试环境时,可以先注释掉
require('./src/modifyManifest.js');
module.exports = {
    chainWebpack: config => {
      config
        .plugin('define')
        .tap(args => {
            args[0]['process.env.config'] = JSON.stringify(configUrl)
            return args
        })
    }
}

通过定义一个全局的变量process.env.config存储的就是env.js中的全部变量信息,此时就可以直接获取到当前运行所对应的配置信息

// 运行小程序1-联调环境 获得:https://mp.com
le url = process.env.config[process.env.NAME].requestUrl

动态修appid

appid在项目根目录的manifest.json内,动态修改逻辑是使用nodejsfs模块,通过方法readFileSync读取文件,然后跟进当前环境对内容进行修改,最后通过writeFileSync写入到manifest.json

src目录下创建modifyManifest.js划重点:一定得是在src目录下

let configUrl = require('../common/env.js');
const fs = require('fs');
// 读取 manifest.json
const manifestPath = `${process.env.UNI_INPUT_DIR}/manifest.json`
let Manifest = fs.readFileSync(manifestPath, { encoding: 'utf-8' })
/**
 * 替换 manifest.json 文件内容
 * @param {String} path 目标元素的键
 * @param {String} value 目标元素的值
 */
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}": ${typeof value === 'string'? '"'+value+'"' : value}${hasComma ? ',' : ''}`)
            break;
        }
    }

    Manifest = ManifestArr.join('\n')
}
// 替换appid
const appid = configUrl[process.env.UNI_SCRIPT].appid;
replaceManifest('mp-weixin.appid', appid);
// 文件输出
fs.writeFileSync(manifestPath, Manifest, {
  "flag": "w"
})

关于环境变量,此时获取不到process.env.NAME,通过打印可以看到process.env.UNI_SCRIPT与NAME的值一致,这也是为什么我们前面强调:‘尽量保证yytProdNAME值保持一致’的原因。

f84c8202403091043466109.png

三、使用方式

1. 本地调试运行:Hbuilder->运行,选择对应的自定义环境执行

2. 上线发布:Hbuilder->发行->自定义发行,选择对应的自定义环境执行

3. 业务开发通过`process.env.config[process.env.NAME]`获取对应环境的变量对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1515946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索谷歌的秘密花园:Google文件系统GFS之旅(Google File System)

文章目录 &#x1f3d8;️GFS系统架构GFS系统节点类型GFS实现机制 &#x1f34e;GFS特点采用中心服务器模式不缓存数据在用户态下实现只提供专用接口 容错机制⚒️Master容错机制&#x1f504; Chunk Server容错 &#x1f6e0; 系统管理技术 &#x1f3d8;️GFS系统架构 大型分…

SSM整合项目(添加家居)

文章目录 1.需求分析2.设计结构3.编写Service层1.创建文件夹2.FurnService.java3.FurnServiceImpl.java4.单元测试 FurnServiceTest.java5.指定默认图片位置1.Furn.java 为imgPath设置默认值2.Furn.java 的全参构造器内判断imgPath是否为空 4.返回json数据的通用类com/sun/furn…

FreeRTOS操作系统学习——调试与优化

本文介绍 在FreeRTOS中&#xff0c;我们经常会运用到栈这个技术&#xff0c;我们对某个任务分配空间时&#xff0c;往往不确定分配多大空间的栈。任务拿到分配的栈后&#xff0c;大多数情况下&#xff0c;使用率都达不到80%&#xff0c;为了节省栈空间的开销&#xff0c;我们可…

k8s部署InfluxDB

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器&#xff0c;89b是容器ID的前三位 cd /usr/bin #进入容器后&#xff0c;进入此文件夹…

GNN/GCN自己学习

一、图的基本组成 V&#xff1a;点&#xff08;特征&#xff09; E&#xff1a;边 U&#xff1a;图&#xff08;全局特征&#xff09; 二、用途 整合特征&#xff08;embedding)&#xff0c;做重构 三、邻接矩阵 以图像为例&#xff0c;每个像素点周围都有邻居&#xff0c;…

HTML CSS入门:从基础到实践

&#x1f310; HTML & CSS入门&#xff1a;从基础到实践 &#x1f3a8; &#x1f4d6; 引言 HTML和CSS是构建网页的基石。HTML&#xff08;超文本标记语言&#xff09;用于创建网页内容&#xff0c;而CSS&#xff08;层叠样式表&#xff09;则用于美化这些内容。无论你是…

【嵌入式——QT】QPainter基本绘图

【嵌入式——QT】QPainter基本绘图 QPainter与QPaintDevicepaintEvent事件和绘图区QPainter主要属性QPen主要功能QBrush主要功能QPainter绘制基本图形方法图示代码示例 QPainter与QPaintDevice QPainter是用来进行绘图操作的类&#xff0c;QPaintDevice是一个可以使用QPainter…

RabbitMQ 模拟实现【一】:需求分析

文章目录 消息队列消息队列消息队列的作用图解生产者消费者模型BrokerSever 内部涉及的关键概念交换机功能消费的实现方式数据存储方式网络通信消息应答模式 消息队列模拟实现Gitee网址 消息队列 采用 SpringBoot 框架实现 消息队列 通常说的消息队列&#xff0c;简称MQ&am…

AP AUTOSAR 执行管理与状态管理的交互

本系列文章将从以下六个方面来介绍AP平台核心技术: 接下来,让我们来看第4个部分: 第四部分 执行管理与状态管理的交互 4.1 执行管理与状态管理的交互

这个班要不还是别上了吧。

先不提代码写得对不对。咱就是说&#xff0c;打印语句都出不来&#xff0c;搞个chuanchuan哟。 &#xff08;谁能给我解释一下。。&#x1f643;&#xff09;

Stable Diffusion 模型下载:Juggernaut(主宰、真实、幻想)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 该模型是一个真实模型&#xff0c;并且具有幻想和创意色彩。 作者述&#xff1a;我选取了…

腾讯t-design 实现图片预览组件的显示和使用

腾讯t-design 发布了 下面介绍一个组件的使用 图片预览 <template><div><div class"tdesign-demo-image-viewer__base"><t-image-viewer :images"[img]"><template #trigger"{ open }"><div class"tde…

【智能算法】非洲秃鹫优化算法(AVOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2021年&#xff0c;Abdollahzadeh等人受到非洲秃鹫自然捕食行为启发&#xff0c;提出了非洲秃鹫优化算法(African Vultures Optimization Algorithm, AVOA)。 2.算法原理 2.1算法思想 AVOA模拟了…

13.WEB渗透测试--Kali Linux(一)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;12.WEB渗透测试-Linux系统管理、安全加固&#xff08;下&#xff09;-CSDN博客 kali由 Of…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

【js刷题:数据结构数组篇之移除元素】

移除元素 一、题目二、思路三、方法1.暴力解法2.双指针法定义快指针和慢指针代码展示 三、力扣刷题1.删除排序数组中的重复项 一、题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额…

vivo统一接入网关VUA转发性能优化实践

作者&#xff1a;vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology&#xff08;QAT&#xff09;来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能&#xff0c;并探讨QAT在不同应用场景中的表现。最…

重学SpringBoot3-内容协商机制

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-内容协商机制 ContentNegotiationConfigurer接口配置内容协商URL参数Accept头使用Url扩展名 自定义内容协商格式步骤1: 注册自定义媒体类型步骤2: 实现H…

AI实战:借助Python与PaddleOCR,实现高精度文本检测与识别

1、引言 欢迎来到今天的教程&#xff1a;“驾驭PaddleOCR&#xff0c;解锁Python文字识别新技能”。在本篇文章中&#xff0c;我们将手把手教你如何安装及使用这款强大的Python库&#xff0c;轻松应对各类图像中的文字识别问题。 2、安装PaddleOCR 首先确保你的环境中已安装…

苹果电脑下载crossover对电脑有影响吗 crossover mac 好用吗CrossOver虚拟机 CrossOver打游戏

苹果电脑下载crossover对电脑有影响吗&#xff1f; 在苹果电脑下载安装crossover对电脑没有什么影响&#xff0c;并且可以解决macOS系统不能安装Windows应用程序的问题。相较于虚拟机和双系统而言&#xff0c;crossover安装软件更简单&#xff0c;占用内存也更小。下面我们来看…