<div class="article fmt article__content">
一般来说:一个好的项目配置应该满足以下条件:
json
结构在多人开发 nodejs 项目的时候,没有规划好配置方案,配置文件的问题就很容易暴露出来。
在开发 nodejs 的工程中,遇到过三个痛点
对于部署环境不同,相对容易解决,建立相应环境的配置文件,比如:
再建一个config.js
配置文件作为入口获取配置,如下:
ports = require(`./${v.NODE_ENV}Config.js`)
引用配置的时候,只要引用 config.js
即可。
运行命令如下:
NODE_ENV=development node index.js
对于开发环境不同,导致每个人的developmentConfig.js
不同,这个不能要求别人的配置和你的一样,这样项目就太硬了。
我们可以把developmentConfig.js
添加到.gitignore
,从而从项目分离出来,再在readme.md
说明如何配置developmentConfig.js
。
最好是建立一个developmentConfig.js
后修改配置项符合自己的开发配置。
对于项目一些安全性要求高的配置项,我们应该从配置文件脱离出来,只能在当前的运行进程可以获取, 配置文件的配置项再读取进程的配置项值,比如数据库密码, 一般做法如下:productionConfig.js
- database: {
- user: v.user || 'root',
- password: v.password || 'yfwzx2019'
- }
- }
而更隐秘的办法是,你根本不知道我用环境变量覆盖了配置项值,比如:
productionConfig.js
- database: {
- user: 'root',
- password: 'yfwzx2019'
- }
- }
一般人拿到了这个配置,就会以为数据库的账号密码就是root
、yfwzx2019
,其实最后会被环境变量的值覆盖,运行如下:
node index.js --database.user=combine --database.password=tencent2019
当然,是要做了一些处理才可以这样配置。
方案有了,我们先来介绍以下 nodejs 的配置模块 rc模块
使用rc
模块需要定义一个appname
,选择rc
模块是因为它会尽可能多的从appname
命名相关的地方读取配置。
使用也很简单,先实例一个 rc 配置:
var conf = require('rc')(appname, defaultConfigObject)
然后它会从下面列表合并配置,优先级按顺序合并:
./ ../ ../../ ../../../
等目录查找.${appname}rc
文件$HOME/.${appname}rc
$HOME/.${appname}/config
$HOME/.config/${appname}
$HOME/.config/${appname}/config
/etc/${appname}rc
/etc/${appname}/config
做了个 demo, 直观一点
- var conf = require('rc')('development', {
- port: 3000,
- })
- console.log(JSON.stringify(conf))
- // 1、直接运行
- // node index.js
- // { port: 3000, _: [] }
- // 2、加上命令行参数
- // node index.js --port=4000 --database.user=root
- // { port: 4000, _: [], database: { user: 'root' } }
- // 3、加上环境变量
- // development_port=5000 development_database__password=yfwzx2019 node index.js
- // {"port":"5000","database":{"password":"yfwzx2019"},"_":[]}
- // 4、指定配置文件:根目录建一个配置文件 config.json, 内容如下
- // {
- // "port": "6000"
- // }
- // node index.js --config=config.json
- // {"port":"6000","_":[],"config":"config.json","configs":["config.json"]}
- // 5、默认读取 ${appname}rc 文件:根目录见一个配置文件 .developmentrc 内容如下:
- // {
- // "port": 7000
- // }
- // node index.js
- // {"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"}
- // 6、 5 和4 一起运行
- // node index.js --config=config.json
- // {"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}
看了 rc 模块,可以满足我们的需求,我们可以配置公共的配置项,也可以隐秘的覆盖我们的配置项。
- ├── config
- │ ├── .ample
- │ ├── .productionrc
- │ ├── .testrc
- │ └── index.js
其中 .ample 是开发环境的例子,然后开发人员参考建 .developmentrc 文件, index.js 是配置入口文件,内容如下:
- let rc = require('rc')
- // 因为 rc 是从 process.cwd() 向上查找 .appnamerc 文件的,我们在根目录 config 文件夹里面的是找不到的,要改变工作路径到当前,再改回去
- var originCwd = process.cwd()
- process.chdir(__dirname)
- var conf = v.NODE_ENV || 'production', {
- // 默认的共同配置
- origin: 'default',
- baseUrl: '',
- enableProxy: true,
- port: 3000,
- database: {
- user: 'root',
- password: 'yfwzx2019'
- }
- })
- process.chdir(originCwd)
NODE_ENV
来适配.gitignore
添加config/.developmentrc
,项目代码去掉开发环境配置.developmentrc
,开发人员根据.ample
建直接的开发配置.developmentrc
NODE_ENV=production node index.js --database.password=tencent2019
谢谢大家
</div></div></div>
本文发布于:2024-02-03 08:10:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170691900249754.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |