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

本文介绍了如何在uni-app中根据不同编译模式配置网络环境和动态修改manifest.json以设置不同小程序appid。通过package.json的脚本配置实现多环境编译,env.js处理环境变量,以及使用modifyManifest.js动态更新appid。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

🚩:只有同时实现了以上了两步,才算是真正的解放了自己的双手。🤩

<think>根据用户的问题,用户希望了解在UniApp中如何动态配置manifest.json文件。参考引用[1]和引用[2]中的内容,我们可以通过Node.js脚本来读取、修改并重新写入manifest.json文件,从而实现在不同环境下动态配置。 具体步骤: 1. 创建一个Node.js脚本(例如modifyManifest.js),该脚本负责读取manifest.json文件,根据环境变量修改特定字段,然后将修改后的内容写回文件。 2. 在package.json配置不同的脚本命令,以便在构建时传入环境变量。 3.UniApp项目中,确保manifest.json文件位于正确的位置(通常为项目根目录下的src/manifest.json)。 以下是一个实现示例: ### 1. 创建修改manifest.json的脚本 在项目根目录下创建`scripts`文件夹,并在其中创建`modifyManifest.js`文件,内容如下: ```javascript // scripts/modifyManifest.js const fs = require('fs'); // 获取命令行参数,例如:node modifyManifest.js --mode=dev const mode = process.argv.find(arg => arg.startsWith('--mode='))?.split('=')[1] || 'prod'; const manifestPath = './src/manifest.json'; let manifest = fs.readFileSync(manifestPath, { encoding: 'utf-8' }); // 将manifest.json解析为JSON对象 const manifestObj = JSON.parse(manifest); // 根据环境修改需要的字段,例如修改h5路由的base路径 const baseMap = { dev: '/dev/', prod: '/prod/', test: '/test/' }; // 设置h5.router.base字段 if (manifestObj.h5 && manifestObj.h5.router) { manifestObj.h5.router.base = baseMap[mode] || baseMap.prod; } else { // 如果h5.router不存在,则创建 if (!manifestObj.h5) manifestObj.h5 = {}; if (!manifestObj.h5.router) manifestObj.h5.router = {}; manifestObj.h5.router.base = baseMap[mode] || baseMap.prod; } // 将修改后的JSON对象转换回字符串,并写回文件 fs.writeFileSync(manifestPath, JSON.stringify(manifestObj, null, 2)); ``` ### 2. 配置package.json脚本 在package.json中添加脚本命令,以便在构建前执行修改操作: ```json { "scripts": { "dev": "node scripts/modifyManifest.js --mode=dev && uni-app vue-cli-service serve", "build:prod": "node scripts/modifyManifest.js --mode=prod && uni-app vue-cli-service build", "build:test": "node scripts/modifyManifest.js --mode=test && uni-app vue-cli-service build" } } ``` ### 3. 注意事项 - 在运行脚本修改manifest.json后,再进行构建(如发行到H5、App等)。 - 由于manifest.json在项目构建时会被读取,因此确保在构建前完成修改- 如果使用HBuilderX运行,上述方法可能不适用,因为HBuilderX有自己的构建流程。建议在命令行中使用配置好的脚本命令。 ### 另一种方法:使用环境变量和条件编译 如果只是需要修改少量字段,也可以考虑使用条件编译。在manifest.json文件中,我们可以使用条件注释(但注意,官方并不支持manifest.json中使用条件编译)。因此,使用Node.js脚本修改是更通用的方法。 ### 总结 通过Node.js脚本动态修改manifest.json文件,可以在构建前根据环境变量调整配置。这种方法适用于需要动态修改配置的场景,例如切换不同环境下的API地址、应用基础路径等。 §§相关问题§§ 1. 如何在UniApp配置多环境变量? 2. UniAppmanifest.json文件支持哪些配置项? 3. 如何在不同平台(H5、App、小程序)下动态配置manifest.json?</think>在 UniApp动态配置 `manifest.json` 文件可以通过 Node.js 脚本实现,核心思路是:**在构建过程中读取 manifest 文件 → 根据环境变量修改配置 → 重新写入文件**。以下是具体实现方法: --- ### 方法一:使用 Node 脚本修改(推荐) ```javascript // modifyManifest.js const fs = require('fs'); const manifestPath = './src/manifest.json'; // UniApp 默认路径 // 1. 读取 manifest.json let manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); // 2. 根据环境变量动态修改 const env = process.env.NODE_ENV || 'dev'; // 通过命令行传入 const baseMap = { dev: 'https://dev-api.example.com', prod: 'https://api.example.com', test: 'https://test-api.example.com' }; // 修改网络请求域名(以微信小程序为例) manifest['mp-weixin'].appid = env === 'prod' ? 'PROD_APPID' : 'TEST_APPID'; manifest['h5'].router.base = baseMap[env]; // 3. 重新写入文件 fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); console.log(`✅ Manifest updated for ${env} environment`); ``` #### 配置 package.json ```json { "scripts": { "build:dev": "NODE_ENV=dev node modifyManifest.js && uni-build", "build:prod": "NODE_ENV=prod node modifyManifest.js && uni-build" } } ``` --- ### 方法二:条件编译(简单场景) 适用于少量动态配置: ```json // manifest.json { "h5": { "router": { "base": "/*#if NODE_ENV=='prod'*/ /prod/ /*#else*/ /dev/ /*#endif*/" } } } ``` 在 `package.json` 中配置构建命令: ```json { "scripts": { "build:dev": "cross-env NODE_ENV=dev uni-build", "build:prod": "cross-env NODE_ENV=prod uni-build" } } ``` --- ### 关键说明 1. **路径问题** UniApp 默认的 manifest 路径为 `./src/manifest.json`(Vue CLI 创建的项目)[^1] 2. **修改原理** 通过 Node.js 的 `fs` 模块读写文件,在构建流程中动态注入配置值[^2] 3. **环境变量传递** 使用 `process.env` 接收命令行参数(如 `NODE_ENV=prod`) 4. **安全提示** 避免将敏感信息(如 AppID)直接硬编码在脚本中,建议使用 `.env` 文件管理 --- ### 示例场景 假设需要动态配置微信小程序的 AppID: ```javascript // 从环境变量文件读取 require('dotenv').config(); manifest['mp-weixin'].appid = process.env.WX_APPID; ``` --- ### 注意事项 1. 脚本需在构建命令**之前**执行 2. HBuilderX 用户需通过自定义脚本触发 3. 修改后需重新编译生效 4. 使用 `JSON.stringify` 的第三个参数保持缩进格式
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值