关于项目中环境变量的总结

背景

项目环境一般分为开发环境,测试环境,线上环境

因为每个环境的接口域名、webpack 配置都是不同的,所以在打包构建时,我们需要区分这些环境,这时就用到了环境变量

在工作中使用到了两种方法来区分,下面将这两种方式一一列举出来

技术框架是vue-cli@2.x

首先看下下面的解释,后面会用到

< process 对象是一个全局变量,提供 Node.js 进程的有关信息以及控制进程。 因为是全局变量,所以无需使用 require()

< process.env属性返回一个包含用户环境信息的对象

一、process.env.npm_config_argv和webpack的插件DefinePlugin配合使用

process.env.npm_config_argv可以获取npm命令行的参数

一般我们build时,会根据不同环境使用相应环境的接口域名,我们可以在执行build时添加参数

在package.json里面scripts的字段配置如下

"scripts": {
"dev": "node build/dev-server.js",
"start": "npm run dev",
"build": "node build/build.js"
}

config文件目录如下

    |---config 启动配置
|---index.js 项目配置文件
|---dev.env.js 开发环境变量
|---test.env.js 测试环境变量
|---prod.env.js 生产环境变量

config/dev.env.js里面的代码如下

    module.exports = {
NODE_ENV:'"development"',
ENV_NAME:'"development"',
API_ROOT:'"//www.test.abc.cn"'
}

config/test.env.js里面的代码如下

    module.exports = {
NODE_ENV:'"production"',
ENV_NAME:'"test"',
API_ROOT:'"//www.test.abc.cn"'
}

config/prod.env.js里面的代码如下

    module.exports = {
NODE_ENV:'"production"',
ENV_NAME:'"production"',
API_ROOT:'"//www.abc.cn"'
}

config/index.js里面的代码如下


if (process.env.ENV_NAME === 'development') {
module.exports = require('./dev.env.js')
} else if (process.env.ENV_NAME === 'test') {
module.exports = require('./test.env.js')
} else {
module.exports = require('./prod.env.js')
}

注意:因为是和webpack的插件DefinePlugin配合使用的,所以上面环境变量的代码需要先写单引号再写双引号

修改config/index.js文件里面部分配置如下

    var _origin = JSON.parse(process.env.npm_config_argv).original

    module.exports = {
build: {
env: (_origin[2] && _origin[2] == '--test') ? require('./test.env') : require('./prod.env')
...
},
dev: {
env: require('./dev.env'),
...
}
}

在build/webpack.base.conf.js里面修改部分代码如下

    var env = config.dev.env
