CNode

企业级 Node.js 框架 Egg 发布 2.0,性能提升 30%,拥抱 Async

精华
分享
Aatian25发布于9 年前最后回复8 年前155 回复52761 浏览0 收藏

image.png

原文地址:知乎专栏 https://zhuanlan.zhihu.com/p/31640541

给大家介绍下,Egg 2.0 正式版,今天 12.3 冒泡啦,距 3.21 的 Egg 1.0 版本 时隔 8 个月。

image.png

Egg 是阿里 Node.js 的核心基础框架,面向『企业级的 Web 基础框架』这个领域,提供了「微内核 + 插件机制 + 框架定制能力」,完美达成生态共建和差异化定制的平衡点。
既适合个人小项目快速开发,也适合团队架构师基于自身的技术架构在 Egg 基础上扩展出适合特定团队业务场景的框架。
它沉淀自阿里在各行各业不同领域的大规模工程实践经验,稳定支撑了多年天猫双11大促,顶级流量压力。

2.0 特性

  • 基于 Koa 2.x
  • 框架层优化带来 30% 左右的性能提升,不含 Node 8 带来的提升。
  • 为了方便开发者快速升级,保持了对 Egg 1.x 以及 generator function 的兼容。

image.png

如何升级

Egg 的理念之一是渐进式增强,故我们为开发者提供渐进升级的体验。

  1. Node.js 使用最新的 LTS 版本(>=8.9.0)。
  2. 修改 package.json 中 egg 的依赖为 ^2.0.0。
  3. 检查相关插件是否发布新版本(可选)。
  4. 重新安装依赖,跑单元测试。

搞定!几乎不需要修改任何一行代码,就已经完成了升级。

这得益于 Egg 对 1.x 的兼容,但为了更好的统一代码风格,以及更佳的性能和错误堆栈,我们建议开发者参考 升级指南 进一步升级。

未来规划

如您所知,Egg 采用的是 『微内核 + 插件 + 上层框架』 模式。

其中微内核经过 3 年 4 个版本,以及在阿里的大规模应用,已经打磨的非常稳定。

接下来我们的重心主要在开发者体验方面的优化,包括:

  • 更好的开发者体验,包括 TypeScript,开发者工具,IDE 工具等方面。
  • 社区扶持
    • 协助业界的前端团队,打造适合特定团队业务场景的上层框架,欢迎勾搭。
    • 分享我们在团队、协作、规范化等方面的经验。
    • 分享在 Docker,GraphQL,SSR 等方面的探索和最佳实践分享。
  • 国际化,官网和文档翻译等。

同时,我们也欢迎社区更多的参与,一起打造更完善的生态。

image.png

我们这一年

截止至今天(2017-12-03):

社区方面:

  • 来自 BAT,丁香园,全民直播等多家兄弟公司的反馈和插件回馈。
  • 来自 GitHub Dependents 的统计:992 Repositories, 231 Packages
  • NPM 搜索结果超过 400 个。
  • 上层框架:
    • 北斗 - Isomorphic framework for server-rendered React apps
    • avet - A very comfortable framework for writing isomorphic applications
  • 如果你有好的分享,PR 传送门:awesome-egg

