库 | 做用 |
---|---|
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' } }
基本经常使用的方法场景就这些了,更完整的用法能够直接查阅文档