百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

uni-app 多环境部署方案_开发uniapp的环境配置

liuian 2025-09-01 08:17 49 浏览

前言

最近几周都在处理公司的移动业务,而为在后期能统一多端,解放自己,迎合公司的技术栈;选用了 uni-app 来开发。开发前期重新对公司移动业务做深入了解,重构大部分业务逻辑,也抽离出基础组件;但实际到部署的时候,出现来问题;由于现在只考虑 H5 端,部署和测试会出现多环境配置,但是我使用的 HBuilderX 工具创建的工程,所以只存在开发环境:development 和生产环境: production

尝试几种方式

查询官网 和论坛并没有很好的配置方案;官网的一些配置可以提供参考。

  • package.json

对于根目录下 package.json 里可以提供对不同平台的编译处理,这里指不同平台并不是不同环境,环境还是只有开发和生产两种环境

  • vue.config.js

由于没有使用 VUE3 来开发,所以默认的配置项还是基于 webpack 。如果项目根目录没有该配置项,可以自行创建 vue.config.js 文件,但是很遗憾还是没有可以处理多种环境下的一个配置。而且它还存在一些约束:


image.png

不过它可以添加一些自定义的变量

const webpack = require('webpack')

module.exports = {
  chainWebpack: config => {
    config
      .plugin('define')
      .tap(args => {
        args[0]['process.env'].VUE_APP_TEST = '"test"'
        return args
      })
  }
}

解决方案

多环境部署,实际是需要对应自己部署环境,存在不同配置项。而实际业务中存在的环境可以是无限的,一般最基础而言需要三种:

  • 开发环境
  • 测试环境
  • 生产环境

对于公司现有业务,只针对 H5 端,需要的配置可能只有:

  • 接口:开发、测试、生产对应的接口配置不同
  • 部署路径:测试、开发对应的部署路径不同

如果我们解决这两个,那部署方案实现一大半。对于环境配置,从 vue-cli 中可以看到很多;cli 配置基于 .env.x 不同文件来获取不同配置项,这里我们可以参考它来自己实现获取配置项。

部署方式

部署方式,通过命令行来解决;后续可以更好的对接自动化部署,而项目中通过 HBuilderX 工具创建,需要使用它的 cli 程序,它支持常见的三端打包;H5 端打包命令,在 package.json 设置:

"build": "cli publish --platform h5 --project 项目名称",

获取接口

项目根目录创建不同环境下需要的配置:.env.test.env.prod

# .env.test
NODE_ENV=test
BASE_API = '/test'
h5.router.base_config = '/h5/'
h5.title_config = 'h5'

实际上我们只需要测试和生产两种配置,开发配置项在代码内部修改,这样可以增加效率,不用每次修改后,再重启项目。

配置项对应不同环境,而环境可以通过在 package.json 中设置不同参数来区分;

 "scripts": {
  "build:config:test": "node ./deploy/index --mode=test",
  "build:config:prod": "node ./deploy/index --mode=prod",
 },

可以获取 process.argv 变量读取到设置的环境;后续还想设置什么变量也可以在后面直接添加,类似:--test=test

// yargs.js
module.exports = function() {
 let args = process.argv;
 let argv = {};
 for (let i = 2; i < args.length; ++i) {
  let cur = args[i];
  if (/^(--)(\S*)(=)/.test(cur)) {
   const keys = cur.split('=')
   argv[keys[0].slice(2)] = keys[1];
  }
 }
 return argv
}

/**
 * {
 *      mode: 'test'
 * }
 */

获取配置后,需要读取配置,这里直接使用 nodefs 模块读取文件内容

const fs = require('fs')
const path = require('path')
// 解析函数
function parse() {
    ...
}

module.exports = function() {
    // 获取环境
 const config = yargs();
 
 const env = config.mode;
 const envPath = path.resolve(__dirname, '../../') + '/.env.' + env
 
 try{
  const data = fs.readFileSync(envPath, 'utf8')
        // 解析文件
  return parse(data)
 }catch(e){
  console.log('读取env出错:' + JSON.stringify(e));
 }
}

其中解析函数,由于不想新增依赖增加项目负担,直接参考 dotenv 的 parse 函数解析出文件内容;得到类似的对象:

{
    NODE_ENV: 'test',
    BASE_API: '/test',
    // ...
}

