高手问答第 289 期 —— 聊聊 Node.js 和 NPM

OSC哒哒 发布于 08/02 19:00
阅读 4K+
收藏 2

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

Node.js 诞生十几年了,它给前端领域带来了巨大的变革:Grunt 的出现让前端有了自己的构建工具,Babel 的出现让我们停滞已久的标准化重焕生机,Webpack 的出现让前端工程化有了基石,npm 的出现让前端包管理有了承载,Express 的出现让前端开始跨界,这一切的一切都要感谢 Node.js,让前端基建进入新时代。

近年来,Node.js 逐渐进入平台期,似乎没有特别新的东西诞生了,在业界的音量也似乎没那么多了,它的未来会怎么样呢?国内外目前都有哪些实践和挑战呢?

天猪前几天写了他的 Node.js 十年回顾,提到了他们将在 2022.08.08 举办新一届的 NodeParty 线上分享

因此,OSCHINA 本期高手问答 ( 8  3 日 -8  9 日) 我们邀请到了@天猪(EggJS 核心开发者)、@零弌(CNPM 核心开发者)、@天玎(CNPM 核心开发者)、@一君(Easy-Monitor 核心开发者)来一起探讨 Node.js 之路

可讨论的内容包括但不限于:

  • 前端 npm 包依赖管理、供应链安全治理,CNPM 开源
  • 前端构建提速
  • Node.js 服务端应用场景
  • Node.js APM 性能分析监控

或者其它关于 Node.js和NPM 的相关问题,也欢迎大家积极提问!

嘉宾介绍

天猪,前端工程师一枚,热爱开源,EggJS 和 CNPM 的核心开发者,平时喜欢在 Node.js 社区和知乎做一些科普分享,并记录自己以及同行者们在这个领域的所见所想。

我坚信 Node.js 对前端领域的价值,是一个不可或缺的基础设施,或许未来前端的变革使得一切工程问题从根本上得到解决,但不管怎样,我只是希望当下能认真记录自己以及同行者们在这个领域的所见所想,与正在经历前端工业化演进并被此过程困扰的同学交流心得,让大家有所参考从而迈出自己的路。


为了鼓励踊跃提问,我们会在问答结束后从提问者中抽取 5 名幸运会员赠予 EggJS 的文化衫一件。

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就Node.js 和 NPM关问题向 @天猪 提问,请直接回帖提问~


8月8日 ,新一届的 NodeParty 线上分享, 欢迎关注 B 站直播间或扫码预约观看直播。

加载中
0
yaosaya
yaosaya

(中奖信息更新) 

高手问答第 289 期 —— 聊聊 Node.js 和 NPM

@iman123 @名昕 @NexusOne @pyboy58

恭喜以上 4 位网友分别获得 EggJS 的文化衫一件

请于 8 月 16 日前登陆账号, 私信 @yaosaya  告知快递信息(格式:姓名+电话+地址+尺码)

dwingo
dwingo
应该是搞错了, 名单跟上期完全一样: https://www.oschina.net/question/4855753_2326460
忘了名字
忘了名字
这中奖名单 是不是有问题
1
NexusOne
NexusOne

@天猪 大佬你好,我关心的几个问题:1.npm的可信包机制有没有官方在做?2.npm包依赖过大或者有时候不兼容这种会有人注意吗?3.Node-API的Rust版本node-rs有大佬注意到吗?会投入社区力量去做吗?

 

NexusOne
NexusOne
回复 @天玎 : 谢谢大佬的答疑。:laughing:
NexusOne
NexusOne
回复 @天猪 : 谢谢大佬回复这3个很关心的问题。:bowtie:
天猪
天猪
3. node-rs 是太狼做的,小圈子里都很熟的,我猜你是想问 Rust 的使用,可以看下:https://www.zhihu.com/question/507691866/answer/2281867039
天猪
天猪
1. 目前 npm 官方好像没有在做(npm 官方,你懂得),不过有一些安全机构在做包安全相关的内容。 2. npm 包现在已经几百万了,必然存在良莠不齐的包,我个人一般是在 npm.io 来看评分,可以看下我之前写的文章:https://zhuanlan.zhihu.com/p/25686563
天玎
1. 可信包机制蚂蚁内部正在规划实施,很快就会落地; 2. 前端项目可能要从构建入手,比如 tree-shaking,Node.js 项目可以看是否可用原生 API,不兼容属于 npm 包质量问题,这个尽量保证项目依赖的包都是高质量的同时保持 Node 环境及时更新到 LTS 版本,可以部分缓解; 3. 目前不会,Node.js 有其应用场景,语言也不是银弹
1
pyboy58
pyboy58

@天猪  1.现在项目会依赖很多npm包依赖,有些包是有广告的,有不安全因素,需要自己二次开发,某些控件可能需要二次开发,这个有什么建议吗?

2.Node.js 适合开发什么网站,Node.js适合开发小游戏吗?

