[eggjs-feed-05] Node 8 LTS + Egg 2.x 计划
发布于 7 个月前 作者 atian25 3670 次浏览 来自 分享

image.png

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 支持父类方法,方便基类继承

Θ egg-scripts 优化,发布 2.x

Θ egg-multipart 示例更新

Θ egg-bin 内置的 mocha 升级为 4.x

Θ egg-oss 插件支持 Promise,并增加 sts 模式

Θ egg-cluster 优化了启动体验

最佳实践分享

早期用户应该比较熟悉,可能也比较不喜欢以下这个风格的代码:

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 {

  },
});

社区文章

37 回复

Egg.js V2.x 要开始开发啦,赞!!

nice 2.x 感觉可以出一个ts的init脚手架 开发plugin的时候可以用到

@solarhell 其实你现在都可以写了,egg-init 本身支持的,或者直接基于 yo 写也行的。

另外,贯高那边有在考虑做一个 egg 的上层框架 tsegg 封装。

为啥不在支持windows了呢

@waitingsong

可以看下那个 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 里面的基类,原来原因是这个

@mumudev 确实是开启 debug 才出现么?

随意~ 我没狼叔 @i5ting 帅,所以怎么能认错呢

@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

@walter211

  1. 搞定的话,就写个文章分享给大家吧~
  2. 我们有 https://github.com/eggjs/egg-development-stub ,至于数据,自己加上 Mock.js 造就好了
  3. 已经 release 了,发布公告和文档还没完,最迟下周吧

@atian25 1 。。。是我蠢了,并没有什么,把所有test文件遍历出来跑一边就可以了 2 我以为Mock.js是一个新库……有用到类似swagger的东西维护一套model吗 3 棒!

@walter211 我们内部是有 jar2proxy,把后端的 HSF jar 自动生成对应的 proxy rpc 代码。

社区可以自行封装 swagger 即可,跟 koa 没啥大的区别

回到顶部