Egg.js VS Thinkjs 简单分析使用
@[toc](Egg.js VS Thinkjs 简单分析使用)
命令行脚手架
Egg.js
1 | $ npm i egg-init -g |
打开浏览器访问 http://127.0.0.1:7001/
Thinkjs
1 | $ npm install -g think-cli |
打开浏览器访问 http://127.0.0.1:8360/
从创建项目的脚手架来看两者基本一致,但是 think-cli 支持 使用命令行创建 controller、service、model 等
1 | $ thinkjs controller <controller-name> [module-name] |
更多使用方法查看https://github.com/thinkjs/think-cli
配置
Egg.js
默认配置在 config 文件夹下 config.default.js
写法
1
2
3
4
5
6
7
8
9
10
11module.exports = {
keys: "my-cookie-secret-key",
};
// 或
exports.keys = "my-cookie-secret-key";
// 或
module.exports = (appInfo) => {
return {
keys: "my-cookie-secret-key",
};
};支持多环境配置
多个配置文件会覆盖合并,框架在启动时会把合并后的最终配置 dump 到
run/application_config.json
(worker 进程)和run/agent_config.json
(agent 进程)
Thinkjs
根据不用功能划分不同配置文件
config.js
通用的一些配置adapter.js
adapter 配置router.js
自定义路由配置middleware.js
middlware 配置validator.js
数据校验配置extend.js
extend 配置
写法
1
2
3
4
5module.exports = {
keys: "my-cookie-secret-key",
};
// 或
exports.keys = "my-cookie-secret-key";支持多环境配置
最终配置文件会合并,合并后的配置在
runtime/config/[env].json
中支持动态设置配置
Koa 内置对象
Egg.js 和 Thinkjs 都用扩展 Koa 对象,app,request,response,context
Egg.js
启动自定义脚本获取
1 | // app.js |
controller 中使用 this.ctx.app
this.ctx
this.ctx.request
this.ctx.response
Thinkjs
任何地方使用think.app
controller 中使用 this.ctx
this.ctx.req
this.ctx.res
中间件
两者都是基于 Koa 实现的,中间件基于洋葱圈模型
两者写法一致
1 | // middleware/log.js |
Egg.js
用法:在 config.default.js 配置
1 | module.exports = { |
Thinkjs
用法:在src/config/middleware.js
文件 ,数组顺序即为中间件的加载顺序
1 | module.exports = [ |
Controller
写法基本类似,只不过 thinkjs 中需要额外添加一个 Action
Egg.js
1 | // base_controller.js |
1 | // controller |
controller 生效还要添加路由,比 Thinkjs 麻烦。
1 | module.exports = app => { |
Thinkjs
1 | const Base = require("./../base"); |
红红火火恍恍惚惚,让 egg.js 的 controller 集成自定义的一个基类。强行使他们写法一致!😄
Router
都支持 restful。
Egg.js
1 | module.exports = (app) => { |
Thinkjs
对于 controller,不用写 router。也可以自定义,我没有用到过,就不写了。
RestFul
Egg.js
1 | // app/router.js |
映射关系
Method | Path | Route Name | Controller.Action |
---|---|---|---|
GET | /posts | posts | app.controllers.posts.index |
GET | /posts/new | new_post | app.controllers.posts.new |
GET | /posts/:id | post | app.controllers.posts.show |
GET | /posts/:id/edit | edit_post | app.controllers.posts.edit |
POST | /posts | posts | app.controllers.posts.create |
PUT | /posts/:id | post | app.controllers.posts.update |
DELETE | /posts/:id | post | app.controllers.posts.destroy |
Thinkjs
1 | // router.js |
通过自定义路由,将 /user/:id
相关的请求指定为 REST Controller,然后就可以对其访问了。
GET /user
获取用户列表,执行getAction
GET /user/:id
获取某个用户的详细信息,执行getAction
POST /user
添加一个用户,执行postAction
PUT /user/:id
更新一个用户,执行putAction
DELETE /user/:id
删除一个用户,执行deleteAction
Service
基本一样
Egg.js
1 | // service/user.js |
1 | // controller.js |
Thinkjs
1 | // service/user.js |
1 | // controller |
插件/适配器????
Egg.js(插件)https://eggjs.org/zh-cn/basics/plugin.html
使用 npm 安装插件
1 | $ npm i egg-mysql --save |
使用
1 | // config/plugin.js |
Thinkjs(适配器)https://thinkjs.org/zh-cn/doc/3.0/adapter.html
使用 npm 安装插件
1 | $ npm i think-model-mysql --save |
使用
1 | // config/adapter.js |
定时任务
Egg.js
每个文件写一个定时任务,存放在 app/schedule
1 | module.exports = { |
Thinkjs
所有定时任务存在一个文件中
1 | // src/config/crontab.js |
多进行和进程间通信
两者都是有一个 master 进程和若干 worker 进程。不同的是 Egg.js 多一个 agent 进程。
在这方面 Egg.js 比 Thinkjs 要方便许多。一些脏活累活都可以交给 agent 进程去做。比如长连接,监听消息队列等。worker 间通信都是通过 master 进程中转
Egg.js
1 | // agent.js 监听消息队列 |
1 | //app.js 接收agent进程发送的消息 |
Thinkjs
在 Thinkjs 中监听消息队列只能在 master 中了。如果有好的办法实现上边功能,请教我。
数据库模型
Egg.js
Thinkjs
TypeScript 支持
Egg.js
- 官方支持 mysql.
- 支持 ORM 框架sequelize。还没有用到就不提了。
- mongo
Thinkjs
- 默认支持 mysql,
- 官方还支持 mongo.https://github.com/thinkjs/think-mongo
- ORM https://github.com/thinkjs/think-sequelize
单元测试
Egg.js
完整的单元测试框架使用 Mocha
Thinkjs
官网上没有提到单元测试内容,但是好像也支持,脚手架生成项目有 test 文件夹,使用的框架是 ava
部署
Egg.js
使用egg-scripts
模块部署。脚手架自带。
1 | npm run start ## 启动 |
与阿里的 alinode 快速集成。
Thinkjs
转译npm run compile
- Docker
- PM2
- 直接启动 production.js
node production.js