3.Egg 3.0 内核开发,基于什么设计模式?带来多少qps的提升? node.js一般使用什么设计模式比较多??

天猪
天猪
QPS 一般取决于你的业务逻辑,绝大部分应用场景下,框架还不至于会影响到 QPS。 裸跑框架的 QPS 其实没啥意义。 至于设计模式,其实就是一个代码编写的经验套路,看具体的场景来选择即可,没有什么特别的。
天猪
天猪
2. Node.js 在后端领域,目前较多的应用场景是作为 BFF 聚合层吧,然后全栈类的也有(如语雀)。小游戏的后端也是可以的,一般是 websocket,在前几年的国内小游戏爆发阶段,据我所知几个大厂都有用 Node.js 来做了一部分。不过这个还是看具体团队的本身熟悉的技术栈来选择语言。不管选择什么,必要的服务端知识都是需要学习的。
天猪
天猪
1. 引入的包都需要仔细评估,有必要的就 fork。不安全的,目前社区已经开始有一些安全专家在关注了,我们 cnpm registry 这块也在跟社区几个安全团队有保持信息同步,一些安全风险我们都会及时通过 cnpm/bug-versions 进行阻断。
天玎
1. 假定你是前端项目,基本的可以选择质量高的 UI 组件,例如 antd。如果不能持续开发维护,不建议进行二次开发,一是有些包会有协议限制,二是容易给后续维护者留坑。至于 npm 包安全问题,目前官方是依赖社区自觉和官方源做一些屏蔽机制,蚂蚁内部则是在规划落地可信包的机制。
1
iman123
iman123

@天猪 大佬,你好,还想听听你对这几个问题的想法和理解:
1. 目前node和deno是什么关系,既竞争又合作,以后发展趋势怎么样?
2. node的包管理工具有很多npm、yarn、pnpm等,感觉一些yarn的功能特性逐渐移植到npm,npm相比yarn又重新流行了,pnpm相比npm/yarn有什么缺点或局限性?
3. 前端技术发展的太快,vue3,react18,angular等,从长远角度,目前你看好哪个?
4. 基于js技术的跨平台桌面/移动端开发除了electron、react native,还有没有其他相对较成熟的技术框架,这些与同类的例如flutter、maui/uno来说有哪些优缺点?

iman123
iman123
回复 @天猪 : 我看到了这篇文章 https://mp.weixin.qq.com/s/klWhfdpPD58b6wNY4VgBPw ,学到了很多有价值的内容,非常棒!
天猪
天猪
2.1 我们 cnpm rapid 则是找到了另一条路,通过 fuse 的方案来演进,可以看下 https://zhuanlan.zhihu.com/p/455809528 以及这次 NodeParty 我们会正式开源这块。 pnpm 作者前几天还给我发了 Twitter,对里面的一些细节进行讨论看能否借鉴到他们那边的优化上。
天猪
天猪
2. 包管理器几家其实都在互相学习,吸取各自的一些优点(除了 npm 这条咸鱼),其实大家的优化思路是趋同的,但技术选择不太一样,譬如 yarn 现在走 pnp 路线,寄期望于 loader 后续的演进,在加载侧来解决依赖定位问题。pnpm 则是通过软链 + 硬链 的方式找到一个平衡点。
天猪
天猪
1. 生态的惯性是很强的,deno 可以在部分场景替代 node,但要想全部替代,很难很难。现在连 ESM 这种规范都演进的很慢,何况其他的。我们作为普通开发者,不要去考虑那么多,根据自己团队的能力,去选择一个靠谱的稳定的即可,你不可能一个技术吃十年的。 另外一个可能的演进就是标准化,如 https://wintercg.org/faq
1
pyboy58
pyboy58

@天猪  1.目前有新人需要培养学前端 Node.js , 想问下应该从哪方面入手学习 Node.js前端知识?

2.node.js作为后端,node.js的后端性能遇到瓶颈时怎么优化node.js和项目, 可以使用哪些工具分析性能问题;

3. node.js 开启多线程和集群,  怎么提高CPU的利用率,多线程的线程池数量怎么确定,三台64Gb内存的服务器可以支持多大的并发?

pyboy58
pyboy58
回复 @零弌 : 好的
零弌
零弌
可以参与到 egg 的开源建设中,先从修 bug 学起。
天猪
天猪
1. 目前好像也没有什么好的教程吧,就学学 JS,然后相关的 API 文档看下应该就好了,常用的也就 fs,http 等几个,然后社区的一些常用类库也学习下。 2. APM 的话,国内就 2 个,一个是 Alinode,一个是 Easy-Monitor,https://github.com/hyj1991/easy-monitor 3. 配合 APM,根据压测情况来调节即可,跟你具体业务逻辑有关。
1
名昕
名昕

@天猪 

1.  想请教下现在cnpm是怎么做安全治理的?

2. egg作为已经稳定成熟的框架了,开发egg3的目的是什么呢?egg相应的插件,在egg3同样适用吗?

