likes
comments
collection
share

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

作者站长头像
站长
· 阅读数 9

美味值:🌟🌟🌟🌟🌟

口味:咖喱肥牛锅

食用指南

Node.js 2021

Node 2021 开发者报告解析

Node.js 好像不是很火了?其实不然。

从 Node.js 源码更新内容来看,Node.js 正在健康平稳的发展、从可用到好用在转变,在易用性上有很大提升。性能的牌打完了,开始打“用户体验”的牌。

核心产出 async_hooks、profiling、tracing、dump debug、report 等。让开发者能以更低的门槛提升 Node.js 应用的开发体验。

1.开发框架变化较大,造轮子变少,TS 变多,使用企业级框架变多

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

Egg.js 在国内使用普及率很高,而 Midway 和 Nest 增长较快,和 TypeScript 普及有一定关系。

2.版本更新变化较大,升级比较积极

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

去年主要是使用 Node12,2021 年 Node14 占比将近一半,更新还是较快的。

(如果你想优化性能,最好的办法就是升级 Node 版本 :))

3.吐糟变多,意味着用的人变多,趋于成熟

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

“世界上只有两种语言,一种是没有人用的语言,一种是被抱怨的语言。”

4.出圈:年龄分布较去年比变大,使用工种也变得比较丰富

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

整个 Node 社区不再只是围绕前端工程师去做,后端、全栈工程师、架构师甚至运维、技术总监都有一定的接触,在校生和实习生也有一定的使用量。

5.使用困惑:性能优化,内存泄漏以及 npm 依赖

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

6.未来:从业经验越高则越关注性能和 Serverless

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

  • 从业经验越高则越关注 WebAssembly (WASI) 和 N-API。
  • 越年轻的同学越关注 Serverless。

好东西里藏着的趋势

1.clipanion

class FooCommand extends Command {
    static paths = [[`foo`]];
    async execute() {
        this.context.stdout.write(`Foo\n`);
    }
}

class BarCommand extends Command {
    static paths = [[`bar`]];
    async execute() {
        this.context.stdout.write(`Bar\n`);
    }
}

TS + 面向对象 + 模板模式十分优雅。

clipanion 是一个没有运行时依赖的类型安全 CLI 库。Yarn v2 版本 berry 源码中用到了它。包括 Node.js 中新增的 Corepack(包管理器的管理器,用来管理 npm、yarn、pnpm、cnpm等) 也采用了它。

可以看出社区对它的看重,虽然它的 Star 数不高,但还是十分值得学习的。

对比一下常见的 CLI 库 Commander.jscac,它们的写法是函数式的,通过定义一个函数,使用 option 传入参数。

看你喜欢哪种写法,它们都是不错的选择。

// Commander.js
const { program } = require('commander');

program
  .option('--first')
  .option('-s, --separator <char>');

program.parse();

const options = program.opts();
const limit = options.first ? 1 : undefined;
console.log(program.args[0].split(options.separator, limit));
// examples/basic-usage.js
const cli = require('cac')()

cli.option('--type <type>', 'Choose a project type', {
  default: 'node',
})

const parsed = cli.parse()

console.log(JSON.stringify(parsed, null, 2))

2.TS 相关的 10 个项目推荐

2.1 find-my-way

const http = require('http')
const router = require('find-my-way')()

router.on('GET', '/', (req, res, params) => {
  res.end('{"message":"hello world"}')
})

const server = http.createServer((req, res) => {
  router.lookup(req, res)
})

server.listen(3000, err => {
  if (err) throw err
  console.log('Server listening on: http://localhost:3000')
})

受 Go 语言中 echo 框架的路由实现所启发,具体实现基于基数树。部分代码从 trekjs提取。

性能

基准测试 all together 中 find-my-way 是 525,798 ops/sec,koa-router 是 161,220 ops/sec。每秒能够处理的请求数差距还是非常明显的,基数树的这种方式远远比正则快的多。

=======================
 find-my-way benchmark
=======================
short static: 10,102,066 ops/sec
static with same radix: 3,887,679 ops/sec
dynamic route: 1,637,929 ops/sec
mixed static dynamic: 2,289,554 ops/sec
long static: 5,403,719 ops/sec
wildcard: 3,037,119 ops/sec
all together: 525,798 ops/sec

======================
 koa-router benchmark
======================
short static: 1,004,122 ops/sec
static with same radix: 1,029,369 ops/sec
dynamic route: 1,015,635 ops/sec
mixed static dynamic: 968,784 ops/sec
long static: 1,027,857 ops/sec
wildcard: 1,033,432 ops/sec
all together: 161,220 ops/sec

下图来自于 Fasify 的基准测试

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

Fastify 和 Restify 都是基于 find-my-way 实现的路由,Restify 早期版本基于 express 的路由,Fastify 能处理的每秒请求数比原生的还高。从数据结构角度来进行优化是未来提升性能比较重要的一点。

2.2 性能优化的 4 个建议

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

2.3 测试框架演进

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

idea

造轮子:把 junit 的 API 搬进 TS。

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

实现路径

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

ts-import vs typescript-require

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

这二者的性能还是差一些,后面准备用 Rust 或者 Go 的编译器重写。

xv

在造轮子的过程中,发现了一个有意思的库 xv。作者还有 json-server、lowdb 等作品。

源码只有 40 几行,无需定义任何测试语法。

uvu

uvu 的源码值的学习。

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

常见的 Node 测试框架:

vitest

会替代掉 jest,也会越来越流行。

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

2.4 easy-monitor

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

监控痛点

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

一些痛点对开发者门槛要求比较高,但是 easy-monitor 已经帮我们做好了。

  1. 性能调优,永不过时
  2. 基于 addon,没有版本依赖。各种内存泄漏分析工具与 Coredump 分析工具,绝对有你的知识盲点
  3. 对阅读 node 源码和深入理解服务器有非常大的帮助
  4. 对理解 libuv,以及 c++ 也有帮助
  5. 源码基于 egg 和 vue,都是非常成熟的技术
  6. 作者一定要靠谱

完善的应用故障定位步骤

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

2.5 rushstack

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

Turborepo 对于 Lerna 是竞品,而目前还对标不上 rushstack,rushstack 适用于超大型项目。微软的全系列产品也都在使用 rushstack 全家桶。在未来有超大型项目挑战的时候 rushstack 是一个非常好的实践借鉴。

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

总结

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

八大类 Web 框架

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

架构演进

这一趴主要引用了 Node 地下铁的一次分享,原文链接如下。

前端 3.0

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

重新思考前后端的关系

BFF vs FFB

前端代码里的胶水代码太多了,本质上讲,从数据库到 API 字段,然后到前端渲染,应该是一个非常纯净的过程。但是由于业务发展或者是各种情况,数据库里面的字段不能拿出来直接用,前后端的沟通成本又导致了中间加了额外的各种逻辑。这就导致了前端的复杂度一直在上升。

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》

❤️爱心三连击

1.如果你觉得食堂酒菜还合胃口,就点个赞支持下吧,你的是我最大的动力。

2.关注公众号前端食堂吃好每一顿饭!

3.点赞、评论、转发 === 催更!

狼叔直播 Reaction《学习指北:Node.js 2022 全解析》