【多图】模仿 egg.js 使用 koa2 搭建项目

koajs 作为一个非常优秀的框架,正在慢慢的替代 expressjs,虽然 expressjs 宝刀未老,不管是各个框架的 cli, 还是其他地方都依然坚挺着,可是就像 jQuery 一样,大半江山正在慢慢的失守,为了能继续在公司看天花板,还是赶紧先学起来先。

第一次来这里写文章,写的不好,求轻喷

前言

最开始学 koa,惊讶其简洁,甚至是简陋的语法,觉得自己好像什么都能干,可是好像又什么也干不了。

其中最头疼不是其洋葱模型,而是常用的组件,比如路由和session就有好几个推荐的,官方也调皮,一次维护两,视图组件现在都是自己瞎写凑合着用,个人项目没人管,随便瞎搞了。

后面接触了基于 koa 开发的框架 egg.js ,文档的质量非常好,让我这种 node 小白有眼前一亮的感觉。

不过后续在编写一些简单的小应用,比如类似微信中控服务器,职责比较单一的小应用,就感觉有点鸡肋了,用了过于臃肿,不用又没信心能维护好这一个应用,所以就自己研究 egg.js 通过模仿,慢慢的搭建属于自己的一套模板出来。

第一步:拓展 KoaApplication 类

注意:这步拓展不是必须的,只是这样使用会更加方便而已

后续需要用到一个 baseDir 的参数,这个是项目的根路径,默认为 process.cwd() 的值。

之所以需要这个,主要是用于约定的目录查找,比如配置文件目录的自动查找用,而且有了这个参数,用于可以自定义应用路径,这个在其他框架,比如 python 的 flask 就比较能代表性的突出这个参数的重要性。

参考实现

第二步:解决不同环境的配置问题

参考 egg.jsconfig 介绍,实际上 egg 是通过维护 serverEnv 来实现在不同环境下加载不同的配置文件。同时,通过维护一个专门的环境变量 EGG_SERVER_ENV 来实现自定义加载配置文件的目的。

比如我有三个环境,分别是生产环境,本地开发环境和测试环境,那么对应的配置文件就是 config.prod.jsconfig.local.jsconfig.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 文件里面引入了 huskylint-staged 来进行本地代码检查,使用 npm version 来管理软件版本和 git tag 的自动生成,使用 standard ( standard 最新版已集成 eslint ) 来格式化 js 代码

nodemon.json

以前我用 supervisor 的,这个第一次用,还挺好用的 (●ˇ∀ˇ●),就是还没试过 js api,json 配置不够灵活,使用 js 就没这问题。

pm2.config.js

因为语言组织能力比较差,所以以图片代替,代码后面等整理后再上传。

看到掘金这么多推 vs 插件的,我也来推个,应该很多人都推过了,以下插件 是 webstorm 迁移 vscode 必备插件,降低适应时间

猜你喜欢

转载自juejin.im/post/5b4380d46fb9a04fd15ffaba