<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
dotenv
是一個用於載入環境變數的庫,在 Node.js 應用程式中可以使用它來簡化對環境變數的存取。在日常開發中起到了很重要的作用。
學習目標:
資源:
原始碼地址:dotenv
使用 dotenv
庫,可以在應用程式中建立一個名為 .env
的檔案,並在該檔案中儲存環境變數。然後,可以使用 dotenv
庫將這些變數載入到 Node.js 應用程式中。
例如,您可以在 .env
檔案中儲存以下內容:
DB_HOST=localhost DB_USERNAME=user DB_PASSWORD=password
使用以下程式碼將這些變數載入到應用程式中:
require('dotenv').config(); const dbHost = process.env.DB_HOST; const dbUsername = process.env.DB_USERNAME; const dbPassword = process.env.DB_PASSWORD;
閱讀原始碼之前,可以猜測 dotenv 所做的工作有如下幾點。
來看下原始碼是如何完成上述功能的。
function config (options) { let dotenvPath = path.resolve(process.cwd(), '.env') let encoding = 'utf8' const debug = Boolean(options && options.debug) const override = Boolean(options && options.override) if (options) { if (options.path != null) { dotenvPath = _resolveHome(options.path) } if (options.encoding != null) { encoding = options.encoding } } }
程式碼中定義了一個變數 dotenvPath
,並將其賦值為使用 path.resolve
函數處理後的路徑。
path.resolve
函數會從右到左依次遍歷引數,並返回一個絕對路徑。函數的第一個引數是 process.cwd
,它返回 Node.js 程序的當前工作目錄。第二個引數是字串 '.env',它表示要在當前工作目錄中查詢的檔名。
之後會進行一些引數的判斷,如果引數中有path這個變數,則使用_resolveHome函數處理:
function _resolveHome (envPath) { return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath }
os.homedir
函數返回當前使用者的主目錄路徑。
_resolveHome 函數可用於將以波浪號開頭的路徑解析為主目錄的實際路徑。例如,如果 envPath
等於 '~/documents/file.txt',則函數將返回 '/home/user/documents/file.txt'(在基於 Unix 的系統上)或 'C:Usersuserdocumentsfile.txt'(在 Windows 上)。
// 使用 `fs.readFileSync` 函數以指定的編碼方式從檔案系統中讀取檔案內容 const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding })) // 解析檔案 function parse (src) { const obj = {} // 轉為string型別 let lines = src.toString() // 將換行符轉換為相同的格式 lines = lines.replace(/rn?/mg, 'n') let match while ((match = LINE.exec(lines)) != null) { const key = match[1] // Default undefined or null to empty string let value = (match[2] || '') // Remove whitespace value = value.trim() // Check if double quoted const maybeQuote = value[0] // Remove surrounding quotes value = value.replace(/^(['"`])([sS]*)1$/mg, '$2') // Expand newlines if double quoted if (maybeQuote === '"') { value = value.replace(/\n/g, 'n') value = value.replace(/\r/g, 'r') } // Add to object obj[key] = value } return obj }
首先使用正規表示式 LINE
來匹配字串 lines
中的內容。
const LINE = /(?:^|^)s*(?:exports+)?([w.-]+)(?:s*=s*?|:s+?)(s*'(?:\'|[^'])*'|s*"(?:\"|[^"])*"|s*`(?:\`|[^`])*`|[^#rn]+)?s*(?:#.*)?(?:$|$)/mg
這個正規表示式的目的是匹配類似於環境變數的行。它可以匹配以下格式的行:
VARNAME=value VARNAME: value export VARNAME=value export VARNAME: value
最後會返回一個包含所有變數的物件。
try { // Specifying an encoding returns a string instead of a buffer const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding })) Object.keys(parsed).forEach(function (key) { if (!Object.prototype.hasOwnProperty.call(process.env, key)) { process.env[key] = parsed[key] } else { if (override === true) { process.env[key] = parsed[key] } if (debug) { if (override === true) { _log(`"${key}" is already defined in `process.env` and WAS overwritten`) } else { _log(`"${key}" is already defined in `process.env` and was NOT overwritten`) } } } }) return { parsed } }
拿到解析後的物件,使用 Object.keys(parsed)
獲取所有的鍵,然後使用forEach迴圈將所有的鍵新增到process.env 中。
dotenv 的功能用一句話來概括就是:解析env檔案將其變數新增到process.env中,其中解析部分主要是使用了正規表示式來匹配4種格式的鍵值對。
以上就是專案中常用的 .env 檔案原理原始碼解析的詳細內容,更多關於.env 檔案原理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45