起因
今年我开始在生产环境里试用node(貌似比很多人慢了一年…)。 由于公司node环境较低,我只能使用一款修改过的express, 为了解决兼容问题我还用typescript进行编译(事实证明typescript简直awesome)。
随着公司更新了新版的node(也不高,6.1.2)。我也有了更多选择, 有一天我在cnode上面看到了egg的发布,打算自己试一下。
废话少说,从快速入门开始
egg有一个详细的快速入门https://eggjs.org/zh-cn/intro/quickstart.html, 但是时间紧张,我直接用脚手架建项目了。
egg-init egg-example --type=simple
目录结构
我曾一度认为一个较好的框架其实不需要什么目录结构,自打我和其他人合作之后我就彻底打消这个念头了。
egg-project
├── tsconfig.json
├── package.json
├── app.js (可选)
├── agent.js (可选)
├── ts
| ├── router.ts
│ ├── controller
│ | └── home.ts
│ ├── service (可选)
│ | └── user.ts
│ ├── middleware (可选)
│ | └── response_time.ts
│ ├── schedule (可选)
│ | └── my_task.ts
│ ├── public (可选)
│ | └── reset.css
│ └── extend (可选)
│ ├── helper.ts (可选)
│ ├── request.ts (可选)
│ ├── response.ts (可选)
│ ├── context.ts (可选)
│ ├── application.ts (可选)
│ └── agent.ts (可选)
├── config
| ├── plugin.js
| ├── config.default.js
│ ├── config.prod.js
| ├── config.test.js (可选)
| ├── config.local.js (可选)
| └── config.unittest.js (可选)
└── test
├── middleware
| └── response_time.test.js
└── controller
└── home.test.js
删了项目里的app文件夹,并把app文件夹加到.gitignore里面。 修改tsconfig.json,css可以用别的工具解决,不在本次话题里面。
{
"compilerOptions": {
"target": "ES2016",
"module": "commonjs",
"outDir": "./app",
"rootDir": "./src"
}
}
另外,我把view文件夹给删掉了,理由是我一直比较推崇前后端同构,所以既然有view层,前后端的模板应该一致, 目前前端忙于组件化,基于vue和jsx的模板语言也很多(虽然性能不高,但可预见性能问题会很快解决),所以本文暂时不谈view。
OK,可以愉快地写代码了
因为官网没有TS的相关文档,这里记录一下。
新建一个Controller
// src/controller/home.ts
import { Controller } from "egg";
import { prefix, suffix } from "../frags";
export default class HomeController extends Controller {
async index() {
this.ctx.body = `${prefix}<h1>Hello World</h1>${suffix}`;
}
}
Router的引用
import { Application } from "egg";
export default (app: Application) => {
app.get('/', "home.index");
}
结论
egg其实不错,能换自然是最好了。但是不换的话,如果项目已经跑起来了, 说明egg该趟的坑都被你自己趟过了,而且已经用了typescript,async和await自然都用上了, 所以(在我看来)generator就没更多优势了。
但是如果你还没用上typescript…真的,动态一时爽,重构火葬场啊。
以上。