- 前端跨界開發指南:JavaScript工具庫原理解析與實戰
- 史文強
- 3214字
- 2022-08-12 16:06:19
2.1 大話Node.js
本節我們來認識一下Node.js,了解它能幫助我們完成哪些工作。
2.1.1 Node.js是什么
Node.js是一個基于Chrome V8引擎的JavaScript運行環境。Node.js使用了一個事件驅動的、非阻塞式I/O的模型,輕量又高效,它的底層是用C/C++編寫的。這是Node.js的官方描述,對前端開發人員來說,想要搞清楚其中所包含的“引擎”“運行環境”“事件驅動”以及“非阻塞I/O模型”到底是什么意思,并不是一件容易的事情。那么Node.js到底是什么?我們先用一個類比的示例來進行解釋。比如,有人向你發送了一個擴展名為docx的文檔,你想要查看其中的內容,于是打開記事本,把該文檔拖到記事本的窗口里,然后就看到了一大堆亂碼。這是因為記事本程序并不能識別這種格式的文檔,你需要先安裝Microsoft Office 2007以上版本的軟件,然后用Word程序打開,這樣才能看到正確解碼的內容。如果把示例中的docx文件看作程序,那么Word就是它的運行環境,這就像JavaScript程序與瀏覽器的關系一樣。如果你了解過現代瀏覽器的結構,就會知道其中包含了JavaScript引擎。以前,想要查看docx文件的內容,幾乎只能依賴于Microsoft Office,后來金山公司也推出了辦公軟件工具WPS Office,它也能夠解釋和運行docx文件,于是docx文件就有了多個可運行環境,而Node.js對于JavaScript語言的意義也是如此。
拓展知識
為了更加直觀地理解運行時的概念,你可以嘗試一個有趣的實驗,自己創造一種簡單的編程語言,規定一些簡易的語法,然后使用JavaScript來編寫能夠解釋這些語法的代碼。例如,用自創的語言編寫一些簡單的程序,最后通過Node.js運行JavaScript程序,并在程序中用Node.js提供的文件讀寫接口(File API)讀入你用自創的編程語言編寫的程序,看看它能否被正確地解釋和執行。待你了解了JavaScript是如何完成對自創編程語言的解釋和執行的,自然就能明白在Node.js運行環境中,C/C++對JavaScript腳本做了什么事情。當然,真實的代碼解釋執行過程要復雜得多,很多關鍵的思想和技術也被應用在前端框架的設計中,這些可以在今后的學習中慢慢消化。
相較于技術上的亮點,Node.js設計者的開發思想或許更值得學習,這一點正是大多數初級開發者所缺少的。Node.js的開發初衷是更方便地實現一個高性能的Web服務器,但當它最終問世時,并沒有宣稱自己是“實現高性能Web服務器的技術”,而是為開發人員提供了一個工具,這個工具的能力之一是實現高性能的Web服務器。這種思想差距在初級和高級開發人員之間表現得尤為明顯:初級開發人員往往會針對具體的業務需求采用面向過程的風格進行開發,這使得他們編寫的程序幾乎無法靈活應對任何需求變更;而有經驗的開發人員面對需求時,通常會先設計一個類,或者抽象一個與業務邏輯無關的工具方法,然后在自己的程序中調用這個方法。第5章講解Lodash.js的相關內容時,相信讀者會對這種做法的優勢有更深刻的體會。要想成為優秀的程序設計師,就要不斷地培養自己設計程序的能力,而不是僅僅完成語言層面的翻譯工作。
2.1.2 Node.js能做什么
在Node.js的諸多功能中,與前端開發人員關系最緊密的就是創建Web服務器和本地文件的讀寫能力。
1. 創建高性能Web服務器
許多Node.js的初學者應該都見過那段只用了不到10行代碼就建立了一個Web服務器的經典示例。盡管對于前端開發人員而言,他們依然需要學習基本的Web服務器知識,才能更加得心應手地進行服務端開發,但與配置Apache或Nginx來實現同樣的功能相比,這樣的學習成本已經非常低了,畢竟前端開發人員可以使用自己最熟悉的JavaScript語言來構建應用。另一方面,在Node.js中,代碼可以與各類數據庫進行交互,這就意味著前端工程師可以直接使用JavaScript語言編寫與數據庫進行交互的代碼(盡管在大型應用中并不推薦這樣做),且編寫業務邏輯代碼時,Node.js與其他后端語言沒有明顯的差別,因此前端開發人員不用切換開發語言就可以掌握全棧開發的技能。
由于Node.js底層使用的是異步非阻塞的I/O機制,因此它更適合于I/O密集、少量業務邏輯和計算消耗的場景。盡管解釋型腳本語言本身并不適合執行計算型任務,但Node.js底層是由C/C++代碼編寫的,并且提供了JavaScript代碼層與C/C++代碼交互的接口,面對計算密集型任務時,Node.js只需要作為啟動腳本調用底層C/C++程序來完成計算密集型任務就可以了。
拓展知識
服務端執行的任務大體可分為讀寫密集型任務和計算密集型任務。對于讀寫密集型任務而言,CPU更多的時間是在等待磁盤讀寫,使用率并不高,在Web服務器上進行的網絡通信、信息傳輸和磁盤讀寫等都屬于讀寫操作,它對磁盤的響應速度和傳輸效率有著更高的需求。相較而言,計算密集型任務對CPU的運算能力要求更高,但對磁盤讀寫造成的性能負擔很小,計算過程中通常也不需要與I/O接口進行交互,可直接、高效地在內存中執行,這類任務的計算過程通常比較復雜,例如需要實現某些加密算法或者矩陣計算等。
大型架構的后端技術選型需要考慮的因素更為復雜,Node.js設計之初并沒有準備承擔這項任務,就連Node.js之父Ryan Dhal自己也說,在面對大型服務端應用開發時,Node.js的開發體驗不如Go語言。但是,全世界目前有600多種編程語言,沒有任何一種語言能夠解決所有問題,語言只是承載和傳遞程序設計思想的媒介,如何為目標場景選擇一項合適的技術,或許是開發人員更應該關注的問題。當你在前端領域有一定的積累時,很多前輩都會推薦你繼續學習Java或C++等更為完備也更為復雜的語言,這樣做的目的并不僅僅是擴展能力邊界,更多的是希望你能夠跳出一種編程語言的束縛,學習和體會編程語言背后的思想。
2. 本地文件的讀寫功能
文件讀寫功能的底層所要解決的問題其實有很多。如果文件里的內容比較多,讀入內存的過程比較耗時,應該怎么處理呢?是等待讀入操作完成還是先去執行其他任務?如果客戶端請求的資源是一部高清電影,文件比程序可用的總內存還大,那么該文件是否就一定無法讀取了呢?Node.js的fs模塊幾乎為每個文件操作接口都提供了同步和異步兩種方法,同時也支持以流的方式對讀寫過程實現更細粒度的控制,甚至還可以監測指定文件或文件夾的變動。文件可讀寫意味著開發人員可以通過程序分析另一個程序中文件的內容,并對其進行檢查和糾錯,甚至可將其編譯成另一種語言,這便是前端工程化的能力基石。
2.1.3 招黑的JavaScript全棧工程師
Node.js憑借創建高性能Web服務器以及與數據庫通信的能力,為前端開發人員提供了服務端開發的機會。早在幾年之前,開發人員就可以使用MEAN(MongoDB + Express + Angular.js + Node.js)這種純JavaScript技術棧完成閉環的業務邏輯開發,很多前端工程師也因此自詡為全棧工程師。不可否認當年這樣的技術棧確實可以使許多中小型團隊以更少的人力和時間就把產品從創意階段推進到線上,但這也使得JavaScript開發人員成為業內最招黑的全棧工程師,因為業務邏輯的實現并不足以撐起全棧工程師進行后端開發。
在企業級開發中,后端開發仍然以Java工程師為主力軍。由于Java本身具有強類型和完整的面向對象的特性,因此后端工程師的編碼質量和程序設計意識整體要高于前端工程師,再加上與Java開發體驗非常相似的Angular技術棧的支持(Angular本身就是一項由Google的Java工程師開發和維護的技術),后端工程師很容易就能編寫出規范性和可維護性都不輸于前端開發人員的代碼,這大大提升了Java全棧工程師的競爭力。如果不是工程化配置和CSS實戰經驗形成的門檻,前端工程師在面對后端全棧工程師時很難體現其自身價值。然而,前端開發出身的工程師在使用Node.js技術棧進行服務端開發時卻沒有那么順利,最流行的Express和Koa框架,僅僅提供了框架和基本中間件,要想實現更多的功能,還需要引入或者自行開發大量中間件。這時開發人員之間的差別就會表現得非常明顯,即使完全不懂Node.js,后端開發人員也很清楚自己應該尋找具備日志記錄、錯誤追蹤、會話管理、安全校驗、性能監控、對象關系映射(ORM)、數據庫連接等功能的模塊或中間件,而普通的前端開發人員卻除了業務邏輯的增刪改查外,往往連使用“try...catch...”語句捕獲運行時錯誤的意識都沒有。前端工程師很容易只考慮業務邏輯一切正常的情況,只要主流程能夠正常運行,就覺得萬事大吉了,然而在真實的開發過程中,往往是那些沒有覆蓋到的邊界情況需要花費更多的精力。
把后端開發等同于編寫業務邏輯代碼,就好像把前端開發等同于編寫靜態頁面代碼一樣。如果真的想成為全棧工程師,需要用一顆謙虛求知的心,踏踏實實地去學習那些陌生的知識,學習的過程可能充滿艱辛,但你一定會受益于所學的結果。
- 演進式架構(原書第2版)
- Mastering NetBeans
- C語言程序設計
- Practical Windows Forensics
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優化計算
- 深度強化學習算法與實踐:基于PyTorch的實現
- WordPress 4.0 Site Blueprints(Second Edition)
- Python機器學習:預測分析核心算法
- Advanced Express Web Application Development
- PhoneGap 4 Mobile Application Development Cookbook
- Java程序設計實用教程(第2版)
- 前端程序員面試算法寶典
- MySQL從入門到精通
- MonoTouch應用開發實踐指南:使用C#和.NET開發iOS應用
- 精通Rust(第2版)