取代 Vue 和 React?25 年碼齡程序員不滿 Web 現(xiàn)狀創(chuàng)建新框架 Nue JS...
是重復(fù)造輪子,還是顛覆式創(chuàng)新?轉(zhuǎn)自:InfoQ (ID:infoqchina)
近日,前端開發(fā)者 Tero Piirajinen 推出了一個名為 Nue.js 的極簡化前端開發(fā)工具,并迅速引發(fā)社區(qū)討論。Piirajinen 在 Hacker News 上表示,它是 React、Vue、Next.js、Vite、Svelte 和 Astro 的替代品。

據(jù)悉,Nue 源自德語單詞 neue,與英語中的“new”同義。它能幫助具備 HTML、CSS 和 JavaScript 知識的開發(fā)者構(gòu)建服務(wù)器端組件與響應(yīng)式界面。具體來說,Nue 有三大優(yōu)勢:改善開發(fā)者體驗;加快項目進度;加快頁面加載速度。而其最大的亮點在于,它能將用戶界面代碼量控制在其他同類方案的十分之一。
Nue 作者 Piirainen 是一位來自赫爾辛基的前端開發(fā)者,并在開源項目、技術(shù)產(chǎn)品和初創(chuàng)企業(yè)中工作了 25 年以上,比較知名的成果包括 Riot.js、Flowplayer 和 jQuery 等。目前,Piirainen 正在獨力開發(fā) Nue.js 項目,并積極尋求更多貢獻(xiàn)者的加入。
Piirajinen 在 Hacker News 上的帖子中提到,過去 12 個月以來,他一直從事項目開發(fā)工作,最近還轉(zhuǎn)為全職。他的開發(fā)目標(biāo)有兩個:
-
Nue JS——一個用于構(gòu)建用戶界面的小型(壓縮后僅為 2.3 kb)JavaScript 庫。它類似于 React 和 Vue,但去掉了 hooks、effects、props、portals、watchers、injects、suspensions 等各種抽象元素。只要開發(fā)者具備 HTML、CSS 和 JavaScript 方面的基礎(chǔ)知識,就完全可以輕松上手。它支持服務(wù)器端渲染和客戶端響應(yīng)式組件,設(shè)計靈感來自 Vue 2.0 和 Riot.js(Piirainen 本人也是 Riot 的原作者)。
-
Nue 工具——一套完整的前端開發(fā)工具集。在完成之后,Nue 將能夠取代 Vite、Next.js 和 Astro 等系統(tǒng),這也是本項目的最終發(fā)展目標(biāo)。
Piirajinen 計劃在 2024 年 3 月之前完成所有工具的準(zhǔn)備工作,但具體時間取決于問題數(shù)量、開源維護工作量,以及他自己的判斷水平。目前,Nue 已在 GitHub 上開源,并遵循 MIT 許可證。
GitHub 鏈接:
https://github.com/nuejs/nuejs
Piirajinen 表示,他創(chuàng)建 Nue 的主要原因是他對于當(dāng)前 Web 開發(fā)態(tài)勢并不滿意,主要問題包括相關(guān)工具太復(fù)雜、代碼難以理解、編譯時間長、網(wǎng)站過于臃腫等等。
此前,Piirajinen 在 Flowplayer、Muut 和 Volument 擔(dān)任首席產(chǎn)品官(CPO)時,就有一些不太愉快的前端開發(fā)經(jīng)歷。雖然項目最初進展順利,但很快就變得難以維護。經(jīng)過幾個月的開發(fā),工作節(jié)奏開始明顯放緩,原本樂觀的未來計劃也越來越難以落地。
Piirajinen 認(rèn)為,不只是他自己有這種感覺,整個前端開發(fā)行業(yè)都面臨危機。Piirajinen 提到,他讀過不少相關(guān)文章,開發(fā)者們紛紛表示前端令他們身心俱疲。因此,Piirajinen 想要做點什么,改變這令人惱火的現(xiàn)實。
Piirajinen 計劃以極簡化方式從零開始構(gòu)建一切,并用到了不少“舊有”創(chuàng)新成果,例如漸進式增強、關(guān)注點分離和語義網(wǎng)頁設(shè)計。而 Nue 是 Piirajinen 改變現(xiàn)狀的一次雄心勃勃的嘗試,希望能為 JS 和 UX 開發(fā)者們提供極簡化工具。它強調(diào)恢復(fù) Web 標(biāo)準(zhǔn)模型的榮光,并引入現(xiàn)代創(chuàng)新的力量。Nue 想要讓 Web 開發(fā)再次變得有趣。
Piirainen 表示,Nue 的靈感主要來自 Jarred Sumner 開發(fā)的 Bun。這是一款新的 JS 運行時、捆綁器、測試運行器外加 NPM 兼容型包管理器。Piirainen 認(rèn)為,Bun 希望讓 JavaScript 變得更快,而 Nue 希望讓前端開發(fā)變得更快。Nue+Bun 將成為面向前端開發(fā)者的完美組合。值得一提的是,Jarred Sumner 和 Piirainen 一樣,也是一個單兵作戰(zhàn)的開發(fā)者。
Nue 的其他靈感來源還包括:
Salvatore Sanfilippo 的推文:“縱觀如今的 Web,我發(fā)現(xiàn)開發(fā)實踐仍然沒能遵循最基本的導(dǎo)航和可用性規(guī)則。盡管硬件發(fā)展一刻不停,但 Web 呈現(xiàn)速度仍然很慢。我只能認(rèn)為,現(xiàn)代前端開發(fā)已經(jīng)走進了死胡同?!?
喬布斯的名言:“一切應(yīng)該以客戶體驗為起點,再據(jù)此倒推技術(shù)實現(xiàn)?!?
Dieter Rams 的名言:“少,即是多?!?
基于以上幾點,Piirainen 給 Nue 項目定下了三條指導(dǎo)原則:
-
關(guān)注點分離:讓人們各自專注自己的專業(yè)領(lǐng)域,由此加快交付速度;內(nèi)容創(chuàng)作者專注于內(nèi)容,UX 開發(fā)者專注于交互設(shè)計,JS 開發(fā)者負(fù)責(zé)前端中的后端部分。
-
“只用最普通的 Web 元素”:Nue 將努力發(fā)掘標(biāo)準(zhǔn) HTML、CSS 和 JavaScript 當(dāng)中蘊藏的力量。
-
極簡主義:小型代碼庫更易于維護和擴展,發(fā)生錯誤的幾率也會更低。
據(jù)了解,Nue 的最大優(yōu)勢就是幫助開發(fā)者以更少的代碼達(dá)成相同的效果。在一個項目中,同樣的功能實現(xiàn)之間存在 2 到 10 倍的代碼量差異并不罕見。以用 Nue 編寫的自定義列表框組件為例:React 版本需要使用 2500 行 JS 代碼,Nue 版本則能夠在保持 50% 到 80% 功能的前提下,把代碼量控制在十分之一。
“這就是 HTML”Nue 使用的是基于 HTML 的模板語法:
<div @name="media-object" class="{ type }"><img src="{ img }"><aside><h3>{ title }</h3><p :if="desc">{ desc }</p><slot/></aside></div>
類似于 React 宣稱其“就是 JavaScript”,Nue 也可被認(rèn)為“就是 HTML”。而這樣的特性,對于專注于交互設(shè)計、可訪問性和用戶體驗的 UX 開發(fā)者來說堪稱完美。
開發(fā)者可以點擊此處(https://nuejs.org/compare/component.html)查看 Nue 編碼風(fēng)格與 React、Vue、Svelte、Tailwind 和 Astro 之間的異同。
為擴展而生據(jù)介紹,Nue 之所以能夠為前端開發(fā)帶來新的可擴展水平,主要歸功于以下三大因素:
-
關(guān)注點分離,易于閱讀的代碼比“一團亂麻”的代碼更易于擴展。
-
極簡主義,100 行代碼肯定比 1000 行代碼更易于擴展。
-
人員分離。保證 UX 開發(fā)者只須關(guān)注前端,JS/TS 開發(fā)者只須關(guān)注前端的后端,這樣團隊技能就會達(dá)到最佳平衡。

UX 開發(fā)者與 JavaScript 開發(fā)者能夠并行工作、互不干擾,最佳結(jié)果也自然會由此產(chǎn)生。
對樣式解耦Nue 并不主張使用域 CSS、Tailwind 或者其他緊密耦合的 CSS-in-JS 框架。相反,它認(rèn)為最好將樣式跟布局和結(jié)構(gòu)區(qū)分開來,主要是因為:
-
有助于增加可復(fù)用代碼:因為樣式不會被硬編碼進組件,所以同一組件可以根本頁面或上下文而呈現(xiàn)出不同效果。
-
不會弄亂代碼:純 HTML 或純 CSS 代碼,其理解難度顯然大大低于亂七八糟的組合代碼。
-
更快的頁面加載速度:通過對樣式解耦,開發(fā)者可以輕松從次 CSS 中提取主 CSS,并將 HTML 頁面保持在關(guān)鍵的 14 kb 限制以內(nèi)。
Nue 擁有豐富的組件模型,允許開發(fā)者使用不同類型的組件構(gòu)建起各類應(yīng)用:
-
服務(wù)器組件:在服務(wù)器端渲染,可以幫助我們構(gòu)建起以內(nèi)容為中心的網(wǎng)站,無需 JavaScript 即可提升加載速度,并可接受搜索引擎的抓取。
-
響應(yīng)式組件:在客戶端渲染,可幫助開發(fā)者構(gòu)建動態(tài)島或單頁應(yīng)用程序。
-
混合組件:一部分在服務(wù)器端渲染、一部分在客戶端渲染。這類組件能幫助開發(fā)者構(gòu)建響應(yīng)式、SEO 友好的組件,例如視頻標(biāo)簽或圖片庫。
-
通用組件:既可使用在服務(wù)器端,又可使用在客戶端,且效果相同。
Nue 允許大家在單個文件上定義多個組件,這無疑是種能把相關(guān)組件整理起來并簡化依賴項管理的絕佳方法。
<!-- shared variables and methods --><script>import { someMethod } from './util.js'</script>
<!-- first component --><article @name="todo">...</article>
<!-- second component --><div @name="todo-item">...</div>
<!-- third component --><time @name="cute-date">...</time>
使用庫文件能讓我們的文件系統(tǒng)結(jié)構(gòu)看起來更加整潔,用于粘合不同部分的樣板代碼也會更少,更有助于把各種庫打包起來以供其他開發(fā)者使用。
工具組合更簡單Nue JS 提供用于服務(wù)器端渲染的簡單 render 函數(shù)和用于為瀏覽器生成組件的 compile 函數(shù)。而且無需像 Webpack 或 Vite 那類大型捆綁器那樣控制你的開發(fā)環(huán)境,可以直接將 Nue 導(dǎo)入到項目當(dāng)中。
當(dāng)然,如果開發(fā)者需要打理幾百上千個 NPM 依賴項,那么在業(yè)務(wù)模型層上使用捆綁器確實有其現(xiàn)實意義。Bun 和 esbuild 都是性能出色的理想方案選項。
相關(guān)用例Nue JS 是一款多功能工具,支持服務(wù)器端與客戶端渲染,可幫助開發(fā)者構(gòu)建起以內(nèi)容為中心的網(wǎng)站和響應(yīng)式單頁應(yīng)用程序。
-
UI 庫開發(fā):能夠為響應(yīng)式前端或服務(wù)器生成的內(nèi)容創(chuàng)建可復(fù)用組件。
-
漸進式增強 Nue JS:這是一套堪稱完美的微型庫,可通過動態(tài)組件或“島”增強以內(nèi)容為中心的網(wǎng)站。
-
靜態(tài)網(wǎng)站生成器:只需將其導(dǎo)入項目即可準(zhǔn)備渲染,無需借助捆綁器。
-
單頁應(yīng)用程序:可配合即將推出的 Nue MVC 構(gòu)建起更簡單、更具可擴展性的應(yīng)用程序。T
-
emplating Nue:一款用于生成網(wǎng)站和 HTML 電子郵件的通用工具。
對于這樣一個創(chuàng)新項目,不少社區(qū)網(wǎng)友給予肯定。網(wǎng)友 aziis98 大贊 Nue 是一個“很棒的項目”,即使是像他這樣一個 Vite 和 Astro 的忠實粉絲,也感到“耳目一新”。
網(wǎng)友 ilrwbwrkhv 評論稱:
真的很棒。盡管 Web 一直在不斷變化,但層出不窮的“新框架”還是無法讓人們滿意,而且全部主流框架也都驚人地相似。
我們確實有必要從頭開始考量需求,并拿出一套更小、內(nèi)存效率更高的解決方案。這里也希望有更多的前端開發(fā)者停止人云亦云,嘗試獨立思考,想想過去的老前輩是怎么努力減少內(nèi)存占用量的。
我每次看到如今的 Slack 等應(yīng)用程序,都有種悲傷和絕望的感覺。
像 Nue 這樣的項目至少發(fā)現(xiàn)了正確的問題,也擺出了嚴(yán)謹(jǐn)?shù)膽B(tài)度。支持!
也有不少網(wǎng)友直接指出 Nue 當(dāng)前存在的問題,并給出了比較中肯的建議。
網(wǎng)友 niutech 指出,Nue 更像是 Petite-Vue 或者 Riot.js 的替代品,還很難說可以取代非常成熟的 Vue 或者 React。所以拿它跟 headlessui-react/vue 做比較,就像拿蘋果跟橙子或者香蕉比較一樣有點錯位:無頭 UI 列表框的復(fù)雜度要高得多。其實在 Vue 中也可以用 Nue 那個級別的代碼量構(gòu)建起列表框,這事并不太難。
此外,作者并沒有在入門介紹 (https://nuejs.org/docs/nuejs/getting-started.html) 中提到如何在無需構(gòu)建步驟的情況下使用 Nue,從而逐步增強現(xiàn)有 HTML 網(wǎng)站(例如 Petite Vue):<script src="http://unpkg.com/petite-vue" defer init></script>`還是Alpine.js:`<scriptsrc="http://unpkg.com/alpinejs" defer></script>`。
用戶 bartq 認(rèn)為,單從網(wǎng)站構(gòu)建庫的角度來看,Nue 已經(jīng)做得很成功了,但身為開發(fā)者,他還期待看到其他成果:
1. 用該庫創(chuàng)建的示例項目,包括過程中的挑戰(zhàn)、解決方案、難題和成果。
2. 用視頻演示如何用 Nue 庫創(chuàng)建簡單的應(yīng)用程序。在已經(jīng)非常擁擠的 JS 生態(tài)系統(tǒng)當(dāng)中,光靠枯燥的說明文檔已經(jīng)很難吸引到支持者。比如想在視頻中看到:
- 工具如何起效; - 調(diào)試如何起效; - 構(gòu)建過程如何起效; - 還有其他哪些強大功能等。
參考鏈接 :
https://nuejs.org/
https://nuejs.org/compare/component.html
https://news.ycombinator.com/item?id=37507419
https://thenewstack.io/dev-news-a-nue-frontend-dev-tool-panda-and-bun-updates/
推薦閱讀 點擊標(biāo)題可跳轉(zhuǎn)