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": {
	// 与点击“发行”编译相同 包位置:dist/build/mp-weixin
	"build-wx": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
	// 与点击“运行”编译相同 包位置:dist/dev/mp-weixin
	"watch-wx": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
	
	// ===== 包位置:dist/dev/mp-weixin =====
	"build-pro-wx": "cross-env NODE_ENV=buildPro UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
	"build-rc-wx": "cross-env NODE_ENV=rc UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
	"build-test-wx": "cross-env NODE_ENV=test UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
	
	"watch-pro-wx": "cross-env NODE_ENV=watchPro UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
	"watch-rc-wx": "cross-env NODE_ENV=rc UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
	"watch-test-wx": "cross-env NODE_ENV=test 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') {
	/**
	 * 开发环境:用于开发期间协议调试
	 * 1、由于本司连调基本在测试环境,此处默认为测试环境。
	 * 2、如果需要本地与开发连调,可以在此处切换为: _config = dev
	 */
	_config = require('./libs/env.test.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 === 'buildPro'
			|| process.env.NODE_ENV === 'watchPro') {
	//生产环境
	_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 === 'buildPro'
	|| process.env.NODE_ENV === 'watchPro'
	|| 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 文件,可自行创建,记住这个文件名称不能改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值