【技巧】ionic3多环境配置详解

一个项目常常会有几个开发环境:

  • prod
  • dev
  • test

对于发布调试,不少人采用的是改变常量的方式来构建,如:

// domain = "http://192.168.93.35:9003/demo";    //正式环境
domain = "http://localhost:8080/demo-rest";     //测试环境

这种方式稍显麻烦,也容易误操作,而比较优雅的方式是通过配置文件和命令行参数结合来实现。

具体操作,可以看以下网页:
https://github.com/gshigeto/ionic-environment-variables

也可以试着我下面说的使用,这是我看国外一篇文章的方法,但是有个bug被我处理了,而原文链接我没保存,所以不贴原文了。

原理是通过环境变量读取同名配置文件。

步骤:

一、创建配置文件

ionic(特别注意“只”字)使用了dev和prod两个环境,通过IONIC_ENV环境变量存储,如果你觉得够用了,就借用该变量,否则就自定义环境变量。此时创建两个配置文件:

config/dev.json
config/prod.json

内容类似如下:

{
    "mode": "prod",
    "url": "http://prod"
}

二、使用自定义webpack配置项

这是ionic多环境配置几种方案中的共同核心部分,打开 package.json 文件,在根节点添加如下内容:

"config": {
    "ionic_webpack": "./config/webpack.config.js"
},

同时新建文件:

config/webpack.config.js

里面内容为:

const webpackConfig = require('../node_modules/@ionic/app-scripts/config/webpack.config');
const webpack = require('webpack');

const ENV = process.env.IONIC_ENV;
const envConfigFile = require(`./${ENV}.json`);
const modeConfig = envConfigFile.mode;
const urlConfig = envConfigFile.url;

webpackConfig[ENV].plugins.push(
    new webpack.DefinePlugin({
        webpackGlobalVars: {
            mode: JSON.stringify(modeConfig),
            url: JSON.stringify(urlConfig)
        }
    })
);

意思好理解,就是读取json配置文件的值给自定义webpack插件。

三、使用自定义服务来调用自定义变量

在自定义的Provider中使用webpackGlobalVars即可,在此新建一个ConfigurationProvider来测试下:

import { Injectable } from '@angular/core';

declare const webpackGlobalVars: any;
@Injectable()
export class ConfigurationProvider {
  static getDomainInfo(): any {
    const domainInfo =  webpackGlobalVars;
    return domainInfo;
  }
  static test(){
    alert(JSON.stringify(webpackGlobalVars));
  }
}

当执行ionic serve时,编译使用的是dev的环境,所以会弹出dev.json的内容:

image.png

而使用--prod参数打包后,使用的会是prod.json的内容。


补充扩展——三个或者以上环境变量处理

因为ionic使用IONIC_ENV环境变量,默认只支持dev和prod两种环境,对于增加像testlocal等环境是不支持,这时这可借助Node的自定义环境变量进行操作。

Node的环境变量可以这样设置:

Windows: set NODE_ENV=env

Linux或Mac: export NODE_ENV=env

这样会存在开发环境差异,建议安装cross-env实现统一配置:

统一开发环境:
安装:npm i cross-env -D
使用:cross-env NODE_ENV=env

所以,保持前文所说的内容,调整如下:

1. package.json修改为以下之一:

Windows:

    "scripts": {
        "start": "set RUN_ENV=test && ionic-app-scripts serve",
        "build": "set RUN_ENV=prod && ionic-app-scripts build --prod",
    }

Linux或Mac:

    "scripts": {
        "start": "export RUN_ENV=test && ionic-app-scripts serve",
        "build": "export RUN_ENV=prod && ionic-app-scripts build --prod",
    }

统一环境(注意这里没有“&&”):

    "scripts": {
        "start": "cross-env RUN_ENV=test ionic-app-scripts serve",
        "build": "cross-env RUN_ENV=prod ionic-app-scripts build --prod",
    }

2. webpack.config.js修改为:

const webpackConfig = require('../node_modules/@ionic/app-scripts/config/webpack.config');
const webpack = require('webpack');
const ENV = process.env.IONIC_ENV;
const RUN_ENV = process.env.RUN_ENV || 'dev';
console.log(`当前环境:${RUN_ENV}`);
const envConfig = require(`./${RUN_ENV}.json`);
// 把配置项灵活添加到webpack配置
let globalVars = {};
for(var item in envConfig){
    globalVars[item] = JSON.stringify(envConfig[item]);
}
//注意这里是ENV,因为这是覆盖Ionic的默认webpack配置,Ionic只有dev和prod两项配置,填其它会报错,直接取IONIC_ENV就行了,test、local等配置项实际仍是挂在原有的打包环境下的。
webpackConfig[ENV].plugins.push(
    new webpack.DefinePlugin({
        webpackGlobalVars: globalVars
    })
);

这样就大功告成了,其中注意这个注释说明:

注意这里是ENV,因为这是覆盖Ionic的webpack配置,Ionic只有dev和prod两项配置,填其它会报错,直接取IONIC_ENV就行了,test、local等配置项实际仍是挂在原有的打包环境下的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容