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里面类型推导会丢失
支持,实习开始给老板推荐用egg重写试试
@atian25 是的,window版本会这样,我之前用centos的时候不会,蛮流畅的,但是window开久了就卡,还有一些原因没找到
@atian25 当所有worker启动完毕 start.js
if (isDaemon) {
this.logger.info(`Save log file to ${logDir}`);
const [ stdout, stderr ] = yield [ getRotatelog(argv.stdout), getRotatelog(argv.stderr) ];
options.stdio = [ 'ignore', stdout, stderr, 'ipc' ];
options.detached = true;
const child = this.child = spawn('node', eggArgs, options);
this.isReady = false;
child.on('message', msg => {
if (msg && msg.action === 'egg-ready') {
this.isReady = true;
this.logger.info('%s started on %s', this.frameworkName, msg.data.address);
child.unref();
child.disconnect();
process.exit(0);
}
});
这儿能否获取到所有(或者任一)worker的pid呢? 若不行,那么哪儿能拿到pid
@waitingsong 要看你想在哪里拿到,为了避免 X-Y 问题,可以先描述下你的使用场景。
egg-core的basecontextclass这个文件,是怎么运行,看了好多遍源码没看明白,控制器取ctx的时候,在basecontextclass里是Undfiend取不到的。求解
@andylei18 在 app 上的,它是 Service,Controller 等的基类
支持一下!!!
https://github.com/thinkkoa Koa2 + Node.js 8 LTS 已经用于实战了,让Node.js开发变得赏心悦目。
@atian25 是覆盖了koa的extend里的context然后ctx 能取到?我知道是 Service,Controller 的基类
@andylei18 你的问题是?没看懂,避免 X-Y问题,你的场景是什么?
2017年度最受欢迎中国开源软件评选 - 开源中国社区 来给 Egg 投票吧~ http://www.oschina.net/project/top_cn_2017
@atian25 我是在看egg 的源码 然后自己fork了跑代码,在请求后basecontext里无法取到ctx,所以就想请教下
明显是后面的用法更好,更舒服,猪哥威武
@andylei18 给出对应的复现代码库吧,basecontext 是初始化的时候传递 ctx 进去的,不太明白你是怎么个跑法,是跑单元测试还是啥,具体报错是啥
@atian25 他没有理解路由到controller是怎么绑定的
@i5ting 通过监听 get,post等类型,来判断 extends koa-router,然后去判断callback的fun是gen还是async,这块我看懂了,但是如果我不接egg的router,我自己走1个koa-router的话 那么就断了
@andylei18 去 egg issue 那边提吧
@andylei18 哈哈,去提issue吧
@atian25 想问下egg哪部分用了enclose.io,现在可以做到二进制更新吗,为啥官网挂着外链 另外,问下egg-mocha有多模块test汇总的方案吗,比如说微服务多个模块的工程都是独立的,开发的时候放到一起统一查看单元测试结果和覆盖率
@walter211 在我们自己的 tnpm 等 cli 里面用到,在 egg 里面没有用到。enclose.io 也是我们兄弟团队做的,所以挂着。
egg-bin 的单元测试是基于 nyc 的,你可以看看它的命令行参数研究下,应该可以把中间的 json 产物汇总,执行一条指令即可。
@atian25 搞定了,多谢, 1 问下egg自己的mock数据怎么生成的,有用什么工具吗。 2 2.0计划什么时候release
- 搞定的话,就写个文章分享给大家吧~
- 我们有 https://github.com/eggjs/egg-development-stub ,至于数据,自己加上 Mock.js 造就好了
- 已经 release 了,发布公告和文档还没完,最迟下周吧
@atian25 1 。。。是我蠢了,并没有什么,把所有test文件遍历出来跑一边就可以了 2 我以为Mock.js是一个新库……有用到类似swagger的东西维护一套model吗 3 棒!
@walter211 我们内部是有 jar2proxy,把后端的 HSF jar 自动生成对应的 proxy rpc 代码。
社区可以自行封装 swagger 即可,跟 koa 没啥大的区别