slash
将window反斜杠路径转换为斜杠路径
foo\\bar ?foo/bar
只要不是长路径并且不包含任何非ascii字符,就可以在Windows中使用正斜杠路径。
这是因为Node.js中的路径方法在Windows上输出
Install
1 | yarn add slash |
Usage
1 2 3 4 5 6 7 8 9 10 | 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:
接受一个Windows反斜杠路径,并返回一个带有正斜杠的路径。
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
slashjs
minimist
解析参数选项
这个模块是the guts of optimist's参数解析器的核心,没有任何花哨的修饰。
example
1 2 | var argv = require('minimist')(process.argv.slice(2)); console.log(argv); |
1 2 | $ node example/parse.js -a beep -b boop { _: [], a: 'beep', b: 'boop' } |
1 2 3 4 5 6 7 8 9 | $ 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
1 | var parseArgs = require('minimist') |
var argv = parseArgs(args, opts={})
返回一个参数对象
数字外观的参数将作为数字返回。除非
选项可以是:
opts.string - 一个字符串或字符串数组的参数名称,总是作为字符串处理opts.boolean - 将布尔值、字符串或字符串数组始终作为布尔值处理。如果为true ,将把所有不带等号的双连字符参数当作布尔值(例如:影响属性--foo ,而不是-f 或者--foo=bar )opts.alias - 将字符串名称映射为用作别名的字符串或字符串参数名称数组的对象opts.default - 将字符串参数名称映射到默认值的对象opts.stopEarly - 当为真,在第一个非选项之后的一切参数填充到argv._ 。-
opts['--'] - 当为真,-- 之前的一切参数会被填充到argv._ ,-- 后的参数会被填充到argv['--'] . 这有一个例子:1
2
3> require('./')('one two three -- four five --six'.split(' '), { '--': true })
{ _: [ 'one', 'two', 'three' ],
'--': [ 'four', 'five', '--six' ] }注意设置了
opts['--'] ,-- 参数之后仍然停止对参数的解析. opts.unknown - 使用opts配置对象中未定义的命令行参数调用的函数. 如果函数返回false , 未知选项未添加到argv .
install
1 | yarn add minimist |
dotenv
Dotenv是一个零依赖模块,它将环境变量从
Install
1 2 3 4 5 | # with npm npm install dotenv # or with Yarn yarn add dotenv |
Usage
在应用程序中尽可能早地要求和配置dotenv。
1 | require('dotenv').config() |
在项目的根目录中创建
1 2 3 | DB_HOST=localhost DB_USER=root DB_PASS=s1mpl3 |
1 2 3 4 5 6 | const db = require('db') db.connect({ host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASS }) |
Preload
可以使用
1 2 3 4 5 6 7 8 9 | // .env DB_HOST=localhost // 脚本 console.log(process.env.DB_HOST) // cmd $ node -r dotenv/config your_script.js localhost |
下面的配置选项被支持作为该格式的命令行参数
1 | $ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env |
此外,您可以使用环境变量来设置配置选项。命令行参数将位于这些参数之前。
1 | $ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js |
1 | $ DOTENV_CONFIG_ENCODING=latin1 node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env |
Config
1 2 3 4 5 6 7 | const result = dotenv.config() if (result.error) { throw result.error } console.log(result.parsed) |
此外,您还可以将选项传递给
Options
Path
Default:
如果包含环境变量的文件位于其他位置,则可以指定自定义路径。
1 | require('dotenv').config({ path: '/custom/path/to/.env' }) |
Encoding
Default:
您可以指定包含环境变量的文件的编码。
1 | require('dotenv').config({ encoding: 'latin1' }) |
Debug
Default:
您可以打开日志记录,以帮助调试为什么某些键或值没有按预期设置。
1 | require('dotenv').config({ debug: process.env.DEBUG }) |
Parse
可以使用解析包含环境变量的文件内容的工具。它接受一个字符串或缓冲区,并返回一个具有已解析的键和值的对象。
1 2 3 4 | 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:
您可以打开日志记录,以帮助调试为什么某些键或值没有按预期设置
1 2 3 4 5 | 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" 变成1
2{MULTILINE: 'new
line'}
FAQ
我应该提交我的 .env 文件吗?
不。我们强烈建议不要将.env文件提交给版本控制。它应该只包含特定于环境的值,比如数据库密码或API密钥。生产数据库的密码应该与开发数据库的密码不同。
我应该有多个 .env 文件吗?
不。我们强烈建议不要使用像
在一个twelve-factor应用程序中,env值是细粒度控件,每个都与其他env值完全正交。它们从未被组合在一起作为“环境”,而是针对每个部署进行独立管理。随着应用程序在其生命周期中自然地扩展为更多部署,这是一个平稳扩展的模型。
– The Twelve-Factor App
已经设置的环境变量会发生什么变化?
我们永远不会修改任何已经设置好的环境变量。特别是,如果
如果你想重写
1 2 3 4 5 6 | 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定制/编写插件吗?
在
1 2 3 4 | const dotenv = require('dotenv') const variableExpansion = require('dotenv-expand') const myEnv = dotenv.config() variableExpansion(myEnv) |
变量展开式呢?
Try dotenv-expand
如何使用dotenv 导入?
ES2015及之后提供了允许您导出任何顶级模块的模块
当运行包含导入声明的模块时,首先加载它导入的模块,然后以深度优先遍历依赖关系图的方式执行每个模块主体,通过跳过已经执行的内容避免了循环。
– ES6 In Depth: Modules
在引用任何环境变量之前,必须运行
1 2 3 | import { Client } from 'best-error-reporting-service' export const client = new Client(process.env.BEST_API_KEY) |
1 2 3 4 5 | import dotenv from 'dotenv' import errorReporter from './errorReporter' dotenv.config() errorReporter.client.report(new Error('faq example')) |
客户端不能正确配置,因为它是在执行
- Preload dotenv:
node --require dotenv/config index.js (注意:您不需要使用此方法导入dotenv) - 引入
dotenv/config 替代dotenv (注意:你不需要调用dotenv.config() 并且必须通过命令行或使用这种方法的环境变量传递选项) - 创建一个单独的文件,该文件将首先执行
config ,如中所述 this comment on #133
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
dotenv