- 前言
大家好,我是若川。为了能帮助到更多对源码感兴趣、想学会看源码、提升自己前端技术能力的同学。我倾力组织了每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信
ruochuan02
参与。
想学源码,极力推荐关注我写的专栏(目前2K人关注)《学习源码整体架构系列》 包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
、koa-compose
、vue 3.2 发布
、vue-this
、create-vue
、玩具vite
等20余篇源码文章。
本文仓库 https://github.com/lxchuan12/dotenv-analysis.git,求个star^_^
源码共读活动 每周一期,已进行到18期。于是搜寻各种值得我们学习,且代码行数不多的源码。dotenv 主文件仅118行,非常值得我们学习。
阅读本文,你将学到:
1 | bash复制代码1. 学会 dotenv 原理和实现 |
- 环境准备
1 | bash复制代码# 推荐克隆我的项目,保证与文章同步 |
如果需要对源码进行调试,可以看我的这篇文章:新手向:前端程序员必学基本技能——调试JS代码,这里就不再赘述了。
- dotenv 的作用
Dotenv
是一个零依赖模块,可将 .env
文件中的环境变量加载到 process.env
中。
如果需要使用变量,则配合如下扩展包使用。
众所周知,.env
文件在我们项目中非常常见,在 vue-cli
和 create-react-app
中都有使用。
- .env 文件使用
我们项目中经常会用到.env 文件
写法:
1 | bash复制代码NAME=若川 |
单从这个文件来看,我们可以知道有如下功能需要实现:
- 读取 .env 文件
- 解析 .env 文件拆成键值对的对象形式
- 赋值到 process.env 上
- 最后返回解析后得到的对象
- 简单实现
根据分析问题,我们最终可以简单把代码实现如下:
1 | js复制代码const fs = require('fs'); |
- 继续完善 config 函数
简版的 config 函数还缺失挺多功能,比如:
1 | bash复制代码可由用户自定义路径 |
根据功能,我们很容易实现以下代码:
1 | js复制代码function resolveHome (envPath) { |
dotenv
源码中,parse
函数主要是一些正则和单双引号、跨平台等细致处理。这里就暂时不阐述,读者朋友可以查看dotenv 源码。
- 总结
鉴于文章不宜过长,文章只比较深入的分析了 config
函数。parse
函数目前没有深入分析。
一句话总结 dotenv
库的原理。用 fs.readFileSync
读取 .env
文件,并解析文件为键值对形式的对象,将最终结果对象遍历赋值到 process.env
上。
我们也可以不看 dotenv
源码,根据 api
倒推,自己来实现这样的功能。最终看看和 dotenv
源码本身有什么差别。这样也许更能锻炼自己。或者用 ts
重构它。
本文同时也给我们启发:围绕工作常用的技术包和库值得深入学习,做到知其然,知其所以然。
值得一提的是:dotenv
源码使用的是 flow
类型。vue2 源码也是用的 flow
。vue3 源码改用 ts
了。
最后可以持续关注我@若川。我倾力持续组织了一年每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan02
参与。
另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.2k+人)第一的专栏,写有20余篇源码文章。包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
、koa-compose
、vue 3.2 发布
、vue-this
、create-vue
、玩具vite
、create-vite
等20余篇源码文章。
本文转载自: 掘金