Express、Koa、Meteor、Sails.js:天啟的四個框架
已發表: 2022-03-11由於對 Web 應用程序的巨大需求,JavaScript 無疑已成為近年來最流行的語言之一。 在為多種瀏覽器編碼時,JavaScript 幾乎是前端開發人員的唯一選擇。 有人可能會爭辯說有 CoffeeScript、TypeScript 或 Dart 作為替代品。 然而,事實是,CoffeeScript 主要被視為最終歸結為 JavaScript 的語法糖。 TypeScript 只是 JavaScript 的一個超集,它包含幾個面向對象的語言特性,例如可選的靜態類型、類和接口,而且它仍處於早期階段。 Dart 也是一種面向對象的語言,具有類似 C 的語法,但它仍然可以編譯為適用於主流瀏覽器的 JavaScript。
隨著 Node.js 的誕生和快速成長,JavaScript 不再局限於前端開發,後端開發也不再是前端程序員的火箭科學。 人們傾向於將 JavaScript 視為適用於所有情況的靈丹妙藥:前端、Web 服務器、桌面應用程序、嵌入式系統、數據庫……這個列表越來越長。 事實上,鑑於 JavaScript 的廣泛受眾,Node.js+MongoDB+AngularJS/React 已經造就了相當多的全棧 Web 開發人員。 然而,Node.js 被設計為輕量級的,並且僅提供作為 Web 服務器的基本功能,以提高 Web 應用程序的開發速度。 作為 npm 包可用的良好框架之一在現實世界中將是更好的選擇。
在這篇文章中,我們將介紹其中一些眾所周知且經過時間考驗的 Node.js 框架,這些框架使開發人員不必一遍又一遍地重新發明輪子。 更具體地說,在本文中,我們將了解 Express、Koa、Meteor 和 Sails.js。 與其試圖弄清楚這些框架中的每一個如何相互疊加,我們將看到這些框架中的每一個擅長的關鍵領域以及它們如何與各種項目需求相關。
Express:極簡主義的 Web 框架
不用說,Express 是 Node.js 業務最大的一筆交易。 每個 Node.js 玩家都聽說過它,並且在不知不覺中使用它。 它目前是第 4 代,有很多基於它構建或受其概念啟發的 Node.js 框架。
表現
大多數開發人員都喜歡 Node.js 的原始速度,而當涉及到框架選擇時,完美主義者可能會鄙視任何性能危害。 Express 在 Node.js 之上提供了一個薄層,具有 Web 應用程序功能,例如基本路由、中間件、模板引擎和靜態文件服務,因此 Node.js 的強大 I/O 性能不會受到影響。
Express 是一個最小的、無主見的框架。 它不應用任何流行的設計模式,例如 MVC、MVP、MVVM 或任何開箱即用的趨勢。 對於簡單的愛好者來說,這是所有其他框架中的一大優勢,因為您可以根據自己的喜好構建應用程序,而無需不必要的學習曲線。 這在創建一個沒有歷史負擔的新個人項目時尤其有利,但隨著項目或開發團隊的成長,缺乏標準化可能會導致項目/代碼管理的額外工作,最壞的情況可能導致無法維護.
發電機
儘管該框架是無主見的,但它確實具有生成特定項目文件夾結構的生成器。 安裝 express-generator npm 包並使用 generator 命令創建應用程序骨架後,將創建一個層次結構清晰的應用程序文件夾,以幫助您組織圖像、前端靜態 JavaScript、樣式表文件和 HTML 模板文件。
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
中間件
中間件基本上只是可以完全訪問請求和響應對象的函數。
顧名思義,中間件在將控制權交給實際業務邏輯或下一級中間件之前會應用一些過濾指令。 一些常見的任務包括檢查用戶登錄狀態、驗證用戶權限或防止跨站點攻擊,最好將其提取為中間件。
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Express 應用程序本質上是具有大量中間件功能的 Node.js,無論您是想自定義自己的中間件還是利用框架的內置中間件,Express 都使過程自然而直觀。
模板引擎
模板引擎允許開發人員將後端變量嵌入到 HTML 文件中,並且在請求時,模板文件將呈現為純 HTML 格式,其中變量插入了它們的實際值。 默認情況下,express-generator 使用 Pug(最初稱為 Jade)模板引擎,但 Mustache 和 EJS 等其他選項也可以與 Express 無縫協作。
數據庫集成
作為一個最小的框架,Express 並不認為數據庫集成是其包中必需的方面,因此它傾向於不使用任何特定的數據庫。 在採用特定的數據存儲技術時,無論是 MySQL、MongoDB、PostgreSQL、Redis、ElasticSearch 還是其他,只需安裝特定的 npm 包作為數據庫驅動程序即可。 這些第三方數據庫驅動在執行 CRUD 指令時不符合統一語法,這使得切換數據庫非常麻煩且容易出錯。
Koa:利用下一代 JavaScript 功能
Koa 由 Express 背後的團隊開發,其目標是通過不在其核心中捆綁任何中間件來最小化極簡主義的 Express。 除了沒有中間件之外,Koa 看起來與 Express 非常相似,輕量級且沒有意見。 然而,讓 Koa 真正脫穎而出的是它通過使用 ES6 生成器功能完全放棄回調的方式。
優雅的控制流
Javascript 是一種異步編程語言,憑藉語言本身的這種本能和 Node.js 的單線程事件驅動機制,回調無處不在,因此臭名昭著的回調地獄。
扁平化回調嵌套的一種方法是使用 Async.js。 Async.js 提供了映射、並行化、序列化或迭代多個函數的技術,而不必將一個函數嵌入到另一個函數中,然後使用回調函數傳遞控制流,一個回調和一個錯誤處理函數足以處理組合在一起的大量函數通過 Async.js 方法。 然而 Async.js 不能完全清除回調。 使用 Async.js 編寫 Node.js 代碼時,代碼的縮進仍然傾向於向右漂移,只是沒有那麼深。
另一種更簡潔的方法是使用 then-able Promises。 一些享有盛譽的第三方 Promise 庫是 bluebird 和 q。 在最新版本的 JavaScript ES6 中,Promise 已被納入標準。 長話短說,Promise 通過將實現塊/函數與一堆 Promise “then”函數連接起來,保證函數按順序執行和返回。 您可以在每個實現塊/函數的末尾“解析”,以便執行下一個“then”函數,或者您“拒絕”以下實現,以便控制流直接跳轉到錯誤處理。 這樣,您將所有錯誤處理函數聚合到一個地方並徹底擺脫回調。

