第六篇:koa2-web应用进阶—系统配置

之前几篇的介绍都是针对某个功能点的介绍,当整个 web 应用变大后,一个清晰的工程目录结构和系统参数配置也是十分必要的。本篇主要目标的介绍koa2-web应用工程目录设计、环境变量/系统变量的配置,同时本篇也是对之前几篇介绍内容的一个整合。

一、工程结构设计

koa2-web应用目录结构设计

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
koa2-web
├──bin #应用启动相关配置文件路径
| ├──dispatch.js #系统 cluster配置文件, 采用pm2启动应用不需要该文件
| ├──worker.js # graceful配置文件, 采用pm2启动应用不需要该文件
| ├──log.js #日志配置文件
| └──app.js #koa2应用主文件,一般系统中间件在该文件中引入
|
├──public #系统静态文件路径
| ├──common #放置公共文件,如:jQuery, favicon.ico
| └── '''
├──src #开发文件路径
| ├──app #业务逻辑接口放置于本路径
| ├──router #路由文件路径,所有http请求在次目录下处理
| ├──lib #公共模块抽取置于此路径
| ├──dao #持久层,该目录仅限于数据库操作
| └──views #view层文件放置路径, 模板、js、css/less等文件
| ├──layout 公共模板文件
| └──'''
├──config #配置文件路径
| ├──dev.env.config.js #开发环境配置文件
| ├──test.env.config.js #测试环境配置文件
| ├──prod.env.config.js #开发环境配置文件
| ├──log4js.json #log配置文件
| └──package.config.js #打包配置文件(打包篇介绍)
|
├──logs #日志文件输出路径
├──node_modules #node依赖路径,node引入依赖自动生成
├──webpack.config.js # webpack打包配置文件(打包篇介绍)
├──package.json #工程管理文件,系统依赖管理,启动命令、环境变量配置,
├──.gitignore
└──README.md

二、三套环境配置文件

一般而言,web系统开发的环境分为 “开发, 测试, 生产”三套环境, node 中可以通过设置系统变量 NODE_ENV 来判断koa 应用现在处于哪一套环境。
1、在上述工程结构中的dev.env.config.js, test.env.config.js, prod.env.config.js 三个文件主要是配置 web 应用在不同环境下的一些系统参数,例如:

1
2
3
4
5
6
7
8
9
10
11
12
'use strict'
//全局变量,系统侦听端口
global.listen_port = 3000
//redis配置
let redisConfig = {
port: 6379,
host: '192.168.1.100',
}
//非全局变量 需要导出
module.exports = {
redisConfig: redisConfig
}

2、引入配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//根据环境变量值,引入相应的配置.( NODE_ENV设置在下一节介绍 )
//以这种方式引入,全局变量将生效
//下面这段代码最好在koa.js执行前引入,例如置于app.js文件的最顶部
if( process.env.NODE_ENV === 'development' ) {
require('../config/dev.env.config')
} else if( process.env.NODE_ENV === 'test' ) {
require('../config/test.env.config')
} else if( process.env.NODE_ENV === 'production' ) {
require('../config/prod.env.config')
}
//非全局变量引入, 在需要使用的时候引入
let redisConfig = require('../config/dev.env.config').redisConfig
if( process.env.NODE_ENV === 'test' ) {
const redisConfig = require('../config/test.env.config').redisConfig
} else if( process.env.NODE_ENV === 'production' ) {
const redisConfig = require('../config/prod.env.config').redisConfig
}

3、系统配置参数也可以像log的配置文件一样写成json文件,应如 依赖 config(npm i –save config) 解析json文件

三、应用启动命令配置

1、命令配置: 在 package.json 中的scripts 字段是配置node应用的各种脚本运行命令:例如

1
2
3
4
5
"scripts": {
"start": "export NODE_ENV='development' && node --harmony bin/dispatch.js",
"dpytest": "export NODE_ENV='test' && node --harmony bin/dispatch.js",
"dpyprod": "export NODE_ENV='production' && node --harmony bin/dispatch.js",
}

2、命令执行:

npm start:表示执行脚本 “export NODE_ENV=’development’ && node –harmony bin/dispatch.js”, 这个段脚本可以一分为二:

a、export NODE_ENV=’development’ 设置 node 环境变量为 ‘development’
b、node –harmony bin/dispatch.js node 运行脚本
npm run dpytest 和 npm run dpyprod则分别执行脚本”export NODE_ENV=’test’ && node –harmony bin/dispatch.js”和export NODE_ENV=’production’ && node –harmony bin/dispatch.js
注意: 非 start 的命令, 都需要加上 run, 不加 run 是 start 的特权。
3、使用pm2启动应用例子

1
2
3
4
5
"scripts": {
"pm2dev": "export NODE_ENV='development' && pm2 start bin/app.js --name serverdev -o logs/app.log && pm2 logs serverdev",
"pm2res": "pm2 restart serverdev",
"pm2del": "pm2 delete serverdev",
},

npm run pm2dev 启动服务
npm run pm2res 重启服务
npm run pm2del 删除进程

总结

之后的介绍将基于本篇介绍的结构工程结构, 且启动方式将基于pm2