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 格式的配置文件.

回到顶部