导航
导航
文章目录
  1. 环境变量
  2. 通过环境变量指定对应的配置文件
  3. config-lite
    1. Install
    2. Usage
  4. cross-env
    1. Install
    2. Usage
  5. egg 配置文件的使用

Node 配置文件的定制

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

现在是大前端的时代,Node 的重要性不言而喻。在使用 Node 作为后端或者中间层的技术架构时,往往需要用到一些可配置的变量,比如数据库,在开发时我们会连开发的数据库,生成环境我们需要连生产的数据库,这样我们就需要根据不同的环境加载不一样的配置文件,从而提高我们的开发效率,接下来我们就一起来定制我们的配置文件。

环境变量

在 Node 中可以通过 process.env 来访问当前的环境变量信息。
比如我们在 package.json 中通过 scripts 定义的shell脚本执行对应的命令。

1
2
3
4
5
6
7
8
9
10
// package.json
{
...
"scripts": {
"start": "node ./bin/www",
"dev": "NODE_ENV=dev node ./bin/www",
"pro": "NODE_ENV=pro node ./bin/www"
},
...
}

可以看到,上面有三条条启动命令,一条是默认的 start,另外两条我们通过 NODE_ENV=xxx 来设置了对应的环境,当我们使用 npm run dev 启动项目的时候,通过 process.env.NODE_ENV 就可以取到项目的当前环境。

通过环境变量指定对应的配置文件

在上面我们通过shell脚本指定了对应的环境,那我们就可以通过 process.env.NODE_ENV 来加载对应的配置文件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// config/index.js
module.exports = {
dev: {
...省略
mongodb: 'mongodb://localhost:27017/demo'
},
build: {
...省略
mongodb: 'mongodb://127.0.0.0:27017/demo'
}
}

// app.js
const config = require('./config')

const mongodb = process.env.NODE_ENV === 'dev' ? config.build.mongodb : config.dev.mongodb

这样,我们就可以开开心心的放心的写代码了,但这样写还不是很优雅,都写到一个文件里了,不太好维护,接下来我们就真正的动态加载,不需要我们再加判断了。

config-lite

config-lite: A super simple & flexible & intuitive config module, support yaml & toml.

这一次,我们针对不同的环境,将配置写入不同的配置文件中,在项目根目录下新建config目录,里面新建不同环境的配置文件:default.js、dev.js和pro.js。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// default.js
module.exports = {
session: {
secret: 'config-lite-demo',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000*60*60
}
}
};

// dev.js
module.exports = {
host: "https://dev.com",
mongodb: 'mongodb://localhost:27017/test',
...省略
};

// pro.js
module.exports = {
host: "https://pro.com",
mongodb: 'mongodb://127.0.0.0:27017/test',
...省略
};

好了,配置文件写好了,如何使用呢?这里我们使用的 config-lite 插件,这个插件依旧是依据我们shell脚本指定的对应环境来选择不同的配置文件。

Install

1
$ npm i config-lite --save

当我们使用 npm run dev 启动项目的时候,config-lite会去抓取dev.js配置,并且会与default.js里配置去合并,如果有相同的对象,会覆盖default.js里的配置。同理 npm run pro

Usage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// app.js
const config = require('config-lite')(__dirname);

// 1、如果运行 npm run dev
config = {
host: "https://dev.com",
mongodb: 'mongodb://localhost:27017/test',
session: {
secret: 'config-lite-demo',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000*60*60
}
}
...省略
}

// 2、如果运行 npm run pro
config = {
host: "https://pro.com",
mongodb: 'mongodb://127.0.0.0:27017/test',
session: {
secret: 'config-lite-demo',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000*60*60
}
}
...省略
}

至此,我们就得到了更好维护的动态加载配置文件。还有一个问题(大多数情况下,在windows平台下使用类似于: NODE_ENV=pro的命令行指令会卡住,windows平台与POSIX在使用命令行时有许多区别(例如在POSIX,使用$ENV_VAR,在windows,使用%ENV_VAR%。。。))。那该如何解决呢?👇

cross-env

cross-env 让这一切变得简单,不同平台使用唯一指令,无需担心跨平台问题

Install

1
$ npm i cross-env --save

Usage

1
2
3
4
5
6
7
8
9
10
// package.json
{
...
"scripts": {
"start": "node ./bin/www",
"dev": "cross-env NODE_ENV=dev node ./bin/www",
"pro": "cross-env NODE_ENV=pro node ./bin/www"
},
...
}

这样 NODE_ENV 便设置成功,无需担心跨平台问题。

egg 配置文件的使用

在 config 目录(脚手架生成的)新增 config.dev.js 和 config.pro.js,然后在文件内写我们对应环境的配置。

  • 配置环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // package.json
    {
    ...
    "script": {
    ...
    "dev": "EGG_SERVER_ENV=dev egg-bin dev",
    "pro": "EGG_SERVER_ENV=pro egg-scripts start",
    ...
    }
    ...
    }

    在 egg 中通过 EGG_SERVER_ENV 来声明对应的环境变量。

  • 使用

    1
    const config = this.app.config // 得到对应环境的配置文件(也会和 default 进行合并)

完结,好久没写了,有点生疏了,苦笑!!!