3. 阿里基于egg有更上层的框架吗? 以及是否有相应的开发套件呢?是否考虑也开源呢?

4. 想参与egg3的共建,请问从哪里开始比较合适呢?

 

名昕
名昕
回复 @天猪 : 感谢大佬的解答!!!:pray:
天猪
天猪
4.1 再往上应用层的话,可以参与到 https://github.com/cnpm/npmcore 和 https://github.com/hyj1991/easy-monitor,他们都是基于 egg 的上层框架 tegg 的实践,前者是 npmmirror 的实现,后者类似于 alinode 的开源版。
天猪
天猪
4. 如果往底层,就是 https://github.com/artusjs,然后就是后续各种 artus 插件生态的建设。往上的话就是 egg3 基于 artus 重构时的适配,以及我们在上层封装了个 https://github.com/eggjs/tegg 框架,它是我们从 egg2 迁移到 egg3 的一个路径,即应用先渐进升级到 ioc 的语法,然后 tegg 底层后续再重为 artus
天猪
天猪
3. 从 egg 诞生的那一天开始,就一直有。如适用于阿里场景的 midway,适用于蚂蚁场景的 chair 等等,这些都是跟各自公司的基础设施、中间件、研发流程强耦合的,能开源的都通过插件方式下沉开源了(可以看下 https://www.yuque.com/atian25/blog/eggjs-progressive),框架其实不能开源,开源也没啥用。egg 的生态在于插件体系,框架只是集成方。
天猪
天猪
2.3 我们回顾 egg 的各种插件,一般无非就是暴露一个对象,修改某些配置,然后在 egg 的某些生命周期里面做一些初始化和挂载动作。 artus 的插件,因为是 ioc 了,其实会更简单了,不需要像 egg 插件那样基于目录的约定加载,直接装饰器就可以了。 不过我们也会考虑做个 adapter 来兼容 egg 的插件。 是否加载这些 adapter 层,由 artus 的上层框架来决定。
下一页
0
紫竹蜚凝
紫竹蜚凝

@天猪 您好,实际现在很多项目的NPM依赖非常复杂,有没有可能去简略这些NPM依赖?

天玎
简略依赖的目的是什么呢?如果是为了减少构建产物体积,那么假定你的业务是前端项目,这时候可能需要在构建期或者部署期来做优化,比如 tree-shaking,更好的代码压缩,或者 ESM bundleless 方案。
0
lmrwork
lmrwork

@天猪 你好,我想知道如何规范引入的第三方包,有没有详细规范给我们参考一下。
----- 我们目前使用nestjs(一个类似ng语法的框架)作为中台,但在前期因为规范不够,现在引入了比较多的第三方包,因此在整体升级时非常纠结,担心升级框架和TS版本后导致三方包报错(只能通过编译后运行单元测试来尽量避免)。

 
天猪
天猪
没有很好的办法,整个生态就是这样,积极点看待即可,一方面尽量挑选高质量的包,另一方面 CI/CD 的单测覆盖率要有保障。
天玎
目前没有很好的办法,社区现在的方案是通过类似 npms.io 来给包打分,但是不解决开发者恶意破坏的问题。所以蚂蚁内部在规划落地可信包的机制,将三方包的引入交给架构师来评估。
0
osc_22724465
osc_22724465

@天猪 您好大佬,请问一下nodeJ应用于哪些场景,适合做高并发么

osc_78269762
osc_78269762
回复 @shadow7717 : 感谢解答!
shadow7717
shadow7717
回复 @osc_78269762 : 取决于你的数据库和文件io吧,跟调用层关系不大 另外推荐使用prisma
osc_78269762
osc_78269762
回复 @天猪 : 请问,大佬,nodeJS处理数据库方面的工作,比如 ORM 框架 TypeORM,性能会比其他服务端语言有差距吗?
天猪
天猪
据我了解,国内大厂也有不少用 Node.js 来支撑大流量业务的,有双十一那种量级的。但还是那句话,高并发其实很多时候看的不是语言,而是你的方案。其实我们能遇到的很多场景无非就是多层缓存。
天猪
天猪
除了 CPU 密集型的外(这些也可以在函数计算里面用 JS 写),其他的没有什么不能做的吧,主要看你们团队自己本身的技术栈和能力,以及公司相关的基建水平。
0
何立腾
何立腾
npm依赖一直存在重复依赖问题,导致编译之后产生很多重复的文件,这个以后能解决吗?
徐纯洁哥哥
徐纯洁哥哥
不用node
天猪
天猪
0. 依赖这事本身就很复杂,在如此体量的包情况下,很难说去约定共用,那样也会有 perrdep 问题。 1. 如果你指的是本地磁盘的重复,那 pnpm,yarn,以及我们的 cnpm rapid (https://zhuanlan.zhihu.com/p/455809528) 都实现了不同的优化方式。 2. 如果你指的是前端编译的话,应该就 tree-shaking 合并 bundle 等方式吧。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部