在线上项目的开发中,我们经常会有一个测试服务器一个正式服务器,当我们开发时我们会去使用测试服务器的接口地址,而发版时会把地址改为正式服务器的地址,因此我们可能会在两个地址来回切换(有可能还有更多环境,每个环境的请求地址都不同),甚至有时由于疏忽,会在发版时使用了测试服务器的地址。
这里,我通过webpack的definePlugin以三种方式来解决这个问题
官方文档时这么说的,我们可以通过配置这个插件,在[生产/开发]构建中使用不同的服务URL
具体使用:
第一种方式
直接在插件中写死,这样环境只能区分开发环境和生产环境 不能设置更多的环境
webpack.config.js
new
until.js
这样定义完我们就可以每次需要网络请求直接把host地址import进去
const
但是注意 一定要加/* eslint-disable no-undef */这句话
因为eslint认为这个全局变量是没有定义过的
我们直接使用可以拿到,但是eslint会让这里编辑失败
报错DEVELEPMENT is not defined
通过这句话,我们可以让eslint 对这段代码不做undefined判断
第二种方式
(这种方式实现是我早期使用的方法,第三种方式是第二种方式更优雅的实现,懒得看可以直接看第三种)
通过process.argv和配置文件.env.development的方式配置多种环境的请求地址
首先是.env.development配置开发环境的请求地址
其实这个的原理和第一种方法是一样的 只不过把开发环境的配置单独抽离出去了(根据webpack的文件系统,它会自动识别.env.development的配置)
wepack.config.js
new
这句话的意思是DefinePlugin引入.env文件的配置信息
.env.development
REACT_APP_API
然后我们任何文件都能通过process.env.REACT_APP_API访问到这个地址
console
控制台的输出:
这时其实我们已经拿到在.env.development 写入的全局变量,这时我们注意另外一个变量
console
这时控制台的输出是:
我们了解一下process.defineEnv是干什么的
node.js提供了process.argv来获取npm/yarn的命令参数
所以我们可以通过配置package.json来配置命令拿到我们全局变量
首先配置一个方法来解析参数
filterArg.js
module
修改wepack.config.js
new
然后配置package.json
"scripts"
我们测试一下npm run build:dev
输出process.defineEnv
console
控制台结果:
我们拿到了命令参数-api的值http:192.168.1.1
这样其实我们就达到了我们的效果
如果在开发环境我们就直接使用process.env.REACT_APP_API 的请求地址
当我们要运行在不同的生产环境时
我们就配置不同的build:xx 的 脚本 然后运行
在项目中使用process.defineEnv.REACT_APP_API
until.js
const
第三种方式(通过文件的方式优雅的实现第二种逻辑)
这里我们定义三种环境dev、pro、test(跟以前的开发环境、生产环境没有任何关系,是我们自己定义的三种环境)
首先我们先引入一个yargs
其实这个东西跟process.argv功能上并没有什么区别,但是process.argv的可配置性不高,所以这里使用yargs
$
这里我们同样定义一个文件来解析我们脚本里的参数
webpack.env.conf.js
// 定义参数配置
const argv = require('yargs').argv;
// 获取脚本种的参数e
const env = argv.e;
// require指定的环境配置文件 这个是一个文件名 看到下面你就理解了
const envConfigFile = "../config/env/" + env + ".env.js";
// 将require的配置文件原封不动export回出去
module.exports = require(envConfigFile);
为了方面你们理解envConfigFile这个参数是干什么用的 我先把文件目录给你们展示出来
其实envConfigFile就是env 文件夹下面三个文件的名称
然后配置webpack
webpack.config.js
const
dev.env.js
'use strict'
pro.env.js
'use strict'
test.env.js
'use strict'
配置脚本
package.json
"scripts"
运行 npm run start:dev
输出:
useEffect
控制台:
这个方式配置是不区分webpack自己定义的开发环境和生产环境,是我们自己定义的dev、pro、test三种环境,所以npm start和npm run build是一样的
具体原理上的,方法1和方法2看明白了,其实这个很好理解 所以我写的解释可能少了些
总结:
如果我们的项目只有一个生产环境和开发环境时我推荐使用第一种配置方式,因为它非常简单快捷。
当我们有多个生产环境时,建议使用第三种或是第二种方式,千万不要直接在项目中写入多个host,然后在对环境中把其他host注释掉,这样写的话非常繁琐,还容易出错。