eggjs-feed 系列期刊,用于汇总近期值得关注的 egg 相关动态,将不定期发布。
转自知乎专栏:https://zhuanlan.zhihu.com/p/30673066
Node 8 终于 LTS 了,启动 Egg 2.x 。
- 基于新的 V8,因此性能得到大幅提升,我们内部测试数据提升很大。
- Async 等期待已久的特性,终于可以放心使用了。
- 新的 N-API 特性,更好的跨平台兼容原生插件。
- ES Modules作为实验性特性已经引入,但目前还比较早期,不建议使用。
- Node 成为 V8 的一等公民。
- NEWS: Node.js 8 Moves into Long-Term Support
因此,Egg 也正式开始 2.x 的计划,欢迎参与讨论,传送门:eggjs/egg#1564
同时再次重申下:早在 Egg 1.0 版本的时候,你早就可以使用 Async 特性和 Koa2 的生态,无需太多关注 Egg 的底层版本。
Egg 的 VSCode 插件尝鲜
- 目前还处于早期版本,欢迎试用。
- 期望对 TS 和 VSCode 熟悉的同学,能参与进来帮我们一起完善,尤其是智能提示这块。
- eggjs - Visual Studio Marketplace
- 支持的特性:
- 自动生成调试配置文件 launch.json
- 支持 Service 和 Controller 的 Snippet
值得注意的讨论和变更
在 eggjs 团队的日常协作中,遵循「基于 GitLab 的硬盘式异步协作模式」。 通过 issue 发起 RFC 提案 -> 讨论定稿-> 提交 Pull Request -> Code Review -> 发布。 这样便于沉淀,即使是当时没有参与讨论的开发者,事后也能通过 issue 了解某个功能设计的前因后果。
Θ Egg 新增了订阅模型的 RFC
- 提案讨论地址:[RFC] 订阅模型
- 所有的订阅模式都可以用相同的方式来写。
- 上次提到的 egg-schedule 改造也是基于此的,相关文档已经更新:定时任务
Θ Controller 支持父类方法,方便基类继承
- 感谢 @lkspc 的 PR,eggjs/egg-core#119
- 现在 Controller 基类的方法,能注册到路由了。
Θ egg-scripts 优化,发布 2.x
- 注意:不再支持 Windows,因此是 BREAK CHANGE 发了大版本。
- 增加启动期检查,新增 eggctl 别名等优化
- eggjs/egg-scripts#9 和 eggjs/egg-scripts#10
Θ egg-multipart 示例更新
- 最近很多同学都在咨询「多文件上传」的问题,因此更新了一版示例
- 传送门:eggjs/examples/multipart
- PR 地址:eggjs/examples#43
Θ egg-bin 内置的 mocha 升级为 4.x
- mocha 终于抛弃了老古董版本的 Node 的支持,轻装上阵。
- 主要影响是非强制退出进程,egg-bin 已兼容。
- https://boneskull.com/mocha-v4-nears-release
- eggjs/egg-bin#83
Θ egg-oss 插件支持 Promise,并增加 sts 模式
Θ egg-cluster 优化了启动体验
- 发现端口占用则直接退出,而不是反复启动。
- eggjs/egg-cluster#48
最佳实践分享
早期用户应该比较熟悉,可能也比较不喜欢以下这个风格的代码:
module.exports = app => {
class HomeController extends app.Controller {
* index() {
this.ctx.body = 'hi, egg';
}
}
return HomeController;
};
现在我们已经支持更自然的写法: (其实一直支持,只是未写到文档。)
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
this.ctx.body = 'hi, egg';
}
}
module.exports = HomeController;
通过这种方式,你可以享受到部分 VSCode + TS 的代码提示体验优化。
PS:上层框架开发者需要改变写法如下,否则用户自定义 Controller / Service 基类会有问题:
const egg = require('egg');
module.export = Object.assign(egg, {
Application: class MyApplication extends egg.Application {
},
});
社区文章
- @姜天意:在 egg 中使用 GraphQL
- 来自 @sky 的 WebPack + Egg + Vue / React 实践系列文章:easywebpack
- Egg 实现一个 mTime 时光网
- 来自社区的上层框架实践 - EggBorn.js
- Vue.js + Framework7 / Vue Router + Webpack + EggJS + MySql
- 丁香园的接口管理系统 - API Mocker
- EggJS + Vue.js + ElementUI + Mock.js
- 2017年度开源贡献榜 国内阿里排第一
- 然而因为 Egg 的 commit 邮箱没有使用公司邮箱,故未被统计进去。😂
Egg.js V2.x 要开始开发啦,赞!!
nice 2.x 感觉可以出一个ts的init脚手架 开发plugin的时候可以用到
@solarhell 其实你现在都可以写了,egg-init 本身支持的,或者直接基于 yo 写也行的。
另外,贯高那边有在考虑做一个 egg 的上层框架 tsegg 封装。
为啥不在支持windows了呢
可以看下那个 PR,上面的每一个变更都有附上对应的 PR 或 RFC 说明地址的。
- 一般来说,线上服务端都是推荐 linux-base 的系统。
- 1.x 是
egg-scripts stop
不支持,只有egg-scripts start
支持,因为在 win 下列出 process 很麻烦。 - 2.x 在 start 里面做了
tail
的一些日志操作,直接用 shell 指令方便点。 - 也只是
egg-scripts
不支持而已,egg 本身还是支持的。 - 实在需要的话,直接写个 index.js 启动,然后自己 kill 就好了。或者自己继承下 egg-scripts 做下支持。
顶一个,不过eggjs在win版vscode上开启调试会导致vscode卡顿,我也在找原因,一开始开发不会,开发到中期就会了,我也还在找原因 ps: 我应该叫猪哥???
非常棒,支持下 egg
@atian25 我看看能不能让egg-scripts stop支持windows . 事情多,时间不够,期望能实现~
给力
const egg = require('egg');
module.export = Object.assign(egg, {
Application: class MyApplication extends egg.Application {
},
});
这段意思是想用上这种新的类写法,要参照egg文档框架开发那一节,定制一下是吗? 之前测了下新的写法不能直接支持 app.js 里面的基类,原来原因是这个
@waitingsong https://github.com/yibn2008/find-process
可以试试这个,我之前试过,那个路径被转义的太复杂了,不知道多少个 \
搞的我头晕,手头没 win 机器就懒的搞了。
而且某些 win 有 bug,需要装补丁。
不急,反正绝大部分线上都不是 win
@rrbe 原因其实很简单,
之前框架一般这么写:
const egg = require('egg');
// 多了个 {}
module.export = Object.assign({}, egg, {
Application: class MyApplication extends egg.Application {
},
});
也就是,返回给上层的是新的一个对象,那用户 require('egg').Service
肯定不行,而必须是 require('myframework').Service
而列出的新写法是,直接覆盖 egg 本身并返回,所以就可以了。
@atian25
module.export = Object.assign({}, egg, {});
这种扩展对象估计还会导致TS里面类型推导会丢失