前言一般来说:一个好的项目配置应该满足以下条件:依赖环境:配置根据具体的运行环境从对应的文件中读取代码分离:配置项不能只从配置中读取文件,也可以从环境变量中读取,安全保密的配置项与代码分离,方便使用:配置项应该分层配置,有助于查找入口和维护庞大的配置文件,并且应该易于组织和获取,比如多人开发一个json结构的nodejs项目时,如果没有规划好配置方案,就很容易暴露出配置文件的问题。痛点在开发nodejs的项目中,遇到了三个痛点。不同的部署环境:不同的开发、测试和生产环境导致不同的配置。开发环境不同:开发者的开发环境配置不同,同一个配置文件会有不同的项,同一个文件的不同提交很容易造成git冲突,影响git提交更新。安全配置:有些配置不应该在项目代码中明文存储,比如数据库密码方案。不同的部署环境相对容易解决。创建对应环境的配置文件,如:开发环境配置:developmentConfig.js测试环境配置:testConfig.js生产环境配置:productionConfig.js然后创建一个config.js配置文件作为获取配置的入口,如如下:module.exports=require(`./${process.env.NODE_ENV}Config.js`)引用配置时,直接引用config.js即可。运行命令如下:NODE_ENV=developmentnodeindex.js开发环境不同。开发环境不同,导致每个人的developmentConfig.js不同。这不能要求别人的配置和你的一样,这样工程太辛苦了。我们可以将developmentConfig.js添加到.gitignore中与项目分离,然后在readme.md中说明如何配置developmentConfig.js。最好创建一个developmentConfig.example.js,将文档复制到developmentConfig.js后修改配置项以匹配自己的开发配置。安全配置对于项目中一些对安全性要求较高的配置项,我们应该将其与配置文件分开,只能在当前运行的进程中获取。然后配置文件中的配置项可以读取进程的配置项值,比如数据库密码。一般做法如下:productionConfig.jsmodule.exports={database:{user:process.env.user||'root',密码:process.env.password||不知道我用环境变量覆盖配置项值,例如:productionConfig.jsmodule.exports={database:{user:'root',password:'yfwzx2019'}}大部分人拿到这个配置,都会认为数据库的账号密码是root和yfwzx2019。其实最后会被环境变量的值覆盖掉。操作如下:nodeindex.js--database.user=combine--database.password=tencent2019当然经过一些处理也可以这样配置。有了实际的运行方案,我们先介绍一下下面的nodejs配置模块rc模块rc模块需要定义一个appname来使用rc模块。之所以选择rc模块,是因为它会尽可能多的从appname命名相关的地方读取配置。使用起来也很简单,首先实例化一个rc配置:varconf=require('rc')(appname,defaultConfigObject)然后它会从下面的列表中合并配置,按优先级顺序合并:命令行参数:--user=rootorObject形式赋值--database.user=root环境变量:环境变量前缀为${appname}_变量appname_user=rootobjectformappname_database__user=root指定文件:nodeindex.js--config文件默认配置文件:从./../../../../../../等目录搜索.${appname}rc文件$HOME/.${appname}rc$HOME/。${appname}/config$HOME/.config/${appname}$HOME/.config/${appname}/config/etc/${appname}rc/etc/${appname}/config做了个demo,更多直观varconf=require('rc')('development',{port:3000,})console.log(JSON.stringify(conf))//1.直接运行//nodeindex.js//{port:3000,_:[]}//2.添加命令行参数//nodeindex.js--port=4000--database.user=root//{port:4000,_:[],database:{user:'root'}}//3.添加环境变量//development_port=5000development_database__password=yf??wzx2019nodeindex.js//{"port":"5000","database":{"password":"yfwzx2019"},"_":[]}//4.指定配置文件:在根目录下创建一个配置文件config.json,内容如下//{//"port":"6000"//}//nodeindex.js--config=配置.json//{"port":"6000","_":[],"config":"config.json","configs":["config.json"]}//5.默认读取${appname}rc文件:查看根目录下的一个配置文件。developmentrc内容如下://{//"port":7000//}//nodeindex.js//{"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"}//6、5和4一起运行//nodeindex.js--config=config.json//{"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}具体操作见rc模块,可以满足我们的需求,我们可以配置公共配置项,或者暗中覆盖我们的配置项创建配置文件目录,添加配置文件├──config│├──.developmentrc.example│├──.productionrc│├──.testrc│└──index.js其中.developmentrc.example为示例开发环境,然后开发者引用.developmentrc文件,index.js是配置入口文件,内容如下:letrc=require('rc')//因为rc从process.appnamerc文件中查找。cwd(),我们在根目录下的config文件夹中是找不到的。要将工作路径更改为当前路径,请再次将其更改回来。varoriginCwd=process.cwd()process.chdir(__dirname)varconf=rc(process.env.NODE_ENV||'production',{//默认公共配置origin:'default',baseUrl:'http://google.com/api',enableProxy:true,port:3000,database:{user:'root',password:'yfwzx2019'}})process.chdir(originCwd)module.exports=conf关于部署环境的区别,通过设置环境变量NODE_ENV获取配置以适应开发环境的不同,将config/.developmentrc添加到.gitignore中,去掉项目代码中的开发环境配置.developmentrc,开发者直接根据.developmentrc构建开发配置.example.developmentrc关于安全配置,通过添加环境变量覆盖默认值,可以安全隐秘覆盖配置项,例如:NODE_ENV=productionnodeindex.js--database.password=tencent2019谢谢大家
