uni-app 配置编译环境与动态修改manifest.json参数

简介: uni-app 配置编译环境与动态修改manifest.json参数

uni-app开发时,发现有两种创建项目的方式。不管哪一种创建方式,可知:


1、点击 ‘运行’ 按钮,默认执行的网络环境为:development。此时:

process.env.NODE_ENV === 'development'

2、点击 ‘发行’ 按钮,默认执行的网络环境为:production。此时:

process.env.NODE_ENV === 'production'

3、 process.env.NODE_ENV === 'production' 生成包位置:dist/build/mp-weixin。

4、process.env.NODE_ENV !== 'production' 生成包位置:dist/dev/mp-weixin。

已知这些条件,就想做一些编译优化的处理:


一、配置不同编译环境


1、编译命令配置

为了兼容两种方式创建的项目,同时方便开发调试。出现了相同网络环境,不同配置名称的处理。在项目的根目录 package.json 文件中(可视化创建没有该文件可自行创建),编译配置如下:


"scripts": {
  "prod:release-mp-weixin": "cross-env NODE_ENV=prod UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
  "rc:release-mp-weixin": "cross-env NODE_ENV=rc UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
  "test:release-mp-weixin": "cross-env NODE_ENV=test UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
  "dev:release-mp-weixin": "cross-env NODE_ENV=dev UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
  "prod:mp-weixin": "cross-env NODE_ENV=prod UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
  "rc:mp-weixin": "cross-env NODE_ENV=rc UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
  "test:mp-weixin": "cross-env NODE_ENV=test UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
  "dev:mp-weixin": "cross-env NODE_ENV=dev UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
  },


注意:以上编译生成包位置:dist/dev/mp-weixin


另外:


"scripts": {
  // 与点击“发行”编译相同 包位置:dist/build/mp-weixin
  "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
  // 与点击“运行”编译相同 包位置:dist/dev/mp-weixin
  "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch"
},


【注意】:复制上述代码的时候,记得把备注删除。否则无法运行。


2、文件配置处理


1、创建如下项目结构配置


.

├── env.js // 网络环境的切换在这里处理
└── libs // 该目录下放置对应的网络环境
    ├── env.dev.js  // 开发环境
    ├── env.prod.js  // 生产环境
    ├── env.rc.js   // 预发环境
    └── env.test.js  // 测试环境

2、env.js 代码实现:


// development test rc buildPro/watchPro/production
console.log("==========NODE_ENV:", process.env.NODE_ENV)
let _config = {}
if (process.env.NODE_ENV === 'development'
  || process.env.NODE_ENV === 'dev') {
  _config = require('./libs/env.dev.js')
} else if (process.env.NODE_ENV === 'test') {
  //测试环境
  _config = require('./libs/env.test.js')
}  else if (process.env.NODE_ENV === 'production'
    || process.env.NODE_ENV === 'prod') {
  //生产环境
  _config = require('./libs/env.prod.js')
} else if (process.env.NODE_ENV === 'rc') {
  //rc环境
  _config = require('./libs/env.rc.js')
}
// 给环境变量 process.uniEnv 赋值  使用 process.uniEnv.baseUrl
if (_config) {
  process.uniEnv = {};
  for (let key in _config) {
  process.uniEnv[key] = _config[key];
  }
}


3、对应网络环境域名配置


这里例举一个简单的实例:


const config = {
  baseUrl: 'http://baidu.com', // 主域名
  aaaUrl: 'http://aaa.com',
  bbbUrl: 'http://bbb.com',
  ......
  environment: 'dev'
}
module.exports = config;


4、在根目录的 main.js 中导入


// 网络环境配置(导入便会执行)
import './env/env.js'


二、动态修改manifest.json参数


通过以上,根据不同的编译方式,可以自动的切换不同的网络环境。

但是这时候又碰到了一个问题。不同的网络环境,可能还需要配置不同的小程序appid。作为一个慵懒的程序员,根据不同的网络环境,手动去修改appid那是不可能的。


动态配置appid,本质就是要动态配置 manifest.json 文件内容,先简单了解下该文件的结构:


{
    "name" : "小程序名称",
    "appid" : "__UNI__9329D99",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
    "mp-weixin" : {
        "appid": "wxe6fc48a27f7591b1",
        "setting" : {
            "urlCheck" : false,
            "es6" : true,
            "postcss" : true,
            "minified" : true
        },
        "usingComponents" : true,
        "permission" : {
            "scope.userLocation" : {
                "desc" : "测试"
            }
        }
    },
}


由以上可知,需要修改的是 mp-weixin.appid 的内容,具体实现步骤如下:


1、创建文件


在src根目录下

在src根目录下

