2022年前端技術(shù)領(lǐng)域,會(huì)有哪些新的變化?
作者:Hugo
鏈接:https://www.zhihu.com/question/493891614/answer/2269197391
Monorepo
Monorepo 成標(biāo)配,pnpm 會(huì)有更廣泛的應(yīng)用。
Why should we use pnpm? www.kochan.io/nodejs/why-should-we-use-pnpm.html
webstorm、vscode 對 monorepo 更好的支持。現(xiàn)在的混合技術(shù)棧多少支持有一些問題。
例如在 webstorm 里,一個(gè)目錄的 linter,使用 eslint 還是用 deno 的lint,還是其他的 lint,是比較難配置的。
例如在 webstorm 里,一個(gè)目錄的 ts 語言服務(wù),是用 tsc 還是 deno。
簡單說以 monorepo 的一個(gè)子目錄去選擇對應(yīng)的環(huán)境配置,是一個(gè)需求。
TypeScript
越來越多的項(xiàng)目選擇 TypeScript。 TypeScript 幫助 JavaScript 世界的整體編程能力往前走了一大步,怎么感謝 Anders Hejlsberg 都不過分。他已經(jīng)六十多了,還在寫代碼。
Deno
Deno 開始在 cli 腳本和serverless 方面展露頭腳。
Deno 在傳統(tǒng)生產(chǎn)項(xiàng)目上和 Node 仍然不會(huì)有太大的沖突。但是 Deno 在用 TS 寫腳本方面,對比 Node.js 是有優(yōu)勢的。這一點(diǎn)優(yōu)勢應(yīng)該最大化利用。
Deno 的依賴是不會(huì)污染 Npm 的,因?yàn)楸旧砗?NPM 正交。隨著項(xiàng)目的復(fù)雜,沒人希望污染主項(xiàng)目。
實(shí)際上,Deno 非常適合把開發(fā)依賴都控制起來。
Deno 非常適合制作 cli,且用 cli 來抹平 NPM 和 Deno 世界的最后一公里。
雖然目前 Deno 的 swc 有各種問題,使用 bundle+compile 目前還有很多問題。
cac#with-deno github.com/cacjs/cac#with-deno
Deno 和 Node.js 世界開始融合。
實(shí)際上,現(xiàn)在一大不太好融合的點(diǎn),反而是 Node.js 的 ESM 問題。理論上 ESM 以后,一份 TypeScript 代碼同時(shí)對 Node.js、deno、browser 變的簡單了。
隨著 Deno 1.0 的 API 穩(wěn)定,會(huì)產(chǎn)生一些 Deno 和 Node 的兼容層項(xiàng)目產(chǎn)生。實(shí)際上就是把雙方的 API 做一個(gè)映射。
如果有了這個(gè)兼容層,在完全使用 ESM 的情況下,主要的區(qū)別就可以慢慢退化到項(xiàng)目入口的包管理方式
NPM 是 package.json
Deno 是 import_map 和手動(dòng)聲明 http_import
實(shí)際上,還有一些區(qū)別
Deno 的 TypeScript 的版本,實(shí)際總比流行版本慢一些,且參數(shù)是主 TypeScript 的參數(shù)的一個(gè)子集,且一些參數(shù)不能更改。
Deno 試圖把一個(gè)編譯型語言 TypeScript 變成一個(gè)像 JavaScript 一樣的即時(shí)解釋型語言,但是 TypeScript 寫的復(fù)雜了,編譯還是比較慢的。這一塊會(huì)有什么問題,暫時(shí)未知。
Node.js
Node.js 的 TypeScript 世界開始 ESM 化,這個(gè)要看 4.6
Concerns with TypeScript 4.5's Node 12+ ESM Support #46452 github.com/microsoft/TypeScript/issues/46452
ESBuild
esbuild 慢慢生產(chǎn)可用。太快了,這一點(diǎn)對很多項(xiàng)目吸引太大了,下面的那個(gè)鏈接里介紹,一個(gè) 30 min 的 webpack 用 esbuild 可以分鐘級運(yùn)行。而且 figma 的 cto(也就是 esbuild 的作者,國內(nèi)還有 cto 寫代碼么?)頭腦非常清醒,esbuild 整個(gè)做的技術(shù)選擇,以及目前該項(xiàng)目的影響力,對于前端世界的影響有可能持續(xù)加大。
Let's Learn esbuild! www.learnwithjason.dev/lets-learn-esbuild
JavaScript 裝飾器
JavaScript 的裝飾器可能快來了。可能是最特殊的一個(gè) JavaScript 的語法特性。這個(gè)對一堆現(xiàn)有的 TypeScript 裝飾器框架都是潛在利空。實(shí)際上,現(xiàn)有的 TypeScript 裝飾器框架都和 esbuild 或多或少有沖突。而 esbuild 帶來的諸多好處,對于新項(xiàng)目是否上 TypeScript 臨時(shí)的裝飾器,還是等 JavaScript 的裝飾器,提出了一個(gè)至少是需要想一想的問題。這個(gè)對于 TypeScript 世界的一部分,有可能是核彈級的。有興趣的同學(xué)可以去翻翻 esbuild 的 issue,看看為啥 evan 不支持 TypeScript 的 emitDecoratorMetadata。下面的鏈接是目前的進(jìn)展。
Decorators update[2021.7] github.com/tc39/notes/blob/HEAD/meetings/2021-07/july-14.md#decorators-update
JavaScript 基建
JS 和 TS 的核心基建 Rust 化,相應(yīng)的基建可以開始投入生產(chǎn)了。例如 swc、rome、deno。等等。對這塊感興趣的同學(xué)可以去看看 deno 的 build 的 issue。我只能說,swc 還有很長的路要走。esbuild 和 swc 的結(jié)果,會(huì)極大影響 go 和 rust 在 JS & TS 世界的關(guān)系。
Hugo:RUST 是 JavaScript 基建的未來165 贊同 · 17 評論文章
前端語言的集中化:Rust->Go->TypeScript->JavaScript,這四門語言大概能組成整個(gè) JS 和 TS 世界的 99%?
JavaScript 模塊化 ESM
ESM 繼續(xù)推進(jìn)。這一點(diǎn)對于微前端解決方案是極大利好。會(huì)有新的微前端解決方案出現(xiàn),會(huì)比 Modern.js 輕很多。會(huì)出現(xiàn)類似 Modern.js 的 cli 編譯打包方案。其實(shí)建議 Modern.js 把這一塊提出來單獨(dú)弄一個(gè)項(xiàng)目,這一塊在個(gè)人看來是 Modern.js 最 Modern 的地方。
個(gè)人認(rèn)為,這個(gè)最終方案大概率是
對 pnpm 親和
對 TypeScript 的 Type 親和
只支持 ESM
基于 esbuild(也就代表著,幾乎不用 TypeScript 自帶的語法特性)
有類似 fastify 或者 rollup 的插件系統(tǒng)
主框架可能是 go 編寫的
能提供處理依賴 DAG 方面的工具
提供 cli
CSS
TailwindCSS 進(jìn)一步得到應(yīng)用和流行。年底發(fā)布 3.0, TailwindCSS 的作者很有想法。
Tailwind CSS v3.0 – Tailwind CSS tailwindcss.com/blog/tailwindcss-v3
Vue
Vue 3 進(jìn)一步流行。期望 TS 官方能像對待 React 一樣對待 Vue 3。
Vuex 5
大家都在談?wù)摚俏覜]找見 Repo
Vite
Vite 有望成為最好和最快的前端開發(fā)環(huán)境。個(gè)人認(rèn)為,Vite 其實(shí)應(yīng)該集成一些 Deno 的支持。Vite 和 Deno 在一起能做點(diǎn)什么?目前沒想到。
https://patak.dev/vite/ecosystem.html patak.dev/vite/ecosystem.html
Nuxt
Nuxt 3.0 正式版發(fā)布。Nuxt 3.0 對于 Vue 的 SSR 世界,應(yīng)該是質(zhì)的改變的一個(gè)版本,這個(gè)版本對于 Nuxt 團(tuán)隊(duì)也是非常挑戰(zhàn)的,他們用 TS 完全重寫了 Nuxt
https://github.com/nuxt/framework github.com/nuxt/framework
JS & TS 應(yīng)用工具型 APP
工具創(chuàng)業(yè)進(jìn)一步惡化,各種工具的開源版本雨后春筍般出現(xiàn)。本質(zhì)是工具抽象的普遍普及化,也是前端世界上一階段的積累開花結(jié)果的情況。有意思的是,據(jù)我從 github 的 trending 上來看,這些項(xiàng)目,大部分還都是國人所做,質(zhì)量很高,但是同質(zhì)化很嚴(yán)重。
技術(shù)三大循環(huán),首先做出來的閉源賺錢->同質(zhì)化嚴(yán)重開源賺錢->在多就變成培訓(xùn)班的講義了。這一速度的周期,目前看,一個(gè)階段到另一個(gè)階段大約是 2-3 年左右。好消息是,我們學(xué)最佳實(shí)踐越來越快,壞消息是這一速度在進(jìn)一步壓縮。
TypeScript 函數(shù)式編程
一些有關(guān)的項(xiàng)目
https://github.com/gcanti/fp-ts github.com/gcanti/fp-ts
https://github.com/remeda/remeda github.com/remeda/remeda
ORM
prisma 越來越流行
prisma www.npmjs.com/package/prisma
typeorm 趨于穩(wěn)定(JS 的裝飾器成熟對于 typeorm 可能是利空)
typeorm www.npmjs.com/package/typeorm
瀏覽器離線存儲(chǔ)解決方案
所有的前端離線狀態(tài)存儲(chǔ),響應(yīng)式是標(biāo)配
https://github.com/dexie/Dexie.js/releases/tag/v3.2.0 github.com/dexie/Dexie.js/releases/tag/v3.2.0
rxdb www.npmjs.com/package/rxdb
Json-schema 進(jìn)一步應(yīng)用
typescript 解決了編譯前的問題。json-shema 解決運(yùn)行時(shí)的問題。 已經(jīng)有很多成熟的項(xiàng)目幫助這件事更容易應(yīng)用
https://github.com/sinclairzx81/typebox github.com/sinclairzx81/typebox
Github 前端項(xiàng)目現(xiàn)狀
沒事就翻翻 github 的 trending 來看,主要是 JavaScript 和 TypeScript 的項(xiàng)目(沒有數(shù)據(jù)支持,純粹是 Github 推給我的項(xiàng)目和 trending 項(xiàng)目的感受)有以下特點(diǎn): 國內(nèi)的 github 項(xiàng)目大部分屬于整合型業(yè)務(wù)項(xiàng)目,業(yè)務(wù)框架以及學(xué)習(xí)資料的項(xiàng)目。 國內(nèi)流行的框架,如果 issue 提的很多,中文就特別多,這一點(diǎn)似乎對國外人使用就勸退很厲害。有很多項(xiàng)目能明顯看到,只有國內(nèi)人使用。 截止 2021 年底,國內(nèi)在 github 上的 JavaScript 和 TypeScript 的基建項(xiàng)目,數(shù)量相對比較少。 題外話,pnpm 的小哥是烏克蘭人,貌似創(chuàng)業(yè)也發(fā)生在烏克蘭(沒確認(rèn)創(chuàng)業(yè)地點(diǎn)。) 截止到 2021 年底,我今年受惠最多的我國作者(除了尤大)是
GitHub - egoist/egoist: readme for github.com/egoist github.com/egoist/egoist
我使用了他開發(fā)的 tsup 和 cac,其中 tsup 是一個(gè)基于 esbuild 的,針對 TypeScript 的打包器。cac 是一個(gè)命令行工具,支持 deno。 還有
https://github.com/xcatliu github.com/xcatliu
我使用了他開發(fā)的 eslint-config-alloy 還有
https://github.com/antfu github.com/antfu
我使用了他開發(fā)的一些 vite 的組件,以及學(xué)習(xí)了一些他寫的文檔。
最后
其實(shí)這些變化,單看每個(gè)都不復(fù)雜,基本上:
老的標(biāo)準(zhǔn)慢慢廢棄,選擇新的標(biāo)準(zhǔn),例如 ESM 開始對快有一些追求,例如 esbuild、vite 更原子化的抽象,例如 Tailwind CSS 更多的類型,更多的約束,例如 TypeScript 的持續(xù)流行 潛在的,更多的函數(shù)式。實(shí)際上這里面很多項(xiàng)目,去看源代碼基本都是函數(shù)式編程。這一點(diǎn),其實(shí)變成了一種分工分界線,函數(shù)式編程,對于廣大的應(yīng)用的編程領(lǐng)域來說,還是太難了,但是對于基建和框架范疇,基本都是函數(shù)式編程。在 TypeScript 和 JavaScript 的世界,貌似沒有第二種選擇。當(dāng)然這一點(diǎn),本質(zhì)是更抽象和模型與更原子的語義化。(函數(shù)式的一切都是為了 compose,實(shí)際上這一點(diǎn)能涵蓋上面那幾點(diǎn))
所有這些變化,都是為了開發(fā)更復(fù)雜的應(yīng)用。
你準(zhǔn)備好了么?
最后
如果你覺得這篇內(nèi)容對你挺有啟發(fā),我想邀請你幫我三個(gè)小忙:
點(diǎn)個(gè)「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)在看,都是耍流氓 -_-)
歡迎加我微信「qianyu443033099」拉你進(jìn)技術(shù)群,長期交流學(xué)習(xí)...
關(guān)注公眾號「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時(shí)聊騷。

