在开发中经常会有一些需求,根据不同的环境进行不同的操作,比如 url 的替换,dev 环境在 dev 的 url,而线上使用 prd 的环境。在titanOne design pro模块中就有这样一个环境变量IDE,我们希望区分当前业务项目所依赖的版本区分electron or web环境,方便做好封装方法的兼容性。
环境变量可在.env中配置,也可以在package.json中scripts中通过cross-env来设置(只生效当前命令)。比如:
package.json:
{"scripts": {"start:no-mock": "cross-env MOCK=none zebra dev","dev": "cross-env IDE=electron zebra dev"}}
.env:
PORT=8080appName=quickstartBUILD_TYPE=MCOMPATIBLE_MODE=1
config 中使用
在config/config.js中可定义define,这样可以在项目中来使用它,处理兼容性。
比如:
"define": {"process.env.TEST": 1,"USE_COMMA": 2,}
处理在lint 中的报错
config 是 node 环境,所以可以直接用 process.env 的来直接拿到环境变量,但是在 js 的代码中,您使用 process.env可能只会获得 NODE_ENV这个在约定俗称的变量,别的变量 webpack 并不会自动帮你注入。
关于 process.env 和 NODE_ENV看这里.
这时候我们就需要使用 define,他是根据define-plugin,在 Pro 中我们也是用了这个特性,在 config 中将 node 的环境变量注入 define 配置中
export default {//some configdefine: {'process.env.IDE_ENV': process.env.IDE || 'web',},// ....};
使用的时候只需要如下设置,具体代码:
if (process.env.IDE_ENV === 'electron') {Eui.Vars.loginStatus = false;Eui.Main.send('needless-login');} else {window.location.href = '../login/index.html';}
这里需要注意的是我们不需要通过 window[‘key’]的方式来使用它,而是直接使用。具体原理可以看一下define-plugin插件的实现。
umi默认的环境变量
umi中提供了大量的默认环境变量,这些变量可以帮助我们自动一些脚手架功能。除此之外,扩展以下环境变量。
IDE_ENV
默认web,可定义当前运行环境,比如:
IDE_ENV=electron
BUILD_TYPE
默认none,当定义为M时,表示定应用模式(即:项目打包独立的 *.asar),以多应用方式加载。
BUILD_TYPE=M
备注: 当前公司客户端解决方案,要求打包模式。
appName
默认app,多应用场景下,必须按项目定义,该名称与asar包名一致。
package.json中定义scripts:
"compile:asar": "asar pack dist/electron/quickstart ../dist/electron/quickstart.asar"
.env中:
appName=quickstart
buildDir
默认dist,编译输出基准目录,可自定义,比如,web版本编译:
"compile:source:web": "cross-env IDE=web buildDir=../dist zebra build"
EUI3_CUSTOMIZE_THEMES
默认eui3.5-customize-themes,可自定义3.5版本主题包,比如:
EUI3_CUSTOMIZE_THEMES=eui3.5-xpads-themes
提示:自行在package.json中devDependencies添加
@erayt/eui3.5-xpads-themes依赖。
EUI2_THEMES
默认eui2-theme,可自定义3.0版本主题包,比如:
EUI2_THEMES=eui-xpads-theme
提示:自行在package.json中devDependencies添加
@erayt/eui-xpads-theme依赖。
CUSTOMIZE_LOGIN_MODULE
可自定义引用登录模块,比如,引用个性化egate登录包:
CUSTOMIZE_LOGIN_MODULE=titanOne3.0-electron-login-egate-standard
备注:包名的组默认
@erayt忽略,需要在devDependencies中增加依赖:
"@erayt/titanOne3.0-electron-login-egate-standard": "^4.0.1",
COMPATIBLE_MODE
默认none, 定义是否兼容3.0版本功能,比如:消息(相关方法)、jspanel、消息盒子等。
可设置
COMPATIBLE_MODE=1
来开启(基于3.0版本项目升级需开启,可参考升级到3.5版本)。
INTEGRATED_EDOC
默认none,定义是否集成edoc相关支持。可设置
INTEGRATED_EDOC=1
来开启。
环境变量代码中报错的处理方式
由于环境变量是直接使用,不会通过 window 对象的方式来使用,在 eslint 和 TypeScript 中都会报错。
eslint 中可以通过增加 globals 的配置来处理报错。代码看起来是这样的
{
globals: {
page: true,
},
}
在 TypeScript 可以在typings.d.ts 中进行定义:
declare var ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: string;