現在 ES6 帶來了一個遊戲規則改變者——ES6 Generator。 這個概念對 JavaScript 來說是新的,但在編程世界中根本不是新的。 ES6 Generator 就像 C 中的中斷,而不是從上到下一直運行代碼行,ES6 Generator 引入了一種方法來運行->暫停並運行其他內容->返回以完成剩餘的內容。
Koa 正在利用 ES6 生成器來提供一種優雅的方式來處理 JavaScript 異步編程,因此您無法在純 Koa 應用程序中看到回調。 Koa 中 ES6 生成器的一個典型用例是中間件級聯,它允許自定義中間件一個接一個地執行,而無需任何討厭的回調。
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
我們不能妄下結論斷言這種尖端技術優於 Async.js、Promise 或事件發射器等老派解決方案,但可以肯定的是,這種新概念確實需要一些時間來適應。 使用非常規的控制流序列,會給代碼調試帶來額外的困難。
Meteor:Web、移動和桌面框架
Meteor 是一個一體化的 JavaScript 框架。 區別於 Express 和 Koa 的簡化理念,它走向了另一個極端,將自己定義為一個全棧框架,一個涵蓋服務器、移動、桌面和 Web 應用程序的完整包。
一站式套餐
如果你仔細觀察,你會注意到 Meteor 真的是 Node.js+Blaze/AngularJS/React+Cordova+MongoDB。 Node.js 和 MongoDB 分別負責服務端業務邏輯和數據存儲。 Blaze、AngularJS 或 React 之一負責前端 UI。 Cordova 作為最著名的移動混合應用程序 HTML 解決方案,將網頁連接到移動視圖。
數據同步
後端和前端共享數據的主流流程如下:
- 客戶端請求數據或某些 HTML 視圖
- 服務器從數據庫中檢索數據,使用一些模板引擎將數據與 HTML 視圖混合併將其發送回前端
- 客戶端以用戶友好的方式呈現和顯示數據/視圖
現代單頁 Web 應用程序稍微調整了上述過程。 以 AngularJS 為例,它將 HTML 模板作為靜態文件與前端 JavaScript 文件、樣式表和圖像等其他資產放在一起。 然後,AngularJS 通過使用 Ajax RESTful API 向後端詢問數據,將數據填充到 HTML 模板中。 無論哪種方式,後端開發人員全權負責處理來自前端的數據更改請求並將更改保存在數據庫中。
Meteor 與其他框架的區別之一是它在服務器和前端/移動應用程序之間的數據同步機制。 在 Meteor 中,客戶端擁有一個小型數據庫卷影副本,它是從服務器數據庫複製的一小部分,該部分先前由客戶端請求並由服務器授權。 當客戶端想要對數據進行任何更改時,它使用一致的數據庫 API 作為服務器端執行任何 CRUD 指令,然後數據更改將自動發送到服務器並保存在實際數據庫中。 每當服務器檢測到任何數據修改時,它都會將更新的數據推送到訂閱這些數據的特定客戶端。 這種雙向數據同步是自動完成的,無需任何人工干預。 為了創造這種魔力,Meteor 在後台使用 WebSocket 連接客戶端和服務器,以便一端的任何數據更改都會立即反映到另一端。
構建自動化工具
Meteor 不僅負責服務器和 Web 應用程序應用程序,在 Cordova 的幫助下使用 Meteor 的名為 Isobuild 的構建工具,這是一個將 HTML/JavaScript/CSS 與本機移動功能捆綁在一起的庫,Meteor 使構建 iOS 和 Android 應用程序變得輕而易舉。 生成的移動應用程序是運行 JavaScript 或在 WebView 中顯示 HTML 頁面的混合應用程序。 與原生移動應用程序相比,這種解決方法可能會影響一些用戶體驗,但對於許多能夠在與 Web 應用程序相同的代碼庫下進行管理的人來說,這是一個很大的賣點,並且可以節省大量的開發成本。
總的來說,Meteor 是一個高度自動化的框架。 這種高水平的自動化使開發人員的生活變得更加輕鬆,但也帶來了危害性能和可擴展性限制的成本。 隨著用戶群的增長,自動數據同步技術成為擴展的瓶頸。 為了達到與其他手動調整的後端技術相同的容量和性能,Meteor 通常會消耗更多的服務器硬件和帶寬資源。 因此,如果想要為所有主要平台製作項目原型,Meteor 可能是一個很好的起點和完美的工具箱,但最終在某個時候,如果原型成為具有足夠多的生產項目,則必須以更專業的方式重新設計系統架構客戶群。
Sails.js:Node.js 的高級 MVC 框架
Sails.js 與 Express 有許多相似之處。 它是一個項目生成器、中間件和模板引擎。 它實際上是建立在 Express 之上的,加上一些更高級別的功能來加速開發。
MVC
Sails.js 從其核心採用 Model-View-Controller 設計模式。 對於那些來自 Ruby on Rails 或 Laravel 的人來說,他們會發現 Sails.js 應用程序的結構非常熟悉。 模型表示反映數據庫表/集合模式的數據模型,視圖是填充數據的 HTML 視圖,控制器是您放置所有服務器端業務邏輯的地方,並充當數據和視圖之間的粘合劑。
實時通訊
與客戶端每次都必須查詢服務器數據的 HTTP 請求,或者使服務器處於空閒模式的長輪詢連接不同,Socket.io 在客戶端和服務器之間建立了基於事件的雙向通信。 Sails.js 集成了 Socket.io 並用一些更高抽象級別的 API 將其包裹起來以提供更多便利,從而使 Sails.js 特別適合創建聊天應用程序或多人遊戲。
數據庫 ORM
在後端邏輯和實際數據庫操作之間,有一個稱為 Waterline 的中間 ORM 層。 簡單地說,這個 ORM 工具提供了一致的語法來訪問不同的數據庫,而開發人員不必擔心各種數據庫查詢語言,如 SQL 與 NoSQL、模式與無模式等。
Sails.js 具有中級自動化程度。 它專注於服務器端邏輯並已準備好生產,它提供了比 Express 更快的開發速度,而不會犧牲任何性能或未來的可擴展性。 尤其是對於大量 MVC 模式愛好者來說,Sails.js 的學習曲線相當流暢。
包起來
本文不是對不同的 Node.js 框架進行排名,而是列出每個框架的閃光點以脫穎而出,以幫助 Node.js 開發人員在從頭開始構建項目時選擇最適合的工具箱。
那麼,您最喜歡哪一個用於 Web 開發的 Node.js 框架? 除了我們上面討論的框架之外,你更喜歡其他框架嗎? 在下面的評論部分讓我們知道。
- 為什麼我會使用 Node.js? 個案教程
- Cabin Fever 編碼:Node.js 後端教程
- 構建 Node.js/TypeScript REST API,第 1 部分:Express.js