var webpackConfig = merge(baseWebpackConfig, {
...
plugins: [
new webpack.DefinePlugin({
'process.env': env
}),
...
]

在build/webpack.prod.conf.js里面修改部分代码如下

    var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
...
plugins: [
new webpack.DefinePlugin({
'process.env': env
}),
...
]

测试环境:在终端输入 npm run build --test

线上环境:在终端输入 npm run build --prod

在代码里面使用环境变量

src/api/index.js

    import axios from 'axios'
const root = process.env.API_ROOT
export const requestLogin = params => {
return axios.post(`${root}/api/jiekou`, params).then(res => res.data)
}

二、使用cross-env配置

一般直接在package.json里面scripts的字段配置如 "build:test":"NODE_ENV=production ENV_NAME=test node build/build.js",

在代码的编译环境中可以直接process.env.ENV_NAME取到刚才设置的ENV_NAME环境变量

由于在windows平台上执行npm run build:test 时遇到NODE_ENV=production会卡住,所以cross-env就出来了,不同平台使用唯一指令,无需担心跨平台问题

安装cross-env包

执行npm i --save-dev cross-env

在package.json里面scripts的字段配置如下

"scripts": {
"dev": "cross-env NODE_ENV=development ENV_NAME=development node build/dev-server.js",
"start": "npm run dev",
"build:test":"cross-env NODE_ENV=production ENV_NAME=test node build/build.js",
"build:prod":"cross-env NODE_ENV=production ENV_NAME=production node build/build.js"
}

config文件下面的内容和上面的第一种方法里面的config配置的一样

上面的配置完成后就可以在编译环境中就可以使用process.env.设置的变量名 来使用了

但是如果想在执行环境中使用设置的环境变量是访问不到的,因为process对象是提供 Node.js 进程的有关信息以及控制进程,在执行环境下是访问不到的

所以如果在不光在编译环境下使用还要在执行环境中使用,有一下两个方案,下面的两个方案都是基于上面的cross-env配置的

  1. 使用插件 DefinePlugin,配置如下

    在build/webpack.base.conf.js里面修改部分代码如下
    var env = config.dev.env
var webpackConfig = merge(baseWebpackConfig, {
...
plugins: [
new webpack.DefinePlugin({
'process.env': env
}),
...
]

在build/webpack.prod.conf.js里面修改部分代码如下

    var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
...
plugins: [
new webpack.DefinePlugin({
'process.env': env
}),
...
]

这样配置后,在执行环境中可以直接使用process.env.设置的变量名来访问设置的环境变量

在代码里面使用环境变量

src/api/index.js

    import axios from 'axios'
const root = process.env.API_ROOT
export const requestLogin = params => {
return axios.post(`${root}/api/jiekou`, params).then(res => res.data)
}

2.不使用DefinePlugin插件,在业务代码里面需要用到环境变量的地方引入import appConst from '/config/index'

使用的时候直接用appConst.设置的变量名

注意,使用此方法,需要将config文件夹下的各个环境配置文件里面的内容的引号去掉

// config/test.env.js里面的代码如下
module.exports = {
NODE_ENV:'"production"',
ENV_NAME:'"test"',
API_ROOT:'"//www.test.abc.cn"'
}
// 改为
module.exports = {
NODE_ENV:"production",
ENV_NAME:"test",
API_ROOT:"//www.test.abc.cn"
}

测试环境:在终端输入 npm run build:test

线上环境:在终端输入 npm run build:prod

看了上面两种方法,小伙伴觉得哪种更方便呢,个人觉得方法二用cross-env更方便,推荐使用

vue项目的环境变量的更多相关文章

  1. Vue ---- 项目与环境搭建 初始项目结构 Vue生命周期

    目录 1. vue环境搭建 2. Vue项目搭建 pycharm配置并启动vue项目 3 . 认识项目 1. vue项目目录结构 2. 配置文件:vue.config.js 3. main.js 4. ...

  2. vue项目windows环境初始化

    下载nodejs zip包并加载到环境变量 nodejs的版本最好使用12版,而不是最新版 npm install webpack -gnpm install -g yarnyarn config s ...

  3. Java项目中环境变量的问题

    刚入职程序员的小朋友,第一次往eclipse导入项目总会出现这样那样的错误. 总结了几种查看和处理的方法: 1.打开project-->clean.然后build.目的将工程中的.class文件 ...

  4. Vue项目使用CSS变量实现主题化

    主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件.现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了.最近,使用C ...

  5. Vue 项目分环境打包

       我们开发项目的时候,用vue-cli 2.x版本新建的项目,只有dev, pro两种开发环境, 有时需要个test环境来给测试使用,所以找了很多方法,总结了个最简单的方法来给大家使用 packa ...

  6. node项目设置环境变量

    在UNIX系统中: $ NODE_ENV=production node app 在Windows中: $ set NODE_ENV=production $ node app 这些环境变量会出现在程 ...

  7. Vue项目分环境打包的实现步骤

    转:https://blog.csdn.net/xinzi11243094/article/details/80521878 方法一:亲测真的有效 在项目开发中,我们的项目一般分为开发版.测试版.Pr ...

  8. vue项目eslint环境配置与vscode配置eslint

    eslint基础环境搭建 全局安装eslint:npm install eslint -g 项目eslint初始化:eslint --init,按团队或自己的编程风格回答三道题. ? How woul ...

  9. 使用@vue/cli搭建vue项目开发环境

    当前系统版本 mac OS 10.14.2 1.安装node.js开发环境 前端开发框架和环境都是需要 Node.js  vue的运行是要依赖于node的npm的管理工具来实现 <mac OS ...

随机推荐

  1. [雅礼NOIP2018集训 day3]

    考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...

  2. xBIM 实战03 使用WPF技术实现IFC模型的加载与浏览

    系列目录    [已更新最新开发文章,点击查看详细]  WPF应用程序在底层使用 DirectX ,无论设计复杂的3D图形(这是 DirectX 的特长所在)还是绘制简单的按钮与文本,所有绘图工作都是 ...

  3. Kettle的概念学习系列之Kettle是什么?(一)

    不多说,直接上干货! Kettle是什么? Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文 ...

  4. Linux命令locate

    centos安装locate命令 centos6.3刚初始化安装完毕,有个配置文件不知道存在什么地方,想用locate命令来查找下,发现系统提示,找不到该命令.以前经常用的命令为什么找不到了呢???原 ...

  5. Appserv 2.5.10 升级PHP from version 5.2 to 5.3

    解决方案查看 该文章:http://blog.csdn.net/dull_boy2/article/details/43927363

  6. 【参考】查找Oracle最高的几个等待事件以及锁的信息

    1.通过操作系统的命令找到系统资源的bottleneck,如:CPU, Memory, I/O, Network  同时主要关注IOWait, PI/PO, Memory的使用情况 2.通过查询v$s ...

  7. sftp权限

    用户: t1 t2 根目录: /home/data/ /home/data/t1/ drwxr-xr-x. 2 t1 t1 4096 Mar 24 17:26 t1 /home/data/t2/ dr ...

  8. 如何取未知Json字符串 某个主键取对应的Value

    需添加引用using Newtonsoft.Json; string strJon  "Json 字符串"; JObject obj = JObject.Parse(strJon  ...

  9. 存储Hyper-V虚拟机的硬盘空间不足时的处理

    存储Hyper-V虚拟机的硬盘空间严重不足时的处理   ==先导出虚拟机到空间足够的硬盘,再在空间足够的分区上导入虚拟机 方法如下: 导出虚拟机: 导出之前,我们先删除不需要的快照. 在Hyper-V ...

  10. NOIp模拟赛三十一

    持续降智 分数:100+0+0=100 C题subtask是假的,根本没有部分分中的情况...还我20分QAQ A:[BZOJ4444]国旗计划 B:[agc006f]blackout C:[arc0 ...