node.js 下定制你的 config 配置文件

config.jpg

在任何一个项目中都缺少不了配置文件 具有下面的特点: 数据量不大,信息需要长期保存,容易维护


  • 当然你也可以在数据库中建一张表,去存放这些信息,一点错都没有,但是,是不是有点牛刀杀鸡的感觉

今天和大家分享的是配置文件的定制,根据你的运行环境不同动态配置一张灵活的 config 配置文件. 之前的一篇博文 根据 ENV 环境变量不同加载不同的配置文件


这一篇可以说是上一篇的子章节,上一篇说的太笼统, 这一次针对一个点,然后铺开说一个功能


我的博客全部用绝对路径

为什么?

因为总有些人直接过来 copy 我的文章,然后不加出处,不署名,这是别人辛辛苦苦的劳动果实,作为一个IT从业者,更应该懂得知识版权. 每篇文章下面有版权提醒,你可以随便转发,但是保留我的署名和出处可好?

绝对路径有什么好处

就是那些直接 copy 我文章的人,他们放到编辑器里很少去修修改改 (当然个别人还是很无耻的,我会单独开一篇博文讲一讲那些盗我博客,并且还给自己起名为 一介布衣 的草民) 所以使用绝对路径算是对自己博文的一点点保护,毕竟这篇博文被谁粘贴到哪里,里面的图片,链接还是会 指向 http://yijiebuyi.com/ 另外据说更有利于 seo ,但是具体情况没有对比验证,知识道听途说而已,可以忽略.

当然也有坏处

在本地调试的时候,有些链接资源始终指向线上地址 http://yijiebuyi.com 总有一些不方便.

所以问题来了

我的配置文件里能否有一个字段来判断是 本地环境,还是 线上环境 如果本地环境 domain=’localhost:3001’ 如果线上环境 domain=’http://yijiebuyi.com

如何解决

有人想,默认路径,设置成 localhost:3001 ,当你发布的时候把,地址改成 http://yijiebuyi.com .然后你的程序里全部调用这个 domian 键来拼接绝对路径


有这种想法的人是正常的,但是比较蛮干,明显不是最优的

我们需要一个系统变量来指明当前你所处的环境

node.js 中的 process.env.BLOG_VERSION

process.env.BLOG_VERSION 是读取系统变量 BLOG_VERSION 的值

那我们该如何设置这个 BLOG_VERSION 的值呢

打开你的命令行终端 export BLOG_VERSION="dev" 这样就在本地设置好了, BLOG_VERSION 的 值是 dev 同理,在你的线上服务器,也定义个系统变量 export BLOG_VERSION="production"

接着我们需要一份动态 config 文件

出自:node.js 下定制你的 config 配置文件

> 当然这里说的动态,并不是指手动的,根据上面设置的环境变量自动配置.

这样去定义 config 目录

config

index.js default.json

上面的 config 目录下2个文件, default.json 是放置公共的配置信息

什么是公共的配置,比如 本地 和 线上 环境都用到的博客分类

{
   "category":[
       "javascript",
       "jquery",
       "html5",
       "angularjs",
       "bootstrap",
       "linux",
       "node-webkit",
       "ios",
       "android",
       "mongodb",
       "leveldb",
       "redis",
       "mac",
       "go",
       "nodejs",
       "PostgreSQL",
       "开发工具",
       "心得",
       "杂谈"
   ]
}

index.js 文件中实现自定义配置

var _ = require('lodash');
var default_config = require('./default');

module.exports = (function () {
    var version = (process.env.BLOG_VERSION||'dev').toLowerCase();
    var config= _.extend({"version":version},default_config);

    config.isDev=config.version=='dev';
    config.isProduction=config.version=='production';


    return config;
})();

1.首先引用了 lodash ,用来合并 json 对象使用 2.然后引用了默认公共配置 default.json 3.开始读取 环境变量 BLOG_VERSION 的值, process.env.BLOG_VERSION 如果没有读取到,默认赋值 dev (开发环境) 4.把公共配置 default.json 和 新对象 {"version":version} 合并 (这时你的配置文件就多了一个配置项 version (可以查看是开发环境还是线上) 5.根据 上面新加的属性 version 值,判断是不是 开发环境/线上环境 (当然根据 version 也可以判断,这里设置了 bool 值,只为了使用的时候更方便) 可以看做是冗余配置项

最后你得到的一份动态配置是这样的

{
    "category":[
        "javascript",
        "jquery",
        "html5",
        "angularjs",
        "bootstrap",
        "linux",
        "node-webkit",
        "ios",
        "android",
        "mongodb",
        "leveldb",
        "redis",
        "mac",
        "go",
        "nodejs",
        "PostgreSQL",
        "开发工具",
        "心得",
        "杂谈"
    ],
    "version" : "dev",
    "isDev" : true,
    "isProduction" : false
}

其他代码处如何引用这个配置文件

var config=require('./config')

  • 注意: 上面的 ./config 路径你要根据你引用位置不同而不同,上面的 ./config 是指根目录下的 config 文件夹目录

为什么引用的是 config 目录?

node.js 中,当你的引用只是指明了文件夹 如上 ./config

那么 node.js 首先去目录下查找有没有 index.js 文件 ,如果没有,继续查找有没有 default.js 文件,接着查找有没有 index.json 文件,最后查找有没有default.json 文件. 所以 引用 require(‘./config’) 首先会命中目录下的 index.js ,命中此文件后,经过定制各种参数后直接返回了一份 json 格式的配置文件.



回到顶部