解析出配置内容,接下来动态配置文件;由于项目存在可能部署在客户内网环境下,这里采用动态生产一个共用的配置文件,在项目获取该配置项;后续运维人员可以想配置什么就配置什么。

// 写入 /static/global.js
writeGlobalConfig()

function writeGlobalConfig() {
 const _global = {}
 for (let key in config) {
  if (key.includes('_API')) {
   _global[key] = config[key]
  }
 }
 const data = `window._GLOBAL__ = ${JSON.stringify(_global)}`
 fs.writeFileSync(path.resolve(__dirname, '../static/global.js'), data)
}

在项目中生产环境下取公用配置项

const NODE_ENV = process.env.NODE_ENV;

/// 默认根目录模板 tempalte.h5 模板引入全局接口 static/global.js
const GLOBAL_CONFIG = window._GLOBAL__ || {};

const defaultAPI = {
 BASE_API: {
  development: ['/test'],
  production: GLOBAL_CONFIG.BASE_API,
 },
 SOCKET_API_BIDDIGN: {
  development: ['ws://test'],
  production: GLOBAL_CONFIG.SOCKET_API_BIDDIGN,
 },
    // ...
}

部署路径

PC 端或者是 H5 测试和生产环境上的部署路径可能会不同;由于创建项目使用其开发工具创建,需要统一工具和更方便的更新 uni-app,不考虑使用 vue-cli 方式。只能动态修改 manifest.json 文件。

uni-app 的部署路径是修改 manifest.jsonh5.router.base。对应 Router 中的 base

// manifest.js
const fs = require('fs')
const path = require('path')

const manifestPath = path.resolve(__dirname, '../../') + '/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')
}
module.exports = function(options) {
 for (let key in options) {
  replaceManifest(key, `"${options[key]}"`)
 }
 fs.writeFileSync(manifestPath, Manifest, {
   "flag": "w"
 })
}

前面我们已经获取到配置文件内容,这里可以直接修改文件;这里需要给一个标明这是修改 manifest.json 的后缀。

h5.router.base_config = '/h5/'
h5.title_config = 'h5'

这里配置项如果 _confg 结束的变量就是修改 manifest.json

const path = require('path')
const fs = require('fs')
const env = require('./modules/readEnv')
const parseManifest = require('./modules/manifest')
const config = env();

function writeManifest() {
 const _global = {}
 for (let key in config) {
  if (key.includes('_config')) {
   const k = key.slice(0, -7)
   _global[k] = config[key]
  }
 }
 parseManifest(_global);
}

命令行

准备工作完成后,可以编写对应的命令,来简化我们的操作;

 "scripts": {
  "build": "cli publish --platform h5 --project test-h5",
  "build:config:test": "node ./deploy/index --mode=test",
  "build:config:prod": "node ./deploy/index --mode=prod",
  "build:prod": "npm run build:config:prod && npm run build",
  "deploy:test": "npm run build:config:test && npm run build && fd-cli"
 },

&& 符号是串行命令;& 是并行命令,其中 fd-cli 是个部署命令,也是我以前基于业务需要开发的一个前端简易部署命令。

其他

这里只针对 H5 端做了处理,如果需要做多平台,也可以在命令行后面接不同平台参数,然后在部署打包前处理好逻辑;比如在打包前根据自己定义的环境变量添加参数

// vue.config.js
const webpack = require('webpack')

// 生成不同环境不同平台的配置
const config = require('./config')

module.exports = {
  chainWebpack: config => {
    config
      .plugin('define')
      .tap(args => {
        // config.VUE_APP_TEST
        for(let key in config) {
            args[0]['process.env'][key] = `"${config.VUE_APP_TEST}"`
        }
        return args
      })
  }
}

总结

在开发阶段完成后,需要特别注意一些重复的步骤或者是需要手动修改的操作,只要是手动修改,就会增加上线分险,特别是后来者接受项目的时候。当然也要文档齐全

相关源码:地址

- END -

相关推荐

电脑如何下载打印机驱动并安装
  • 电脑如何下载打印机驱动并安装
  • 电脑如何下载打印机驱动并安装
  • 电脑如何下载打印机驱动并安装
  • 电脑如何下载打印机驱动并安装