在src根目录下

重要事情说三遍(可视化创建的项目,在项目的根目录下)。创建 modifyManifest.js ,并实现如下代码:


const fs = require('fs')
//此处如果是用HBuilderX创建的项目manifest.json文件在项目跟目录,如果是 cli 创建的则在 src 下,这里要注意
//process.env.UNI_INPUT_DIR为项目所在的绝对路径,经测试,相对路径会找不到文件
const manifestPath = process.env.UNI_INPUT_DIR + '/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')
}
// 动态配置 appid
if (process.env.NODE_ENV === 'production'
  || process.env.NODE_ENV === 'prod'
  || process.env.NODE_ENV === 'rc'){
    replaceManifest('mp-weixin.appid', '正式和预发网络环境的appid')
}else {
    replaceManifest('mp-weixin.appid', '开发和测试网络环境的appid')
}
fs.writeFileSync(manifestPath, Manifest, {
  "flag": "w"
})


2、导入


将文件的文件导入到 vue.config.js 文件中:


import './modifyManifest.js'

如果没有 vue.config.js 文件,可自行创建,记住这个文件名称不能改。


三、总结


以上两个步骤实现的本质是:

1、根据不同的编译模式配置不同网络环境。

2、根据不同的编译模式配置不同的小程序appid。

3、根据前面两点总结:根据不同的网络环境动态配置appid。


相关文章
|
3月前
|
域名解析 网络协议 API
【Azure Container App】配置容器应用的缩放规则 Managed Identity 连接中国区 Azure Service Bus 问题
本文介绍了在 Azure Container Apps 中配置基于自定义 Azure Service Bus 的自动缩放规则时,因未指定云环境导致的域名解析错误问题。解决方案是在扩展规则中添加 `cloud=AzureChinaCloud` 参数,以适配中国区 Azure 环境。内容涵盖问题描述、原因分析、解决方法及配置示例,适用于使用 KEDA 实现事件驱动自动缩放的场景。
|
6月前
|
人工智能 JSON 小程序
【一步步开发AI运动APP】七、自定义姿态动作识别检测——之规则配置检测
本文介绍了如何通过【一步步开发AI运动APP】系列博文,利用自定义姿态识别检测技术开发高性能的AI运动应用。核心内容包括:1) 自定义姿态识别检测,满足人像入镜、动作开始/停止等需求;2) Pose-Calc引擎详解,支持角度匹配、逻辑运算等多种人体分析规则;3) 姿态检测规则编写与执行方法;4) 完整示例展示左右手平举姿态检测。通过这些技术,开发者可轻松实现定制化运动分析功能。
|
3月前
|
缓存 编解码 数据可视化
uniapp发行快应用 [HBuilder] 23:33:45.537 manifest.json->quickapp-webview 缺少 icon 配置如何解决优雅草卓伊凡
uniapp发行快应用 [HBuilder] 23:33:45.537 manifest.json->quickapp-webview 缺少 icon 配置如何解决优雅草卓伊凡
105 5
uniapp发行快应用 [HBuilder] 23:33:45.537 manifest.json->quickapp-webview 缺少 icon 配置如何解决优雅草卓伊凡
|
4月前
《仿盒马》app开发技术分享-- 首页活动配置(5)
上一篇文章中我们实现了项目端云一体化首页部分模块动态配置,实现了对模块模块的后端控制显示和隐藏,这能让我们的app更加的灵活,也能应对更多的情况。现在我们来对配置模块进行完善,除了已有的模块以外,我们还有一些banner ,活动入口等模块,这些模块的数据并不多,所以我们也归纳到配置中去实现。并且我们在配置表中添加了一些不同的id,我们只需要根据相对应的id 去查询对应的表就可以了
80 0
|
7月前
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
716 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
6月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
170 23
|
7月前
|
网络协议
【Azure App Service】App Service 如何配置私网域名以及证书呢?
本文解答了关于 Azure App Service 如何配置私网域名及证书的问题。App Service 不支持私网域名,自定义域名需配置在公共 DNS 服务器上。文章引用官方文档详细说明了映射自定义 DNS 的步骤,并附带参考资料链接,帮助用户深入了解相关配置方法。
142 6
|
16天前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
53 0
|
3月前
|
人工智能 文字识别 小程序
旅游社用什么工具收报名 + 资料?不开发 App 也能自动收集信息
本文探讨了旅游行业中报名信息收集的常见痛点及解决方案,重点介绍了二维码表单工具在提升信息收集效率、简化操作流程方面的优势。通过对比多种工具,分析其适用场景与实际应用逻辑,为一线旅游从业者提供高效、低成本的执行参考。

热门文章

最新文章