采用前后端分离,所以在开发和部署的过程中,后台接口的域名、 第三方登录的URL等其他第三方链接地址等常量存在切换问题,每次打包都要修改很麻烦。
1.主要技术要点
1.1.process.env
process.env就是Nodejs提供的一个API,它返回一个包含用户环境信息的对象。如果我们给Nodejs 设置一个环境变量,并把它挂载在 process.env 返回的对象上,便可以在代码中进行相应的环境判断。具体操作看下面分析。
(1)使用要点
新建一个环境变量NODE_ENV(自定义),用它确定当前所处的开发阶段,生产阶段设为production,开发阶段设为development或staging,然后在脚本中读取process.env.NODE_ENV即可。
(2)定义环境变量
定义的时候有三种方式:
一:js代码定义配置
比如在打包配置文件build.js中定义为生产环境
process.env.NODE_ENV = 'production'
二:在cmd环境配置
Windows配置-临时配置
#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
set NODE_ENV
#如果不存在则添加环境变量
set NODE_ENV=production
#环境变量追加值 set 变量名=%变量名%;变量内容
set path=%path%;C:\web;C:\Tools
#某些时候需要删除环境变量
set NODE_ENV=
Linux配置-临时配置
#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
echo $NODE_ENV
#如果不存在则添加环境变量
export NODE_ENV=production
#环境变量追加值
export path=$path:/home/download:/usr/local/
#某些时候需要删除环境变量
unset NODE_ENV
#某些时候需要显示所有的环境变量
env
三:package.json中配置
webpack项目里,我们可以通过设置package.json来实现,但是Windows 系统和Mac系统有区别。
Windows 系统
// package.json
{
...
"scripts": {
"dev": "set NODE_ENV=development && webpack-dev-server --open --hot",
"build": "set NODE_ENV=production && --progress --hide-modules"
}
}
Mac 系统
// package.json
{
...
"scripts": {
"dev": "export NODE_ENV=development && webpack-dev-server --open --hot",
"build": "export NODE_ENV=production && --progress --hide-modules"
}
}
cross-env是一个跨平台设置环境变量的第三方包,它可以让你只配置一行命令,就能轻松地在多个平台设置环境变量。可以解决上述平台问题,改插件需要先安装:
npm install --save-dev cross-env
// package.json
{
...
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --mode=production --progress --hide-modules"
},
}
通过process.env.NODE_ENV(process是node全局),直接用就行了)
(3)环境判断
通过环境变量判断当前环境,加载对应的系统配置信息
(1)在index.html中判断加载配置
<% if (process.env.NODE_ENV === 'production') { %>
<!-- 生产环境 -->
<script>document.write('<script src="./config/systemConfig.js?t=' + new Date().getTime() + '"><\/script>')</script>
<script>document.write('<script src="./config/index.js?t=' + new Date().getTime() + '"><\/script>')</script>
<% }else { %>
<!-- 开发环境 -->
<link rel="shortcut icon" type="image/x-icon" href="./static/img/favicon.ico">
<script src="./static/config/index.js"></script>
<!-- <script src="./static/plugins/mock-1.0.0-beta3/mock-min.js"></script>-->
<% } %>
(2)在JS代码中判断
/**
* 请求地址处理
* @param {*} actionName action方法名称
*/
http.adornUrl = (actionName) => {
// 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl) + actionName
}
1.2 引入Js文件,不进行编译打包
把配置信息放在Js文件中,该文件不进行编译打包,比如在首页html文件中引入配置文件Js
<script>document.write('<script src="./config/systemConfig.js?t=' + new Date().getTime() + '"><\/script>')</script>
通过script引入,如果是import方式引入,就会经过webpack打包编译。
2.具体实现
(1)前端系统配置信息文件独立
新建配置信息文件systemConfig.js,该配置文件独立项目代码外,不会通过vue-cli进行编译打包,完全由运维人员根据发布环境进行配置,然后放入发布的指定目录。运维人员提交代码发布包时不会覆盖配置文件。
const systemConfig = {
//api接口请求地址
baseUrl: "http://10.150.24.100/erp2/cw/service/ERPII"
}
(2)配置文件加载
<% if (process.env.NODE_ENV === 'production') { %>
<!-- 生产环境 -->
<script>document.write('<script src="./config/systemConfig.js?t=' + new Date().getTime() + '"><\/script>')</script>
<script>document.write('<script src="./config/index.js?t=' + new Date().getTime() + '"><\/script>')</script>
<% }else { %>
<!-- 开发环境 -->
<link rel="shortcut icon" type="image/x-icon" href="./static/img/favicon.ico">
<script src="./static/config/index.js"></script>
<!-- <script src="./static/plugins/mock-1.0.0-beta3/mock-min.js"></script>-->
<% } %>
(3)使用配置文件
因为导入到index.html,所以在文件的每个地方都可以去访问到systemConfig.js中的常量(这个不用讲都知道)
//index-prod.js生产环境代码使用配置信息
; (function () {
window.SITE_CONFIG = {}
// api接口请求地址
// eslint-disable-next-line no-undef
window.SITE_CONFIG['baseUrl'] = systemConfig.baseUrl/
})()
网友评论