VUE_APP_NAME=bob
VUE_APP_QQ=2410024100
VUE_APP_URL=2410024100@qq.com
单从这个文件来看,我们可以知道有如下功能需要实现:
读取 .env 文件
解析 .env 文件拆成键值对的对象形式
赋值到 process.env 上
最后返回解析后得到的对象
简单实现
const fs = require('fs');
const path = require('path');
const parse = function parse(src){
const obj = {};
// 用换行符 分割
// 比如
/**
VUE_APP_NAME=bob
VUE_APP_QQ=2410024100
VUE_APP_URL=2410024100@qq.com
*/
src.toString().split('\n').forEach(function(line, index){
// 用等号分割
const keyValueArr = line.split('=');
// NAME
key = keyValueArr[0];
// bob
val = keyValueArr[1] || '';
obj[key] = val;
});
// { NAME: 'bob', ... }
return obj;
}
const config = function(){
// 读取 node 执行的当前路径下的 .env 文件
let dotenvPath = path.resolve(process.cwd(), '.env');
// 按 utf-8 解析文件,得到对象
// { NAME: 'bob', ... }
const parsed = parse(fs.readFileSync(dotenvPath, 'utf-8'));
// 键值对形式赋值到 process.env 变量上,原先存在的不赋值
Object.keys(parsed).forEach(function(key){
if(!Object.prototype.hasOwnProperty.call(process.env, key)){
process.env[key] = parsed[key];
}
});
// 返回对象
return parsed;
};
console.log(config());
console.log(process.env);
// 导出 config parse 函数
module.exports.config = config;
module.exports.parse = parse;
一句话总结 dotenv
库的原理。用 fs.readFileSync
读取 .env
文件,并解析文件为键值对形式的对象,将最终结果对象遍历赋值到 process.env
上。