趣味数据:

  • 官网访问量中,Mac 占 47% → 这比例挺高的,看来 Node 程序猿都很幸福。
  • 周末的访问量约为平时的 1/3 → 看来 Node 程序猿周末加班少。(滑稽
  • 官网访问来源:站内,直链,外链各 30% 多,来自搜索引擎的较少。

分享交流:

image.png

image.png

写在最后

开源,痛并快乐着。

image.png

查看回复

回复 (152)

A
atian25#1·9 年前

顶楼『分享交流』章节的几个 Slide 推荐看下~ 如果你不熟悉 Egg,可以看下:

image.png

W
waitingsong#2·9 年前

不错。继续完善。

V
vanishcode#3·9 年前

加油!async万岁~

H
holyselina#4·9 年前

支持已投票

W
weichunpeng#5·9 年前

为 Egg 打 Call~~~ 马上在项目中用起来。 另外,有兴趣的可以关注beidou 同构框架, 基于eggjs, 共同建设eggjs生态

C
coldraincn#6·9 年前

如果非要用windows server,该怎么部署。没有入口文件,怎么用pm2

H
hezhongfeng#7·9 年前

牛逼~下个个人项目一定使用

A
atian25#8·9 年前
引用 danielsss看完security risk in node web, 瞬间觉得Egg强壮的很...

@danielsss 在蚂蚁金服线上系统使用的就是这套方案,当然级别不低

W
waitingsong#10·9 年前
引用 coldraincn如果非要用windows server,该怎么部署。没有入口文件,怎么用pm2

@coldraincn https://github.com/eggjs/egg-scripts/pull/11 window下停止服务的解决办法。 貌似egg在考虑保存pid方式的实现 https://github.com/eggjs/egg-cluster/pull/51 windows下隐藏worker窗口实现

D
danielsss#11·9 年前
引用 atian25@danielsss 在蚂蚁金服线上系统使用的就是这套方案,当然级别不低

@atian25 😢原来如此,蚂蚁三次面试与各位大神又失之交臂了. 只能再默默的努力了 自豪地采用 CNodeJS ionic

D
daileimail#12·9 年前

今天体验了一番,是时候重构项目了 From Noder

R
rebornvip#14·9 年前

cool

A
axetroy#18·9 年前

@weichunpeng 基于egg的阿里又一框架,何等原理能快2-5倍?

Y
yt-theme#19·9 年前

666

Y
yt-theme#20·9 年前

666

G
gaoli861121#21·9 年前

厉害

W
weichunpeng#22·9 年前
引用 axetroy@weichunpeng 基于egg的阿里又一框架,何等原理能快2 5倍?

@axetroy 这个2-5倍是相比于客户端渲染而言的,另外这是我们项目的一个采样数据,影响性能的因素实在太多了,不能一概而论。 可以听一下我在D2的分享《打造高可靠与高性能的React同构解决方案》, 直播回放地址我回头贴出来。主要讲的是,复杂场景下,如何将同构性能提升10倍以上。 《React同构与极致的性能优化》 这篇文章里面记录了部分D2分享内容。

W
WangXiaoyYing#23·9 年前

同问

M
MuffinK#24·9 年前

准备试用以下I‘m webapp-cnodejs-vue

Y
yt-theme#25·9 年前

666

Y
yt-theme#26·9 年前

好的

P
panchangzhi#27·9 年前

哇偶,想什么来什么。最近,自己捣鼓搭建,各种搜资料,看大神奇技淫巧。

A
AkiraSun#28·9 年前

egg 有没有钉钉交流群?

W
wangqian6151#29·9 年前

加油赞一个

W
wangqian6151#30·9 年前

加油赞一个

W
wangqian6151#31·9 年前

加油赞一个

W
wenchangshou2#32·9 年前
A
andylei18#33·9 年前
引用 atian25@daileimail 从啥重构到啥?

@atian25 加入 node_modules 这个组织需要什么样的条件?

A
atian25#34·9 年前
引用 AkiraSunegg 有没有钉钉交流群?

@AkiraSun 没有,我们比较崇尚异步交流。我这边可以考虑建一个自助群,但只用于开发者之间的自助交流。 egg 团队的同学都有自己业务的,不会参与实时答疑。

A
atian25#35·9 年前
引用 shenjianzchegg api全英文的 好尴尬啊@atian25 有没中文的 原谅我的英文不是很好

@shenjianzch 学吧,又没几个单词,人不逼下自己都不知道自己多牛逼

A
atian25#36·9 年前
引用 andylei18@atian25 加入 node modules 这个组织需要什么样的条件?

@andylei18 这样要问 苏千 了,应该是熟悉开源项目协作规范,代码规范,持续参与开源项目吧

L
lipengzhou#37·9 年前

恭喜恭喜

来自酷炫的 CNodeMD

A
Alexerx#38·9 年前

我要试试用egg去参加服务外包比赛了🌝

来自酷炫的 CNodeMD

Z
ZirkleTsing#39·9 年前

厉害

H
huilinqiu#40·9 年前

正有兴趣去看看egg,期待有惊喜usereg.png

L
Linbubin#41·9 年前

兹次

H
hhx311#42·9 年前

666

来自react-cnode手机版

S
suntopo#43·9 年前

@atian25 看了eggjs源码,感觉还有多复杂的,类的抽象,继承以及方法的重载大量在运用,刚开始看的时候,很容易被绕晕,请问在开发eggjs的时候,会不会画UML图或时序图之类的帮助开发?

S
suntopo#45·9 年前
引用 atian25@suntopo 多复杂的,类的抽象,继承以及方法的重载大量在运用 具体指?

@atian25 以agent_worker中的loader为例,继承关系Agent->EggApplication->EggCore->Koa

在实例化Agent的时候,从EggCore中constructor方法调用Agent中的get [EGG_LOADER]方法

当时在看代码的时候没有留意到Agent中有重写这个方法,所以纠结里一段时间,感觉要是有个UML图或时序图之类,可以让开发者比较容易的感受到egg的运转。

另外,里面抽象的类很多,一下也无法在脑袋里建立这样一个蓝图,当初大神们在开发egg的时候,是否有这样的图来指导或协助多人开发?

A
atian25#47·9 年前

这几个继承我觉得还好了, Koa 之上加一个 loader 规范就是 EggCore,专注于 loader 这一层的基础规范,然后 Egg 是再上一层的整合。

S
suntopo#48·9 年前
引用 atian25这几个继承我觉得还好了, Koa 之上加一个 loader 规范就是 EggCore,专注于 loader 这一层的基础规范,然后 Egg 是再上一层的整合。

@atian25 单看egg-core的确是很简单,我开始写koa时都是手动load,后来每个文件夹里都写里个index.js自动load当前文件夹中的文件,发现类似loader的雏形。

然后 Egg 是再上一层的整合

再往上走就感觉开始考验智商了,看了eeg,egg-cluster发现原来还可以这样玩,不愧是大牛,egg带来的启发很大,真赞。

A
atian25#49·9 年前

Egg 上面还有的,我们支持框架定制。 像我这边的关系就是:

Koa -> Egg -> @ali/egg (阿里 Egg 基础框架) -> @ali/nut (UC Egg 基础框架)-> @ali/larva (阿里游戏 Egg 基础框架)
Z
zuoyi615#51·9 年前

官网文档没看见操作mongoDB的插件呢

Z
zuoyi615#53·9 年前

@ atian25 谢谢

S
sananiki#54·9 年前

good

X
xiaomi915#55·8 年前

goog

L
lingliZhang888#56·8 年前

9999

K
Kinghts#57·8 年前

看了下文档,挺不错的样子,准备新项目用一用,抢后端同事的饭碗,蛤蛤。

C
CodeofGame#58·8 年前

是类似于express和koa的框架吗

K
kalebwww#60·8 年前
引用 atian25@CodeofGame 看下 2 楼

@atian25 阿里内部的框架包含前端的选型吗?

R
raohong#61·8 年前

不错

A
atian25#62·8 年前
引用 kalebwww@atian25 阿里内部的框架包含前端的选型吗?

@kalebwww 有,看各自部门的上层框架。前端变化太快,这块没有很大一统的共识

C
chunlai666#63·8 年前

不错的文章

K
Kevinzhang29#64·8 年前

,把结局

K
Kevinzhang29#65·8 年前

,把结局

W
wuhw#66·8 年前
  1. 有结合ts的demo吗
  2. 北斗是基于egg实现,在其之上封装了一个新的框架还是借鉴了egg的设计思想和规范进行的重新实现
A
atian25#67·8 年前
引用 wuhw1. 有结合ts的demo吗 2. 北斗是基于egg实现,在其之上封装了一个新的框架还是借鉴了egg的设计思想和规范进行的重新实现

@wuhw

  • ts demo 在 eggjs/examples/hackernews-async-ts 那边有,文档晚点会出。
  • Egg 采用的是 『微内核 + 插件 + 上层框架』 模式。,支持团队架构师基于自身的技术架构在 Egg 基础上扩展出适合特定团队业务场景的框架。而 北斗 正是 egg 的一个上层框架实践。
S
sunchenguang#69·8 年前

hao

1
151263#70·8 年前

Excel 模板引擎 ejsExcel

S
songyi199111#71·8 年前
引用 congk赞👍赞👍赞👍

@ric@Richar-Dada @AserSayHi @dengnan123 @Richar-Dada ccdfgv

来自酷炫的 CNodeMD

M
mzTeamMeatMan#72·8 年前

求继续追求,早日实现 http2.....

S
songyi199111#73·8 年前

歌姬计划

W
waitingsong#74·8 年前

https://eggjs.org/zh-cn/basics/config.html 请教下 如果以返回对象方式

// 配置 logger 文件的目录,logger 默认配置由框架提供
module.exports = {
  logger: {
    dir: '/home/admin/logs/demoapp',
  },
};

这时如何获得 appInfo 呢?

A
atian25#75·8 年前
引用 waitingsonghttps://eggjs.org/zh cn/basics/config.html 请教下 如果以返回对象方式 这时如何获得 呢?

@waitingsong 就是拿不到,才提供 module.exports = appInfo => {} 的方式

W
waitingsong#76·8 年前
引用 atian25@waitingsong 就是拿不到,才提供 module.exports = appInfo = {} 的方式
  • @atian25 那么 egg-example 里面ts的例子
export class DefaultConfig {
  news =  {
    pageSize: 30,
    serverUrl: 'https://hacker-news.firebaseio.com/v0',
  }
}

export default new DefaultConfig()

declare module 'egg' {
  export interface Application {
    config: EggAppConfig & DefaultConfig
  }
}

该如何处理呢,是不是使用 construct(appInfo) 来获取呢?

W
waitingsong#78·8 年前
C
casanovawu#79·8 年前
引用 dengnan123厉害了

@dengnan123

来自酷炫的 CNodeMD

C
casanovawu#80·8 年前

Image

来自酷炫的 CNodeMD

R
richenlin#81·9 年前

支持支持!!

D
dengnan123#82·9 年前

厉害了

E
EryouHao#83·9 年前

赞👍

R
Richar-Dada#84·9 年前

加油!加油!

C
congk#85·9 年前

赞👍赞👍赞👍

W
wbget#86·9 年前

接触eggjs半年,真的感谢贵团队,你们辛苦了!

A
avwo#87·9 年前

性能提升30%是怎么做到的?

A
atian25#88·9 年前
引用 avwo性能提升30%是怎么做到的?

@avwo 主要的一部分损耗在于 co,因为 Egg 1 是兼容 async 的,做法就是使用 co 包裹。而在 Egg 2 里面,async-first,大部分情况下不需要包裹了,这块能减少不少。

具体的可以看:https://github.com/eggjs/benchmark/pull/14

PS:对绝大部分应用来说,这些性能根本没啥意义。

I
i5ting#89·9 年前

具有里程碑意义,社区价值较大,置顶

B
beliefgp#90·9 年前

赞👍赞👍赞👍

Z
zhangzhaoaaa#91·9 年前

支持支持

X
x-cold#92·9 年前

支持支持

J
JarvisQJ#93·9 年前

留个纪念

L
liangtongzhuo#94·9 年前

支持

Y
yeyeye0525#95·9 年前

6666 xiaogui.jpg

H
htoooth#96·9 年前

支持,支持

L
liuxuech#97·9 年前

已经在研究了 支持支持。

2
2YANG#98·9 年前

支持

F
fomenyesu#100·9 年前

已投票,这个项目好用,支持! egg-restapi-module-tool 已经加入oauth2.0功能,下一步争取升级到egg2.0 。

D
danielsss#101·9 年前

看完security risk in node web, 瞬间觉得Egg强壮的很...

P
pengkobe#102·9 年前

这文案杠杠的! 支持!

F
five6#104·9 年前

从发布3.21发布1.0就一直在用,真心赞。

R
Robert-lihouyi#105·9 年前

厉害👍

D
daileimail#106·9 年前

很溜,以后有外包就用它了

M
MedusaLeee#107·9 年前

有没有完全使用typescript来写的计划。使用完全的oop风格来编写代码。

A
atian25#108·9 年前
引用 MedusaLeee有没有完全使用typescript来写的计划。使用完全的oop风格来编写代码。

@MedusaLeee Egg 本身不会用 TS 重写,但我们会提供一些周边的支持来方便开发者用 TS 写 Egg 应用。

我们的 example 那边有 TS 的示例,蚂蚁那边的 Egg 应用也有很多都是 TS 写的。

S
SuperZee#109·9 年前

egg-sequelize 如何向 Controller 一样支持多级目录?

S
SuperZee#110·9 年前
S
SuperZee#111·9 年前

目前发现定义在 app/model 下面的 xxx.js 可以在 this.app.model.xxx 访问到,但是定义在 app/model/baes/user.js 目录下的就不能在 this.app.mode.user 访问到了,只能通过 models 来访问

M
matthiaschen#113·9 年前

赞一个

S
shenjianzch#114·9 年前

egg api全英文的 好尴尬啊@atian25 有没中文的 原谅我的英文不是很好

W
waitingsong#115·9 年前
S
shenjianzch#116·9 年前
引用 waitingsong@shenjianzch 做软件开发的不会英文。。。

@waitingsong 那不是说不会 只是说看起来有点吃力 毕竟中午看起来要顺畅的多

S
songyi199111#117·9 年前

学习了

F
frank320#118·9 年前

赞赞赞

Z
zwkukumaomao#119·9 年前

不错 初来乍到 希望越做越好

来自酷炫的 CNodeMD

S
shenjianzch#120·9 年前

@atian25 我想用this.app.curl()去请求的时候 封装一层 就是如果有token 我就带着没有我就不带 怎么做啊 类似这样this.app.curl(url,{ headers:{ token:this.ctx.session.token } }) 不然的话只能每个请求都都要一个配置headers的

A
atian25#121·9 年前

自己在 app/extend/context.js 中封装一个方法即可

C
CokeWithIce#122·9 年前

感觉17年发布的egg。现在就更新了?阿里的程序员怕是吐血更新。。。 刚学玩express4再看egg怕是要挂了。。。

S
Songqunlong#123·9 年前

666 ---from Vue + Muse-UI

W
web-css#124·9 年前

jkljkllkj asfaf ffdalt

![alt](column1column2column3
column1column2column3
column1column2column3
column1column2column3
column1column2column3
---------------------
column1column2column3
column1column2column3
column1column2column3
)
F
five6#125·9 年前
H
hdl3951846#126·9 年前

good

X
xiaomi915#127·9 年前

good

1
15225594476#128·9 年前

good

H
hc3001#129·8 年前

沙发

Z
zuohuadong#130·8 年前
引用 Kinghts看了下文档,挺不错的样子,准备新项目用一用,抢后端同事的饭碗,蛤蛤。

@Kinghts 架构上还是嫩了点~ 可以看看 nest.js ,node 版的spring~

H
heweicong#131·8 年前

shafa

X
xiaoyingZha#132·8 年前
X
xiaoyingZha#133·8 年前

哈哈,继续

C
chaos2171053#134·8 年前

@atian25 测试 ---来自chaos的小霸王

C
chaos2171053#135·8 年前

测试 ---来自chaos的小霸王

C
chaos2171053#136·8 年前

---来自chaos的小霸王

C
chaos2171053#137·8 年前

只是测试 ---来自chaos的小霸王

W
wangjunsen-1010#139·8 年前

。。。

W
wangjunsen-1010#140·8 年前

。。。

W
wangjunsen-1010#141·8 年前

。。。

W
wangjunsen-1010#142·8 年前

。。。

W
wangjunsen-1010#143·8 年前

。。。

W
wangjunsen-1010#144·8 年前

。。。

Y
yexiaosong#145·8 年前

egg很不错

W
webhj#146·8 年前

66666666

source vue-cnode mobile 2.0

W
webhj#147·8 年前

test

source webhj

W
webhj#148·8 年前

test2

webhj

S
SmileLxy#149·8 年前

22 — — 来自lumia2046-react-cnode

L
lxp-git#150·8 年前
引用 mzTeamMeatMan求继续追求,早日实现 http2.....

@Kevinzhang29 @chunlai666 就

From Noder

C
coldraincn#151·8 年前

egg的官网在公司有好几天上不去了,家里的网就可以,是什么原因?以前有过几天公司的网也上不去

参与回复
登录后即可参与回复。登录