狼叔直播 Reaction《学习指北:Node.js 2022 全解析》
大家好,我是若川。持續(xù)組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan02?參與,每周大家一起學(xué)習(xí)200行左右的源碼,共同進(jìn)步。同時極力推薦訂閱我寫的《學(xué)習(xí)源碼整體架構(gòu)系列》?包含20余篇源碼文章。歷史面試系列
本文是狼叔在 2 月 16 日在掘金直播《學(xué)習(xí)指北:Node.js 2022 全解析》的 Reaction,狼叔的直播干貨很多,本文盡量保證原內(nèi)容的同時,額外加入了一些相關(guān)資料和鏈接,方便你學(xué)習(xí)。
Node.js 2021
Node 2021 開發(fā)者報告鏈接[1]
Node 2021 開發(fā)者報告解析
Node.js 好像不是很火了?其實不然。
從 Node.js 源碼更新內(nèi)容來看,Node.js 正在健康平穩(wěn)的發(fā)展、從可用到好用在轉(zhuǎn)變,在易用性上有很大提升。性能的牌打完了,開始打“用戶體驗”的牌。
核心產(chǎn)出 async_hooks、profiling、tracing、dump debug、report 等。讓開發(fā)者能以更低的門檻提升 Node.js 應(yīng)用的開發(fā)體驗。
1.開發(fā)框架變化較大,造輪子變少,TS 變多,使用企業(yè)級框架變多
Egg.js 在國內(nèi)使用普及率很高,而 Midway 和 Nest 增長較快,和 TypeScript 普及有一定關(guān)系。
2.版本更新變化較大,升級比較積極
去年主要是使用 Node12,2021 年 Node14 占比將近一半,更新還是較快的。
(如果你想優(yōu)化性能,最好的辦法就是升級 Node 版本 :))
3.吐糟變多,意味著用的人變多,趨于成熟
“世界上只有兩種語言,一種是沒有人用的語言,一種是被抱怨的語言。”
4.出圈:年齡分布較去年比變大,使用工種也變得比較豐富
整個 Node 社區(qū)不再只是圍繞前端工程師去做,后端、全棧工程師、架構(gòu)師甚至運維、技術(shù)總監(jiān)都有一定的接觸,在校生和實習(xí)生也有一定的使用量。
5.使用困惑:性能優(yōu)化,內(nèi)存泄漏以及 npm 依賴
6.未來:從業(yè)經(jīng)驗越高則越關(guān)注性能和 Serverless
從業(yè)經(jīng)驗越高則越關(guān)注 WebAssembly (WASI) 和 N-API。
越年輕的同學(xué)越關(guān)注 Serverless。
好東西里藏著的趨勢
1.clipanion
clipanion 倉庫鏈接[2]
TS + 面向?qū)ο?+ 模板模式十分優(yōu)雅。
clipanion 是一個沒有運行時依賴的類型安全 CLI 庫。Yarn v2 版本[3] berry 源碼中用到了它。包括 Node.js 中新增的 Corepack(包管理器的管理器,用來管理 npm、yarn、pnpm、cnpm等) 也采用了它。
可以看出社區(qū)對它的看重,雖然它的 Star 數(shù)不高,但還是十分值得學(xué)習(xí)的。
對比一下常見的 CLI 庫 Commander.js[4] 和 cac[5],它們的寫法是函數(shù)式的,通過定義一個函數(shù),使用 option 傳入?yún)?shù)。
看你喜歡哪種寫法,它們都是不錯的選擇。
//?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 相關(guān)的 10 個項目推薦
CLI 模塊:clipanion[6]
測試模塊:uvu[7]
Web 模塊(express 替代品):tinyhttp[8]
數(shù)據(jù)庫模塊:typeorm[9]
Web 應(yīng)用:midway[10]、daruk[11]、loopback[12]、nest[13]、ssr[14]
react 全家桶:umi[15]
2.1 find-my-way
find-my-way[16]
受 Go 語言中 echo 框架的路由實現(xiàn)所啟發(fā),具體實現(xiàn)基于基數(shù)樹[17]。部分代碼從 trekjs[18]提取。
性能
基準(zhǔn)測試 all together 中 find-my-way 是 525,798 ops/sec,koa-router 是 161,220 ops/sec。每秒能夠處理的請求數(shù)差距還是非常明顯的,基數(shù)樹的這種方式遠(yuǎn)遠(yuǎn)比正則快的多。
=======================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 的基準(zhǔn)測試[19]
Fastify 和 Restify 都是基于 find-my-way 實現(xiàn)的路由,Restify 早期版本基于 express 的路由,Fastify 能處理的每秒請求數(shù)比原生的還高。從數(shù)據(jù)結(jié)構(gòu)角度來進(jìn)行優(yōu)化是未來提升性能比較重要的一點。
Radix Tree 原理[20]
path-to-regexp[21]
2.2 性能優(yōu)化的 4 個建議
fast-json-stringify[22]
2.3 測試框架演進(jìn)
idea
造輪子:把 junit 的 API 搬進(jìn) TS。
實現(xiàn)路徑
ts-import vs typescript-require
這二者的性能還是差一些,后面準(zhǔn)備用 Rust 或者 Go 的編譯器重寫。
xv
在造輪子的過程中,發(fā)現(xiàn)了一個有意思的庫 xv。作者還有 json-server、lowdb 等作品。
源碼只有 40 幾行,無需定義任何測試語法。
https://github.com/typicode/xv[23]
uvu
uvu[24] 的源碼值的學(xué)習(xí)。
常見的 Node 測試框架:
ava[25]
jest[26]
mocha[27]
tape[28]
uvu[29]
vitest
會替代掉 jest,也會越來越流行。
vitest[30]
2.4 easy-monitor
easy-monitor[31] 是近年來性能監(jiān)控的最好方案。
監(jiān)控痛點
一些痛點對開發(fā)者門檻要求比較高,但是 easy-monitor 已經(jīng)幫我們做好了。
性能調(diào)優(yōu),永不過時
基于 addon,沒有版本依賴。各種內(nèi)存泄漏分析工具與 Coredump 分析工具,絕對有你的知識盲點
對閱讀 node 源碼和深入理解服務(wù)器有非常大的幫助
對理解 libuv,以及 c++ 也有幫助
源碼基于 egg 和 vue,都是非常成熟的技術(shù)
作者一定要靠譜
完善的應(yīng)用故障定位步驟
2.5 rushstack
Turborepo 對于 Lerna 是競品,而目前還對標(biāo)不上 rushstack[32],rushstack 適用于超大型項目。微軟的全系列產(chǎn)品也都在使用 rushstack 全家桶。在未來有超大型項目挑戰(zhàn)的時候 rushstack 是一個非常好的實踐借鑒。
總結(jié)
八大類 Web 框架
Jamstack,下一代 Web 建站技術(shù)棧?[33]
架構(gòu)演進(jìn)
這一趴主要引用了 Node 地下鐵的一次分享,原文鏈接如下。
JavaScript 全棧?效研發(fā)在語雀中的實踐[34]
前端 3.0
重新思考前后端的關(guān)系
BFF vs FFB
前端代碼里的膠水代碼太多了,本質(zhì)上講,從數(shù)據(jù)庫到 API 字段,然后到前端渲染,應(yīng)該是一個非常純凈的過程。但是由于業(yè)務(wù)發(fā)展或者是各種情況,數(shù)據(jù)庫里面的字段不能拿出來直接用,前后端的溝通成本又導(dǎo)致了中間加了額外的各種邏輯。這就導(dǎo)致了前端的復(fù)雜度一直在上升。
更多內(nèi)容可以參考狼叔在社區(qū)中的回答[35]
參考資料
[1]
Node 2021 開發(fā)者報告鏈接: https://nodersurvey.github.io/reporters/
[2]clipanion 倉庫鏈接: https://github.com/arcanis/clipanion
[3]Yarn v2 版本: https://github.com/yarnpkg/berry
[4]Commander.js: https://www.npmjs.com/package/commander
[5]cac: https://github.com/cacjs/cac
[6]clipanion: https://github.com/arcanis/clipanion
[7]uvu: https://github.com/lukeed/uvu
[8]tinyhttp: https://github.com/tinyhttp/tinyhttp
[9]typeorm: https://github.com/typeorm/typeorm
[10]midway: https://github.com/midwayjs/midway
[11]daruk: https://github.com/darukjs/daruk
[12]loopback: https://github.com/strongloop/loopback
[13]nest: https://github.com/nestjs/nest
[14]ssr: https://github.com/ykfe/ssr
[15]umi: https://github.com/umijs/umi
[16]find-my-way: https://github.com/delvedor/find-my-way
[17]基數(shù)樹: https://en.wikipedia.org/wiki/Radix_tree
[18]trekjs: https://github.com/trekjs/trek
[19]Fasify 的基準(zhǔn)測試: https://github.com/fastify/fastify/blob/main/README.md#benchmarks
[20]Radix Tree 原理: https://ivanzz1001.github.io/records/post/data-structure/2018/11/18/ds-radix-tree
[21]path-to-regexp: https://github.com/pillarjs/path-to-regexp
[22]fast-json-stringify: https://github.com/fastify/fast-json-stringify
[23]https://github.com/typicode/xv: https://github.com/typicode/xv
[24]uvu: https://github.com/lukeed/uvu/blob/master/src/index.js
[25]ava: https://github.com/avajs/ava
[26]jest: https://github.com/facebook/jest
[27]mocha: https://github.com/mochajs/mocha
[28]tape: https://github.com/substack/tape
[29]uvu: https://github.com/lukeed/uvu
[30]vitest: https://github.com/vitest-dev/vitest
[31]easy-monitor: https://github.com/hyj1991/easy-monitor
[32]rushstack: https://github.com/microsoft/rushstack
[33]Jamstack,下一代 Web 建站技術(shù)棧?: https://zhuanlan.zhihu.com/p/281085404
[34]JavaScript 全棧?效研發(fā)在語雀中的實踐: https://www.yuque.com/summ/colacake/js_fullstack
[35]更多內(nèi)容可以參考狼叔在社區(qū)中的回答: https://www.zhihu.com/question/493891614/answer/2264072484
·················?若川簡介?·················
你好,我是若川,畢業(yè)于江西高校。現(xiàn)在是一名前端開發(fā)“工程師”。寫有《學(xué)習(xí)源碼整體架構(gòu)系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結(jié),已經(jīng)寫了7篇,點擊查看年度總結(jié)。
同時,最近組織了源碼共讀活動,幫助3000+前端人學(xué)會看源碼。公眾號愿景:幫助5年內(nèi)前端人走向前列。
識別上方二維碼加我微信、拉你進(jìn)源碼共讀群
今日話題
略。分享、收藏、點贊、在看我的文章就是對我最大的支持~
總結(jié)
以上是生活随笔為你收集整理的狼叔直播 Reaction《学习指北:Node.js 2022 全解析》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nekohtml 用法
- 下一篇: 18利他行为