微软售后维修点(微软售后维修点江门)
  • 微软售后维修点(微软售后维修点江门)
  • 微软售后维修点(微软售后维修点江门)
  • 微软售后维修点(微软售后维修点江门)
  • 微软售后维修点(微软售后维修点江门)
window7下载steam(window7下载一键重装如何恢复网络)

回答如下:要在Windows7上下载Steam,您可以按照以下步骤操作:1.打开您的浏览器,访问Steam官网(https://store.steampowered.com)。2.点击页面右上角...

系统还原没有还原点怎么办(系统还原点不动怎么办)

如果电脑没有创建还原点,就不能使用系统还原来回到之前的状态。但是,可以尝试使用其他备份工具或软件来恢复数据或重建系统。比如,可以使用第三方备份软件来备份重要文件和数据。如果是系统出现问题,可以尝试重新...

正在准备windows(正在准备windows请勿关机怎么办)

这个情况在使用华为电脑时可能会遇到。一般来说,这是因为电脑正在进行系统更新或者安装软件程序等操作,导致启动时间较长。如果电脑显示“正在准备Windows,请勿关闭电源”,则说明电脑正在进行系统更新。...

有win10安装包怎么装系统(win10安装包安装教程)
有win10安装包怎么装系统(win10安装包安装教程)

如果是原版ISO镜像,可以加载到虚拟光驱直接安装。如果是第三方更改的就需要启动盘。个人建议用U盘启动盘来安装。下载一个u盘启动盘程序(优启通、大白菜……),按照提示把它安装到U盘。启动盘制作完毕以后,启动电脑安快捷键选择U盘启动。进入pe后...

2026-01-14 16:37 liuian

gho怎么变成iso文件(gho改成iso)

要将GHO转换为ISO,您需要使用GHO映像转换器软件。以下是执行此操作的步骤:1.下载和安装GHO映像转换器软件。2.运行转换器软件,并单击“打开”按钮。3.在弹出窗口中,选择要转换的GHO...

office和visio安装顺序(office和visio怎么一起安装)

在某些情况下,安装Visio可能会发生与Office365冲突的问题。这是因为Visio和Office365具有不同的版本,可能会导致安装时出现错误或兼容性问题。为了避免这种冲突,...

小白一键装系统(小白一键系统重装)
  • 小白一键装系统(小白一键系统重装)
  • 小白一键装系统(小白一键系统重装)
  • 小白一键装系统(小白一键系统重装)
  • 小白一键装系统(小白一键系统重装)
电脑中病毒的原因(电脑中病毒正常吗)

电脑中毒的原因有以下几方面:1.网页被挂病毒。2.电脑裸奔,无防病毒软件。3.执行一些不安全的程序。4.U盘等不安全介质。5.电脑漏洞不及时补,被后台种毒。为了电脑不中病毒要注意以下几方面:1.更新系...

手机psd转换成jpg最简单方式

可以使用photoshop工具,方法如下:1、首先打开PS软件,然后选择自己需要的JPG格式的图片,在PS中打开。2、接下来先按快捷键“Ctrl+j”将图片复制出来,防止后面操作对原图片有损...

qq好友回复恢复官网(官方qq好友恢复)
  • qq好友回复恢复官网(官方qq好友恢复)
  • qq好友回复恢复官网(官方qq好友恢复)
  • qq好友回复恢复官网(官方qq好友恢复)
  • qq好友回复恢复官网(官方qq好友恢复)
win7提示激活码过期怎么办(win7激活已过期)

以win7为例,出现这样的问题原因分析:电脑的win7系统激活过又重新提示要激活的原因是因为微软对网络上的秘钥进行封杀所以导致我们激活无效。具体的解决方法:1、我们打开dos命令窗口,在创立中输入“s...

联想笔记本光驱驱动下载(联想电脑光驱驱动器在哪)

开机时进入BIOS,具体按什么牌子不同,按键也不同,开机有提示的,选择启动项,把光驱启动的顺序放到第一.按F10保存,重新启动就是光驱启动啦不需要设置光驱驱动,笔记本自带光驱驱动光驱是电脑的硬件设备,...

win10装机必备实用软件(win10电脑装机必备软件)

1、office大部分的版本如office2007、office2000、office2011、office2013、office2016、office365等都支持win10。2、需要注意...