nodejs交互工具庫 -- slash, minimist和dotenv, dotenv-expand

nodejs交互工具庫系列

做用
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 自動尋找 800065535內可用端口號
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交互工具庫 -- ora和envinfoweb

nodejs交互工具庫 -- memfs和execa算法

nodejs交互工具庫 -- webpack-merge和webpack-chain數據庫

nodejs交互工具庫 -- strip-ansi, address, default-gateway和joinpm

nodejs交互工具庫 -- fs-extra, Acorn和zlib

slash

將window反斜槓路徑轉換爲斜槓路徑 foo\\barfoo/bar

只要不是長路徑而且不包含任何非ascii字符,就能夠在Windows中使用正斜槓路徑。

這是由於Node.js中的路徑方法在Windows上輸出\\路徑。

Install

yarn add slash

Usage

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

API

slash(path)

Type: string

接受一個Windows反斜槓路徑,並返回一個帶有正斜槓的路徑。

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

slashjs

minimist

解析參數選項

這個模塊是the guts of optimist's參數解析器的核心,沒有任何花哨的修飾。

example

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' }

security

之前的版本有一個原型污染bug,在處理不受信任的用戶輸入時,這個bug可能會在某些狀況下致使權限升級。

請使用1.2.3或更高版本 https://snyk.io/vuln/SNYK-JS-...

methods

var parseArgs = require('minimist')

var argv = parseArgs(args, opts={})

返回一個參數對象argv,用args中的數組參數填充。

argv._包含全部沒有關聯選項的參數。

數字外觀的參數將做爲數字返回。除非opts.stringopts.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.

install

yarn add minimist

dotenv

Dotenv是一個零依賴模塊,它將環境變量從 .env文件加載到process.env中。在獨立於代碼的環境中存儲配置是基於The Twelve-Factor App方法論

Install

# with npm
npm install dotenv

# or with Yarn
yarn add dotenv

Usage

在應用程序中儘量早地要求和配置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
})

Preload

可使用 --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

config將讀取.env文件,解析其內容,並將其分配給process.env並返回一個對象,該對象帶有一個已解析的鍵,其中包含已加載的內容,若是失敗則返回一個錯誤鍵。

const result = dotenv.config()

if (result.error) {
  throw result.error
}

console.log(result.parsed)

此外,您還能夠將選項傳遞給config.

Options

Path

Default: path.resolve(process.cwd(), '.env')

若是包含環境變量的文件位於其餘位置,則能夠指定自定義路徑。

require('dotenv').config({ path: '/custom/path/to/.env' })

Encoding

Default: utf8

您能夠指定包含環境變量的文件的編碼。

require('dotenv').config({ encoding: 'latin1' })

Debug

Default: false

您能夠打開日誌記錄,以幫助調試爲何某些鍵或值沒有按預期設置。

require('dotenv').config({ debug: process.env.DEBUG })

Parse

可使用解析包含環境變量的文件內容的工具。它接受一個字符串或緩衝區,並返回一個具備已解析的鍵和值的對象。

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' }

Options

Debug

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

Rules

解析引擎目前支持如下規則:

  • BASIC=basic 變成{BASIC: 'basic'}
  • 空行被跳過
  • 以#開頭的行被視爲註釋
  • 空值變成空字符串(EMPTY= 變成{EMPTY: ''})
  • 維護內部引號(想一想JSON) (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'}

FAQ

我應該提交個人 .env文件嗎?

不。咱們強烈建議不要將.env文件提交給版本控制。它應該只包含特定於環境的值,好比數據庫密碼或API密鑰。生產數據庫的密碼應該與開發數據庫的密碼不一樣。

我應該有多個 .env文件嗎?

不。咱們強烈建議不要使用像.env.test這樣的「主」.env文件和「環境」.env文件。您的配置應該在不一樣的部署中有所不一樣,而且您不該該在不一樣的環境中共享值。

在一個twelve-factor應用程序中,env值是細粒度控件,每一個都與其餘env值徹底正交。它們從未被組合在一塊兒做爲「環境」,而是針對每一個部署進行獨立管理。隨着應用程序在其生命週期中天然地擴展爲更多部署,這是一個平穩擴展的模型。

The Twelve-Factor App

已經設置的環境變量會發生什麼變化?

咱們永遠不會修改任何已經設置好的環境變量。特別是,若是 .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定製/編寫插件嗎?

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

當運行包含導入聲明的模塊時,首先加載它導入的模塊,而後以深度優先遍歷依賴關係圖的方式執行每一個模塊主體,經過跳過已經執行的內容避免了循環。

ES6 In Depth: Modules

在引用任何環境變量以前,必須運行 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()以前構造的。有(至少)三種方法來實現這個目標。

  1. Preload dotenv: node --require dotenv/config index.js (注意:您不須要使用此方法導入dotenv)
  2. 引入 dotenv/config 替代 dotenv (注意:你不須要調用 dotenv.config() 而且必須經過命令行或使用這種方法的環境變量傳遞選項)
  3. 建立一個單獨的文件,該文件將首先執行 config,如中所述 this comment on #133

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

dotenv

dotenv-expand

dotenv-expand在dotenv的頂部添加了可變擴展。若是您發現本身須要擴展計算機上已經存在的環境變量,那麼dotenv-expand就是您的工具。

Install

npm install dotenv --save
npm install dotenv-expand --save

Usage

在應用程序中,儘量早地要求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' } }

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

dotenv-expand

相關文章
相關標籤/搜索