作者 | Mohit
譯者 | 蓋磊策劃 | 田曉旭
Node.js 自發布以來,已成為業界重要破局者之一。Uber、、 和沃爾瑪等大型企業,紛紛將技術棧轉向 Node.js。Node.js 支持開發功能強大的應用,例如實時追蹤 App、視頻 / 文本聊天引擎、社交媒體 App 等,當前已成為開發人員熱衷的一項技能。本文作者基于自身實施經歷,給出一張 Node.js 學習路線圖。建議開發人員考慮深入掌握 Node.js 之前,必須明確自己構建的目標,否則容易半途而廢。目標導向有助于在學習中聚焦關鍵技能,而非糾結于是否值得去學習。
必備技能
對于一名前端開發人員,在考慮掌握后端技能時,無需花費大量的精力學習去 。而對于完全小白,如果想要在盡可能短的時間內掌握 Node.js,在深入前必須領會如下概念:
此外,Node.js 中涉及大量的異步編程處理,推薦掌握如下概念:
npm 軟件包管理
Node 軟件包管理(Node ,npm)提供當前規模最大的注冊軟件庫,其中提供 80 多萬種軟件包。正確使用 npm,可極大地降低軟件包管理的復雜度,非常便于解決應用開發中的依賴問題。
npm 提供三個組成模塊:
npm 還可管理各版本的代碼及依賴。如果使用 npx,無需下載軟件包即可運行軟件包。
Node.js 基礎知識
事件發射器(Event ):做為 Node.js 中的對象,Event 在操作執行完成后發送消息,觸發特定的事件。開發人員也可編寫代碼,監聽 Event 發出的事件。例如,一旦完成特定的前端操作,諸如鼠標點擊、按鍵和鼠標移動等交互操作軟件開發 時間表 模板,需在后端做進一步處理。這時后端的 Node.js 環境使用 類,構建相應的事件處理模塊,用于處理操作事件。
回調():回調是特定任務執行完成后調用的函數,不影響其它代碼的同時執行,避免了異步處理產生阻塞。鑒于 Node.js 中需處理大量的異步任務,因此回調無處不在。回調是實現應用無縫快速執行的關鍵,其運作機制如下圖所示:
類:設計用于處理原始二進制數據的 Node.js 類,操作 V8 引擎外分配的內存。 類實現為大小不可調整的整數數組,并提供一整套二進制數據操作方法。例如,對于表示范圍在 0 到 255 之間字節值的內存中整數,使用 .log() 輸出該 實例,會給出一系列十六進制值。
模塊系統( ):使用 Node.js 生態系統提供的模塊,可實現一些復雜功能。模塊是可復用的 代碼,實現特定的功能。
開發技能
版本管理系統:掌握 git、 等的使用。開發中,應盡量避免交叉修改代碼導致的更改不可逆。因此,在大型項目中需使用版本控制系統管理。要熟悉版本控制系統的使用,開發人員應該具備扎實的基礎知識。
HTTP/HTTPS 協議:一位優秀的 Node.js 開發人員,應具備傳輸協議數據傳輸的基礎知識,因為每位后端開發人員都需要深入理解 HTTP/HTTPS 的工作機制。HTTPS 使用稱為 TLS( Layer )的加密協議加密通信。后端環境中有大量要學習的知識點,這對于 Web 小白是頗具難度的。簡而言之,基本的 Web 通信主要包括六種請求方法:
Web 框架
注意:本文僅列出了部分推薦 Web 框架。使用 Node.js 構建個人項目時,為降低學習難度,推薦從中選定一種框架,否則學習難度很高。
.js:提供構建應用所需的最小化接口和工具,非常靈活易用,大量 npm 模塊可直接插入 使用。
.js:一種構建 應用的萬事通框架,提供內建的 ,支持 。運行 myapp,即可生成一個具有 后端的 HTML/ 頁面。使用 .js 可有效助降低項目開發時間,并簡化項目的維護。當然如果只是構建一個簡單的 Web 應用,還是推薦使用 。
Sails.js:一種支持快速構建 REST API、單頁應用(SPA)和實時 APP 的 MVC 框架。如果開發人員考慮實操一些重要技能,例如使用 支持實時操作,使用按約定編程( over )方法等,推薦學習 Sails.js。
Koa.js:如果開發人員考慮構建一個經得起時間考驗、易于維護的魯棒應用,Koa.js 無疑是很好的選擇。Koa 應用實現為包含一組中間件函數數組的對象,其中函數以堆棧方式執行。
Nest.js:該框架繼承了 的理念,使用 構建,并且在底層使用了 .js,因此兼容大多數 中間件。Nest 提供很好的模塊化結構,代碼組織在不同模塊中,進而構建高效、良好擴展的應用。
數據庫管理
學習 Node.js 需要掌握大量的后端技能。對于一名小白,開始可選擇 MySQL 等數據庫。只有厘清后端系統設計的基礎知識,才能根據項目的需求,考慮在 MySQL 等基本 SQL 數據庫之外選取后端。
注意:關系數據庫依然是主流。例如,在建模產品、類比、標簽等時依然主要使用關系表結構。類似于電子表格,關系表由行和列組成。
關系數據庫管理系統
SQL :微軟的關系數據庫產品,支持標準 ANSI SQL,也提供產品獨有的 SQL 實現。
MySQL:一款優秀的關系數據庫管理系統,時由 提供的開源后端軟件,具備按需改進代碼的靈活性。MySQL 可很好地替代 、 SQL 等商業數據庫產品。
:具有大規模開發團隊支持的開源產品,可運行在 Linux、UNIX 和 等大多數主流操作系統上。 支持絕大多數標準 SQL 查詢,還提供復雜 SQL 查詢、外鍵、觸發器、事務、MVCC、流復制等特性。
:MySQL 的改進版,額外內建了多種特性、安全和性能改進。簡而言之, 性能優于 MySQL,推薦在大型應用中使用 。例如, 的大型連接池支持超過 20 萬的并發連接,顯著優于 MySQL。
云數據庫服務
Azure :一種全球分布式數據庫服務,支持遠程管理數據。對于大型應用,云數據庫在擴展型和可管理性上具有優勢。 Azure 完全簡化了可擴展和分布能力,在同一后端上支持多種數據模型,即可同時用于文檔、鍵值、關系和圖模型。該服務不依賴于任何模式,因此可稱為 NoSQL 數據庫,但可使用支持 ACID 交易的查詢語言。
:非常適用于具有 SQL 經驗的用戶,提供全托管 NoSQL 數據庫服務,具有高性能,可預測,擴展性很好。 支持創建關系表,可存儲并檢索任何規模的數據,提供任何服務等級的請求。
NoSQL 數據庫
:面向文檔的 NoSQL 數據庫,適用于大規模數據存儲。類似于表是關系數據庫的基礎, 使用集合()和文檔()。其中,文檔包含了鍵值對,是 的基本數據單元。集合包含一系列文檔和函數,對標關系數據庫中的表。
Redis:可用于數據庫、緩存和消息代理( )。Redis 使用字符串、哈希、列表、集合、位圖、 和時空索引等數據結構,以鍵值形式存儲數據。下面舉例說明:
假設應用必須處理授權用戶的不同操作。每次驗證用戶身份,都必須獲取應用中訪問權限控制模塊的授權。實現此類安全機制的方案很多。例如軟件開發 時間表 模板,標準的 JOSE( 對象簽名和加密)框架可確保應用數據的安全性。但面對多種授權時,應用同樣很難擴展。除了發送授權列表給用戶,另一種解決方案是將用戶授權以某種形式的數據庫存儲。授權以鍵值對(也稱為令牌)形式提供,用戶必須提供鍵值進行驗證。
: 創建的高度可擴展、高性能的分布式數據庫,設計針對物理上分布的海量數據,實現無單點故障的存儲。不同于其它關系數據庫系統, 在分布式設計上參考了 ,數據模型使用 。
:一款超輕量級、高性能的 .NET NoSQL 嵌入數據庫,實現無服務器的文檔存儲。 使用于小型的桌面應用、Web 應用,可根據每個用戶的每個賬戶建立一個獨立數據庫。
搜索引擎
注意:為什么需要了解搜索引擎技術,下面舉例說明。如果使用谷歌搜索引擎,它本身就是一個完整的 Web 應用。對于 Solr 和 等后端框架,它們會對所有類型數據集創建索引,進而在服務器提供搜索功能。Solr 支持百萬級用戶的搜索引擎網站。
:一種基于 使用 Java 開發的搜索和分析引擎,實現海量數據的實時存儲和分析。其高性能來自于對索引而非文本的搜索,核心基于結構化文檔,而非關系表和模式,提供豐富的 REST API 存儲和搜索數據。 可認為是一臺處理 JSON 請求并返回 JSON 數據的服務器。
Solr:提供包括字段搜索、布爾查詢、短語查詢、模糊查詢、語法檢查、自動填全等高級實時搜索功能。
緩存
注意:緩存使用內存中存儲文件拷貝,降低網絡調用,提供更快的網絡響應。
內存緩存
該技術大多數情況下使用服務器的內存,因此通常稱為內存緩存。服務器的一部分內存用作緩存,存儲降低應用網絡調用所需的所有數據。Node.js 提供的節點緩存(node-cache)和內存緩存(-cache)軟件庫,很好地處理了 Node 服務器上的內存緩存。
分布式緩存
分布式緩存將多個網絡內存整合為單一的內存數據存儲,進而用于緩存最終數據,提供對數據的快速訪問。該技術尤其適用于大規模數據和大量網絡調用的情況,通過在群集中添加更多的服務器實現緩存容量的增量擴展和擴容。Redis 是目前最廣為使用的 分布式內存,推薦進一步了解 。
模板引擎
模板引擎支持在應用開發中使用靜態模板文件,并在運行時替換模板文件中的變量為實際值,生成發送給客戶的 HTML 文件。下面列出了一些廣為使用的模板引擎。
實時通信
.io:對于起步接觸后端開發的學習者,了解 .io 的實時通信需要補充很多知識,主要底層邏輯在客戶端和服務器之間。.io 支持客戶和服務器間的雙向數據流,可視為實現兩個終端間實時通信的同步數據流行為。這需要客戶在瀏覽器支持 .IO,并且服務器端繼承了 .IO 軟件包,進而數據才能以 JSON 請求的形式發送。
API 客戶端REST
在 REST 提出之前,API 使用遠程過程調用(RPC)開發,類似于本地執行的代碼。期間許多技術使用了類似于 RPC 的技術棧,并未從根本上解決問題,直到 REST 提出以更好的方式構建基于 Web 的 API。
REST 架構使用基本 HTTP 調用進行通信,避免了使用 COBRA、COM +,RPC 等復雜方式通信。在 REST 中,調用是基于消息的,依賴 HTTP 標準描述消息。在 Node.js 生態中,推薦使用 node-rest- 和 Axios。這兩個軟件庫為快速 Web 應用提供了很好的支持。
可很好地替代 REST。它使用 API 優先為客戶準確提供所請求的數據,是一種靈活并且對開發人員友好的替代方案,可使用 IDE 部署。 具有多項優點,包括在不影響現有查詢情況下添加和禁用數據域,以及支持多種方式構建 API。
測試 單元測試框架
單元測試實現各單元和組件的隔離測試。其中,單元可以是應用中的最小可測試代碼部分。下面列出 Node.js 的最好的單元測試框架:
模擬測試()
單元測試的規模越小越好,并盡可能輕量級執行。但在一些情況下,測試對象存在對其他對象的依賴。
例如,對于需要與域服務器或 Web 通信的對象,無法執行快速、輕量級的測試,這時就需要 測試。運行 測試不需要任何實際數據庫,或是任何類型的連接,只返回給出預期結果的對象。 測試只使用一些基本對象,模擬給出實際測試結果,因此可擺脫所有局限更快地運行測試。
推薦閱讀: 下面資料分別介紹了如何使用 Sinon 和 實現 測試:
Node.js 軟件庫推薦: