结构化项目
在上一篇文章中,我们搭建了一个基础API服务,讲所有的代码信息都集中在了一个文件中,在项目规模扩大之后会加大开发、维护的难度。
项目工程化设计原则:
1、单业务模块化
大多数的内务需求,都最终可以被归纳进单个模块,模块与模块间具有物理文件独立性,能更好地便于多人的项目团队人员同时维护代码。
2、模块二百行原则
二百行是个虚数泛指,但也在大量的项目实践后发现,大多数单文件的模块代码,在良好的设计规划下,往往很难突破两百行的数目,而两百行内的代码的阅读与维护,也都是一个心理压力较小的量级。
正所谓合久必分,单个模块的代码量大量增长,可以考虑分离部分代码到外部文件来管理,通过模块 require 的方式形成关联,以保持各模块代码的相对精简与可维护性。
3、同类模块分组化
分组在本文中一般指形成一个文件目录,来对一些功能相似的业务模块形成管理,比如常见的路由模块,会有大量不同的基于 resource 的资源路由,被分离在单个模块文件中,最终汇总在 router 的目录。再比如定义数据库表结构映射关系的 model 模型类模块,最终也往往会习惯汇总到一个 model 的目录中,形成统一管理。
4、配置文件分离
系统中往往会存在一些诸如服务启动的端口号、服务名称、数据库连接配置、服务启动的性能参数域值配置等等,这些参数的业务逻辑往往离散在系统中的各个独立模块中,将其抽取在一个统一的类似 config.js 的配置文件中进行整体管理,可以避免日后打地鼠式的在模块中四处找寻,以及修改编辑疏漏。
基于上述原则,我们就基础项目工程进行拆分重构。
重构步骤:
1、项目目录
├── config # 项目配置目录 │ ├── index.js # 配置项目中的配置信息 ├── models # 数据库 model ├── node_modules # node.js 的依赖目录 ├── plugins # 插件目录 ├── routes # 路由目录 │ ├── hello-world.js # 测试接口 hello-world ├── utils # 工具类相关目录 ├── app.js # 项目入口文件 ├── package.json # JS 项目工程依赖库 ├── readme.md # 项目工程如何被使用的说明手册
2、分离路由
// routes/hello-hapi.js module.exports = [ { method: 'GET', path: '/', handler: (request, h) => { return 'Hello, Hapi!!!!!!!'; } }, { method: 'GET', path: '/api/welcome', handler() { return { code: 200, success: true, data: { msg: 'welcome' } } } } ]
3、分离config
// config/index.js module.exports = { host: '127.0.0.1', port: 3000, }
4、关联 config 与 route 路由模块
// app.js const Hapi = require('hapi'); const config = require('./config'); const routesHelloHapi = require('./routes/hello-hapi'); const server = Hapi.server({ port: config.port, host: config.host, }); server.route([ ...routesHelloHapi ]); const init = async () => { await server.start(); console.log(`Server running at: ${server.info.uri}`); }; process.on('unhandledRejection', (err) => { console.log(err); process.exit(1); }); init();
5、环境配置
引入一个被 .gitignore 的 .env 的文件,以 key-value 的方式,记录系统中所需要的可配置环境参数。并同时配套一个.env.example 的示例配置文件用来放置占位,.env.example 可以放心地进入 git 版本仓库。
# .env.expamle # 服务的启动名字和端口,但也可以缺省不填值,默认值的填写只是一定程度减少起始数据配置工作 HOST = 127.0.0.1PORT = 3000
最后复制出一个真实的 .env 文件,供项目使用
# .env # 服务的启动名字和端口,但也可以缺省不填值,默认值的填写只是一定程度减少起始数据配置工作 HOST = 127.0.0.1PORT = 3000
读取环境配置:
Node.js 可以通过 env2 的插件,来读取 .env 配置文件,加载后的环境配置参数,可以通过例如 process.env.POST 来读取端口信息。
# 安装 npm i env2
// app.js require('env2')('./.env')
修改config/index.js
// config/index.js const { env } = process;module.exports = { host: env.host, port: env.port, }
还没有评论,来说两句吧...