vue,react 项目.env 环境变量原理解析

6 篇文章 1 订阅
6 篇文章 0 订阅

vue,react 项目.env 环境变量原理解析

简介:

.env 文件扩展了 vuereact 项目的环境变量,相信大家用的比较多了,vuereactcli 里把这些配置好了,所以大家可以直接用,但是换个框架或者换个项目,这个问题就比较麻烦了。

比如说现在写 Ant Design Pro 的项目,它内部用的是 umi 来做这些配置,默认只支持.env 文件,那我想支持.env.development.env.production或者其他模式的环境变量怎么办?当然 umi@3 可以用config.dev.jsconfig.jsconfig.prod.js这些文件结合UMI_ENV来解决这些问题,可是心里很不爽。

于是你又开始写一个 nuxt 的项目,发现它里面的配置文件 nuxt.config.js 也仅仅支持 env:{} 对象扩展,那么问题来了,那我还想支持.env.development.env.production或者其他模式的环境变量怎么办?

既然项目的改变我们控制不了,那我们只能搞清楚 vue 里的 env 文件加载原理,以不变应万变了。

下面是解决思路。

1.新建一个.env.development 文件

NODE_ENV=development
VUE_APP_WEB_TITLE=test
VUE_APP_BASE_URL=http://0.0.0.0

2.核心实现,解析 env 文件

先安装依赖
dotenv
dotenv-expand

根据 vue-cli 源码
https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/Service.js

https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/util/resolveClientEnv.js
改写

parseEnv.js

const fs = require('fs')
const path = require('path')
const dotenv = require('dotenv') // 解析.env.*文件为键值对,并写入环境变量。
const variableExpansion = require('dotenv-expand') // 拿到dotenv解析的参数,扩展计算机上已经存在的环境变量(存在就赋值)。

const resolve = dir => path.join(__dirname, dir)
const prefixRE = /^VUE_APP_/

/*
这里加载的是development 模式文件,需要其他的可以根据启动参数来动态修改,或者NODE_ENV来修改

ag:根据NODE_ENV来修改
const env = variableExpansion(
  dotenv.parse(fs.readFileSync(resolve(`./.env.${process.env.NODE_ENV}`)))
)
*/
const env = variableExpansion(
  dotenv.parse(fs.readFileSync(resolve(`./.env.development`)))
)
Object.keys(env).forEach(key => {
  if (prefixRE.test(key) || key === 'NODE_ENV') {
    env[key] = JSON.stringify(env[key]) // JSON.stringify 的目的是为了给webpack.DefinePlugin 的值是 '"development"',DefinePlugin插件配置要求
  } else {
    Reflect.deleteProperty(env, key)
  }
})

module.exports = env

3.配置 webpack,注入环境变量到项目中

const webpack = require('webpack')

// 加载.env.* 环境变量
const env = require('./parseEnv')

console.log(env) // {NODE_ENV: '"development"',VUE_APP_WEB_TITLE: '"test"',VUE_APP_BASE_URL: '"http://0.0.0.0"'}

module.exports = {
  plugins: [new webpack.DefinePlugin({ 'process.env': env })]
}

4.使用

console.log(process.env.VUE_APP_BASE_URL) // 'http://0.0.0.0'

参考链接

1.https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/Service.js

2.https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/util/resolveClientEnv.js

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaofei0627

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值