koajs 作为一个非常优秀的框架,正在慢慢的替代 expressjs,虽然 expressjs 宝刀未老,不管是各个框架的 cli, 还是其他地方都依然坚挺着,可是就像 jQuery 一样,大半江山正在慢慢的失守,为了能继续在公司看天花板,还是赶紧先学起来先。
第一次来这里写文章,写的不好,求轻喷
前言
最开始学 koa,惊讶其简洁,甚至是简陋的语法,觉得自己好像什么都能干,可是好像又什么也干不了。
其中最头疼不是其洋葱模型,而是常用的组件,比如路由和session就有好几个推荐的,官方也调皮,一次维护两,视图组件现在都是自己瞎写凑合着用,个人项目没人管,随便瞎搞了。
后面接触了基于 koa 开发的框架 egg.js ,文档的质量非常好,让我这种 node 小白有眼前一亮的感觉。
不过后续在编写一些简单的小应用,比如类似微信中控服务器,职责比较单一的小应用,就感觉有点鸡肋了,用了过于臃肿,不用又没信心能维护好这一个应用,所以就自己研究 egg.js 通过模仿,慢慢的搭建属于自己的一套模板出来。
第一步:拓展 KoaApplication 类
注意:这步拓展不是必须的,只是这样使用会更加方便而已
后续需要用到一个 baseDir
的参数,这个是项目的根路径,默认为 process.cwd()
的值。
之所以需要这个,主要是用于约定的目录查找,比如配置文件目录的自动查找用,而且有了这个参数,用于可以自定义应用路径,这个在其他框架,比如 python 的 flask
就比较能代表性的突出这个参数的重要性。
参考实现
第二步:解决不同环境的配置问题
参考 egg.js 的 config 介绍,实际上 egg 是通过维护 serverEnv 来实现在不同环境下加载不同的配置文件。同时,通过维护一个专门的环境变量 EGG_SERVER_ENV 来实现自定义加载配置文件的目的。
比如我有三个环境,分别是生产环境,本地开发环境和测试环境,那么对应的配置文件就是 config.prod.js
,config.local.js
,config.testing.js
, 因为测试环境 egg 没有提供支持,我们可以通过给环境变赋值 export EGG_SERVER_ENV=testing
的方式来支持测试环境的配置。
egg 还支持 .env
文件的读取,可以通过其添加自定义环境的支持, serverEnv 的源码可以看这里.
这里如果是通用的配置文件,可以创建一个 config.default.js
的文件,将公共配置写在这里,这里的配置会和当前环境的配置合并,成为最终的配置文件,合并规则可以看这里。
参考实现
注意:这里的只是贴出魔改的核心代码,其他代码截图时屏蔽了
因为存在多个配置来源,所以为了方便查找问题,egg 会生成 application_config_meta.json 文件,用于定位配置的来源,config meta d的生成可看源码
第三步:定义目录结构
这里仅仅是参考 eggjs 的目录结构,并没有强约定,因为不想太重了,如果真的需要,直接使用 eggjs 会更好。
第四步:编写应用入口,服务启动脚本和路由定义文件
应用的入口文件和服务的启动脚本文件是我按自己的想法分开的,主要是用于分离本地开发引入的插件和线上运行的插件,比如本地开发可以引入 mockjs 和 代理插件,写个中间件在bin/local
挂载 文件那里,这样生产环境中只要接口删除就不用去处理开发的代码了
app.js
bin/serve
local 只是添加了开发依赖的插件而已,启动逻辑一样
app/router.js
site.js 适用于渲染官网页面的
配置文件编写可参考 egg.js,和其的用法保持一致,这样就不用写文档了,机智如我(●ˇ∀ˇ●)。
第五步:编写启动脚本
开发使用 nodemon 来启动服务,生产环境我是使用 pm2 来启动服务的。
package.json
package.js 文件里面引入了 husky 和 lint-staged 来进行本地代码检查,使用 npm version
来管理软件版本和 git tag 的自动生成,使用 standard ( standard 最新版已集成 eslint ) 来格式化 js 代码
nodemon.json
以前我用 supervisor 的,这个第一次用,还挺好用的 (●ˇ∀ˇ●),就是还没试过 js api,json 配置不够灵活,使用 js 就没这问题。
pm2.config.js
因为语言组织能力比较差,所以以图片代替,代码后面等整理后再上传。
看到掘金这么多推 vs 插件的,我也来推个,应该很多人都推过了,以下插件 是 webstorm 迁移 vscode 必备插件,降低适应时间
- 代码运行
- Git 历史
- Git 历史2
- 路径自动补全
- 本地文件历史
- webstorm 按键映射
- JavaScript Standard Style, 推荐设置 standard.autoFixOnSave 为 true