2

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()代表文件
semvernpm的语义版本器
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调用获得机器的默认网关
joiJavaScript最强大的模式描述语言和数据验证器。
fs-extra添加了未包含在原生fs模块中的文件系统方法,并向fs方法添加了promise支持
Acorn一个小而快速的JavaScript解析器,完全用JavaScript编写。
zlib.jsZLIB.js是ZLIB(RFC1950), DEFLATE(RFC1951), GZIP(RFC1952)和PKZIP在JavaScript实现。

nodejs交互工具库 -- chalk-pipe和chalk

nodejs交互工具库 -- commander和Inquirer

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

nodejs交互工具库 -- hash-sum, deepmerge和yaml-front-matter

nodejs交互工具库 -- resolve和semver

nodejs交互工具库 -- leven, lru cache和portfinder

nodejs交互工具库 -- ora和envinfo

nodejs交互工具库 -- memfs和execa

nodejs交互工具库 -- webpack-merge和webpack-chain

nodejs交互工具库 -- strip-ansi, address, default-gateway和joi

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


Afterward
621 声望62 粉丝

努力去做,对的坚持,静待结果