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 | 自动寻找 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和chalk
nodejs交互工具库 -- commander和Inquirer
nodejs交互工具库 -- slash, minimist和dotenv, dotenv-expand
nodejs交互工具库 -- hash-sum, deepmerge和yaml-front-matter
nodejs交互工具库 -- leven, lru cache和portfinder
nodejs交互工具库 -- webpack-merge和webpack-chain
nodejs交互工具库 -- strip-ansi, address, default-gateway和joi
nodejs交互工具库 -- fs-extra, Acorn和zlib
slash
将window反斜杠路径转换为斜杠路径foo\\bar➔foo/bar
只要不是长路径并且不包含任何非ascii字符,就可以在Windows中使用正斜杠路径。
这是因为Node.js中的路径方法在Windows上输出\\路径。
Install
yarn add slashUsage
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/barAPI
slash(path)
Type: string
接受一个Windows反斜杠路径,并返回一个带有正斜杠的路径。
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
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.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.
install
yarn add minimistdotenv
Dotenv是一个零依赖模块,它将环境变量从 .env文件加载到process.env中。在独立于代码的环境中存储配置是基于The Twelve-Factor App方法论
Install
# with npm
npm install dotenv
# or with Yarn
yarn add dotenvUsage
在应用程序中尽可能早地要求和配置dotenv。
require('dotenv').config()在项目的根目录中创建 .env文件。在新行上以 NAME=VALUE的形式添加特定于环境的变量。例如:
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3process.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/.envConfig
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 formRules
解析引擎目前支持以下规则:
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值完全正交。它们从未被组合在一起作为“环境”,而是针对每个部署进行独立管理。随着应用程序在其生命周期中自然地扩展为更多部署,这是一个平稳扩展的模型。
已经设置的环境变量会发生什么变化?
我们永远不会修改任何已经设置好的环境变量。特别是,如果 .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
当运行包含导入声明的模块时,首先加载它导入的模块,然后以深度优先遍历依赖关系图的方式执行每个模块主体,通过跳过已经执行的内容避免了循环。
在引用任何环境变量之前,必须运行 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()之前构造的。有(至少)三种方法来实现这个目标。
- Preload dotenv:
node --require dotenv/config index.js(注意:您不需要使用此方法导入dotenv) - 引入
dotenv/config替代dotenv(注意:你不需要调用dotenv.config()并且必须通过命令行或使用这种方法的环境变量传递选项) - 创建一个单独的文件,该文件将首先执行
config,如中所述 this comment on #133
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
dotenv-expand
dotenv-expand在dotenv的顶部添加了可变扩展。如果您发现自己需要扩展计算机上已经存在的环境变量,那么dotenv-expand就是您的工具。
Install
npm install dotenv --save
npm install dotenv-expand --saveUsage
在应用程序中,尽可能早地要求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' } }
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
