庫 | 做用 |
---|---|
chalk-pipe | 使用更簡單的樣式字符串建立粉筆樣式方案 |
chalk | 正確處理終端字符串樣式 |
Commander.js | 完整的 node.js 命令行解決方案 |
Inquirer.js | 一組通用的交互式命令行用戶界面。 |
slash | 系統路徑符處理 |
minimist | 解析參數選項 |
dotenv | 將環境變量從 .env文件加載到process.env中 |
dotenv-expand | 擴展計算機上已經存在的環境變量 |
hash-sum | 很是快的惟一哈希生成器 |
deepmerge | 深度合併兩個或多個對象的可枚舉屬性。 |
yaml-front-matter | 解析yaml或json |
resolve | 實現node的 require.resolve() 算法,這樣就能夠異步和同步地使用require.resolve()表明文件 |
semver | npm的語義版本器 |
leven | 測量兩字符串之間的差別<br/>最快的JS實現之一 |
lru cache | 刪除最近最少使用的項的緩存對象 |
portfinder | 自動尋找 8000 至65535 內可用端口號 |
ora | 優雅的終端轉輪 |
envinfo | 生成故障排除軟件問題(如操做系統、二進制版本、瀏覽器、已安裝語言等)時所需的通用詳細信息的報告 |
memfs | 內存文件系統與Node's fs API相同實現 |
execa | 針對人類的流程執行 |
webpack-merge | 用於鏈接數組和合並對象,從而建立一個新對象 |
webpack-chain | 使用鏈式API去生成簡化webpack版本配置的修改 |
strip-ansi | 從字符串中去掉ANSI轉義碼 |
address | 獲取當前機器的IP, MAC和DNS服務器。 |
default-gateway | 經過對OS路由接口的exec調用得到機器的默認網關 |
joi | JavaScript最強大的模式描述語言和數據驗證器。 |
fs-extra | 添加了未包含在原生fs 模塊中的文件系統方法,並向fs 方法添加了promise支持 |
Acorn | 一個小而快速的JavaScript解析器,徹底用JavaScript編寫。 |
zlib.js | ZLIB.js是ZLIB(RFC1950), DEFLATE(RFC1951), GZIP(RFC1952)和PKZIP在JavaScript實現。 |
nodejs交互工具庫 -- chalk-pipe和chalkhtml
nodejs交互工具庫 -- commander和Inquirernode
nodejs交互工具庫 -- slash, minimist和dotenv, dotenv-expandwebpack
nodejs交互工具庫 -- hash-sum, deepmerge和yaml-front-mattergit
nodejs交互工具庫 -- resolve和semveres6
nodejs交互工具庫 -- leven, lru cache和portfindergithub
nodejs交互工具庫 -- webpack-merge和webpack-chain數據庫
nodejs交互工具庫 -- strip-ansi, address, default-gateway和joinpm
nodejs交互工具庫 -- fs-extra, Acorn和zlib
將window反斜槓路徑轉換爲斜槓路徑foo\\bar
➔foo/bar
只要不是長路徑而且不包含任何非ascii字符,就能夠在Windows中使用正斜槓路徑。
這是由於Node.js中的路徑方法在Windows上輸出\\
路徑。
yarn add slash
const path = require('path'); const slash = require('slash'); const string = path.join('foo', 'bar'); // Unix => foo/bar // Windows => foo\\bar slash(string); // Unix => foo/bar // Windows => foo/bar
Type: string
接受一個Windows反斜槓路徑,並返回一個帶有正斜槓的路徑。
基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔
解析參數選項
這個模塊是the guts of optimist's參數解析器的核心,沒有任何花哨的修飾。
var argv = require('minimist')(process.argv.slice(2)); console.log(argv);
$ node example/parse.js -a beep -b boop { _: [], a: 'beep', b: 'boop' }
$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz { _: [ 'foo', 'bar', 'baz' ], x: 3, y: 4, n: 5, a: true, b: true, c: true, beep: 'boop' }
之前的版本有一個原型污染bug,在處理不受信任的用戶輸入時,這個bug可能會在某些狀況下致使權限升級。
請使用1.2.3或更高版本 https://snyk.io/vuln/SNYK-JS-...
var parseArgs = require('minimist')
返回一個參數對象argv
,用args
中的數組參數填充。
argv._
包含全部沒有關聯選項的參數。
數字外觀的參數將做爲數字返回。除非opts.string
或opts.boolean
設置爲參數名稱。
'--'
以後的任何參數都不會被解析,它們將在argv._
中結束。
選項能夠是:
opts.string
- 一個字符串或字符串數組的參數名稱,老是做爲字符串處理opts.boolean
- 將布爾值、字符串或字符串數組始終做爲布爾值處理。若是爲true
,將把全部不帶等號的雙連字符參數看成布爾值(例如:影響屬性 --foo
,而不是-f
或者--foo=bar
)opts.alias
- 將字符串名稱映射爲用道別名的字符串或字符串參數名稱數組的對象opts.default
- 將字符串參數名稱映射到默認值的對象opts.stopEarly
- 當爲真,在第一個非選項以後的一切參數填充到argv._
。opts['--']
- 當爲真, --
以前的一切參數會被填充到argv._
, --
後的參數會被填充到argv['--']
. 這有一個例子:
> require('./')('one two three -- four five --six'.split(' '), { '--': true }) { _: [ 'one', 'two', 'three' ], '--': [ 'four', 'five', '--six' ] }
注意設置了 opts['--']
, --
參數以後仍然中止對參數的解析.
opts.unknown
- 使用opts配置對象中未定義的命令行參數調用的函數. 若是函數返回 false
, 未知選項未添加到 argv
.yarn add minimist
Dotenv是一個零依賴模塊,它將環境變量從 .env
文件加載到process.env
中。在獨立於代碼的環境中存儲配置是基於The Twelve-Factor App方法論
# with npm npm install dotenv # or with Yarn yarn add dotenv
在應用程序中儘量早地要求和配置dotenv。
require('dotenv').config()
在項目的根目錄中建立 .env
文件。在新行上以 NAME=VALUE
的形式添加特定於環境的變量。例如:
DB_HOST=localhost DB_USER=root DB_PASS=s1mpl3
process.env
如今擁有您在 .env
文件中定義的鍵和值。
const db = require('db') db.connect({ host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASS })
可使用 --require
(-r
) command line option預加載dotenv.經過這樣作,您不須要在應用程序代碼中引入和加載dotenv。當使用 import
而不是require
時這是首選方法
// .env DB_HOST=localhost // 腳本 console.log(process.env.DB_HOST) // cmd $ node -r dotenv/config your_script.js localhost
下面的配置選項被支持做爲該格式的命令行參數dotenv_config_<option>=value
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env
此外,您可使用環境變量來設置配置選項。命令行參數將位於這些參數以前。
$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js
$ DOTENV_CONFIG_ENCODING=latin1 node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env
config
將讀取.env
文件,解析其內容,並將其分配給process.env
並返回一個對象,該對象帶有一個已解析的鍵,其中包含已加載的內容,若是失敗則返回一個錯誤鍵。
const result = dotenv.config() if (result.error) { throw result.error } console.log(result.parsed)
此外,您還能夠將選項傳遞給config
.
Default: path.resolve(process.cwd(), '.env')
若是包含環境變量的文件位於其餘位置,則能夠指定自定義路徑。
require('dotenv').config({ path: '/custom/path/to/.env' })
Default: utf8
您能夠指定包含環境變量的文件的編碼。
require('dotenv').config({ encoding: 'latin1' })
Default: false
您能夠打開日誌記錄,以幫助調試爲何某些鍵或值沒有按預期設置。
require('dotenv').config({ debug: process.env.DEBUG })
可使用解析包含環境變量的文件內容的工具。它接受一個字符串或緩衝區,並返回一個具備已解析的鍵和值的對象。
const dotenv = require('dotenv') const buf = Buffer.from('BASIC=basic') const config = dotenv.parse(buf) // will return an object console.log(typeof config, config) // object { BASIC : 'basic' }
Default: false
您能夠打開日誌記錄,以幫助調試爲何某些鍵或值沒有按預期設置
const dotenv = require('dotenv') const buf = Buffer.from('hello world') const opt = { debug: true } const config = dotenv.parse(buf, opt) // expect a debug message because the buffer is not in KEY=VAL form
解析引擎目前支持如下規則:
BASIC=basic
變成{BASIC: 'basic'}
EMPTY=
變成{EMPTY: ''}
)JSON={"foo": "bar"}
變成{JSON:"{\\"foo\\": \\"bar\\"}"
)trim
的詳細內容)(FOO= some value
變成 {FOO: 'some value'}
)SINGLE_QUOTE='quoted'
變成{SINGLE_QUOTE: "quoted"}
)FOO=" some value "
變成{FOO: ' some value '}
)雙引號值擴展新行(MULTILINE="new\\nline"
變成
{MULTILINE: 'new line'}
.env
文件嗎?不。咱們強烈建議不要將.env文件提交給版本控制。它應該只包含特定於環境的值,好比數據庫密碼或API密鑰。生產數據庫的密碼應該與開發數據庫的密碼不一樣。
.env
文件嗎?不。咱們強烈建議不要使用像.env.test
這樣的「主」.env
文件和「環境」.env
文件。您的配置應該在不一樣的部署中有所不一樣,而且您不該該在不一樣的環境中共享值。
在一個twelve-factor應用程序中,env值是細粒度控件,每一個都與其餘env值徹底正交。它們從未被組合在一塊兒做爲「環境」,而是針對每一個部署進行獨立管理。隨着應用程序在其生命週期中天然地擴展爲更多部署,這是一個平穩擴展的模型。
咱們永遠不會修改任何已經設置好的環境變量。特別是,若是 .env
文件中有一個變量與環境中已經存在的變量發生衝突,那麼該變量將被跳過。此行爲容許您使用特定於機器的環境覆蓋全部 .env
配置,但不建議這樣作。
若是你想重寫process.env
你能夠這樣作:
const fs = require('fs') const dotenv = require('dotenv') const envConfig = dotenv.parse(fs.readFileSync('.env.override')) for (const k in envConfig) { process.env[k] = envConfig[k] }
在dotenv@2.x.x
: 是的. dotenv.config()
如今返回一個表示解析後的.env
文件的對象。這爲您提供了繼續設置process.env上的值所需的一切。例如:
const dotenv = require('dotenv') const variableExpansion = require('dotenv-expand') const myEnv = dotenv.config() variableExpansion(myEnv)
Try dotenv-expand
dotenv
導入?ES2015及以後提供了容許您導出任何頂級模塊的模塊function
, class
, var
, let
, 或者const
當運行包含導入聲明的模塊時,首先加載它導入的模塊,而後以深度優先遍歷依賴關係圖的方式執行每一個模塊主體,經過跳過已經執行的內容避免了循環。
在引用任何環境變量以前,必須運行 dotenv.config()
。下面是一個有問題的代碼示例:
errorReporter.js
:
import { Client } from 'best-error-reporting-service' export const client = new Client(process.env.BEST_API_KEY)
index.js
:
import dotenv from 'dotenv' import errorReporter from './errorReporter' dotenv.config() errorReporter.client.report(new Error('faq example'))
客戶端不能正確配置,由於它是在執行 dotenv.config()
以前構造的。有(至少)三種方法來實現這個目標。
node --require dotenv/config index.js
(注意:您不須要使用此方法導入dotenv)dotenv/config
替代 dotenv
(注意:你不須要調用 dotenv.config()
而且必須經過命令行或使用這種方法的環境變量傳遞選項)config
,如中所述 this comment on #133基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔
dotenv-expand在dotenv的頂部添加了可變擴展。若是您發現本身須要擴展計算機上已經存在的環境變量,那麼dotenv-expand就是您的工具。
npm install dotenv --save npm install dotenv-expand --save
在應用程序中,儘量早地要求dotenv和dotenv-expand,並圍繞dotenv包裝dotenv-expand。
var dotenv = require('dotenv') var dotenvExpand = require('dotenv-expand') var myEnv = dotenv.config() dotenvExpand(myEnv)
查看 test/.env 的例子變量展開 .env
文件.
示例看不太出用法,我從源碼看了下大概是主要思路優先使用process.env
, .env
爲備用,其中還有一些判斷處理不細說因此應該用法以下
var dotenv = require('dotenv') var dotenvExpand = require('dotenv-expand') var myEnv = dotenv.config() process.env.DB_HOST='123' console.log(myEnv) console.log(dotenvExpand(myEnv))
{ parsed: { DB_HOST: 'localhost', DB_USER: 'root', DB_PASS: 's1mpl3' }}
{ parsed: { DB_HOST: '123', DB_USER: 'root', DB_PASS: 's1mpl3' } }
基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