NodeJS 是什么
對 NodeJS 最大的誤解莫過于認為 NodeJS 就是 JavaScript,我們來看一下官網對 NodeJS 的定義Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.簡單翻譯就是
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境。
Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。
Node.js 的包管理器 npm,是全球最大的開源庫生態系統。
所以 Node 并不是一門語言,而是一個 runtime,也就是我們經常說的運行時,和我們非常熟悉的 JRE—— Java Runtime Environment 非常類似。如同瀏覽器是 JavaScript 的運行時,我們有時候也會稱之為宿主環境或者運行環境,Node 是 JavaScript 在服務器端的一個運行時。個人感覺稱 Node 為 JavaScript runtime 也不是很準確,因為 JavaScript 除了 ECMAScript 還包括了其在瀏覽器端的實作 BOM、DOM,這些在 Node 中是不存在的,叫 ERE 會更貼切一些,但是 Node 因為運行在服務器端,雖然缺失的 BOM、DOM,但是多了很多針對服務器編程常用的封裝,我們來簡單了解一下 Node 的組成
ECMAScript 解釋器
npm—— node package manager
CommonJS module system:NodeJS 誕生在 JavaScript 沒有官方模塊系統的年代,只能自己做一個規范并且內置實作(最新的 8.5 已經開始支持 ES6 modules)
debugger:方便開發者進行代碼除錯
fs、Stream、http、util 等常用內置模塊
在上層我們經常接觸的就是這些,到這里我們可以了解 Node 并不是運營在服務器端的 JavaScript,而是在服務器端的 JavaScript runtime。
Node 好在哪里
好多同學會有和我一樣的感覺,Node 一夜爆紅,變成了前端的必備技能,面試要求掌握一門后端語言,我們也可以大大方方說熟悉 Node 了。那么 Node 就行好在哪里,為什么會忽然編程前端界的網紅?
使用 JavaScript 作為方言毋庸置疑是非常重要一個原因,前端都其語法很熟悉,有天然的親切感。然而這并不是全部原因,甚至不是主要原因,在更早之前已經有了在服務器端運行 JavaScript 的嘗試 —— Rhino,但并沒有達到 Node 的成就,真正使 Node 流行的原因是其官方定義中的第二句
Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.
首先需要了解幾個基本常識
1.CPU 運算遠遠快于 I/O 操作
2.Web 是典型的 I/O 密集場景
3.雖然JavaScript 是單執行緒(隨著 JavaScript 演進,這條馬上要不成立),但 JavaScript 的 runtime Node 并不是,畢竟人家很多代碼是 C++
Node 使用了事件驅動和非阻塞的 I/O 模型,使 Node 輕量高效,非常適合 I/O 密集的 Web 場景。
很多語言是依賴的多行程、執行緒解決高并發,一個執行緒處理一條用戶請求,處理完成了釋放執行緒,在阻塞 I/O 模型下, I/O 期間該用戶執行緒所占用的 CPU 資源(雖然十分微量,大部分交給了 DMA)什么都不做,等待 I/O,然后回應用戶,而且開啟多個行程/執行緒 CPU 切換 Context 的時間也十分可觀。
就像飯店的服務員只負責點菜,如果給每個廚師都配一個服務員,服務員把客人選單給大廚后就玩手機等著一樣,你是老板你也生氣,況且不同于飯店大廚工資高于服務員,在計算機世界,CPU 資源比 I/O 寶貴的多。
說 NodeJS 在高并發、I/O 密集場景性能高,也就是 Web 場景性能高主要也是解決這個問題,沒必要一個廚師配一個服務員,整個飯店說不定一個服務員就夠了,剩下的錢可以隨便做其它事情。
用戶請求來了, CPU 的部分做完不用等待 I/O,交給底層完成,然后可以接著處理下一個請求了,快就快在
1.非阻塞 I/O
2.Web 場景 I/O 密集
3.沒那么多執行緒 Context 切換,多出來的開銷是檢查一個 EventLoop
除了 Web 場景的高性能,Node 可以流行起來還有一個重要原因——恰逢其時。
回頭看這三年前端經過了可以成為大爆炸的時代,代碼構建、自動化、單元測驗等等隨著前端作業職責范圍擴大和代碼復雜度膨脹充斥到所有前端眼前,前端不再是附庸在 HTML 上的小玩具,而是整個用戶體驗的中心。相應的前端對周邊工具的要求越來越多,讓前端用 Java 寫相關工具或者讓后端同學幫忙寫都不是最好的選擇,前端的問題前端自己解決才是最合適的,Node 以其足夠簡單了的特性,迅速擴充了其生態,各種好用的工具應運而生,正如前輩們說的——所有可以通過 JavaScript 解決的問題都將用 JavaScript 解決。
可以看看知乎上討論,小芋頭君說的團隊用 Node 的理由
對于我們團隊,其實使用NodeJS的理由,反而提現在其他方面:
1.生態活躍,解決方案眾多,我們的Node服務化,架構,協作方式都很先進,因為社區活躍,有很多思路可以借鑒,架構變得越來越優,開發方式也變得越來越趨向社區規范。反觀java,一直在玩老掉牙的架構,每天就是在搞環境問題,大部分開發完全不知道內部原理,而且沒有什么大的技術追求。
2.輕量,部署輕量,開發輕量。我們可以用最小的阿里云配置就部署出一個小應用來,用來做微服務化架構非常完美。想想把一個java系統拆分成十幾個微服務(java)的場景,每個行程啟動起來都要1G記憶體吧至少,high起來吧阿里云。
3.我們公司技術堆疊采用多語言,多一個語言就多一種可能性,例如一些用node實作特別適合的服務,Phantomjs類的服務(圖片,模擬操作等),WebSocket啊之類的。
工欲善其事,必先利其器
vscode,除錯 Node 特別方便,比 web storm 輕量,比 sublime 更像是各 IDE,atom 就不吐槽了
supervisior,我們在修改 Node 程式的時候需要不斷重啟才能看到結果,supervisor 可以幫我們監視檔案變化,自動重啟應用代碼
如果使用 Mac 的話,iTerm2 是必備
這樣就可以了,開發 Node 并不需要準備太多
興趣是最好的老師
如果我們有一定的 JavaScript 基礎,那么從頭看檔案是一件很無趣的事情,我們可以做一件很有成就感的小事情來幫助我們培養對 Node 的興趣,同時了解到大部分常用的 API,給大家推薦的興趣專案是做一個爬蟲,我們可以隨便無惡意的爬取一些網頁內容,使用資料庫或者檔案保存到本地
1.使用 Chrome 團隊的 headless 工具 Puppeteer 發起請求,獲得異步資料
2.使用 async/await 解決異步回呼問題
3.使用 fs、stream 保存檔案到本地,甚至可以練習一下 json 轉 csv,順便處理中文亂碼問題
4.使用 mongoose 保存資料到資料庫
這樣的一個小專案讓我們可以體驗用 Node 編程的樂趣,同時在寫代碼程序中會用到請求、檔案處理等我們在瀏覽器端很少遇到的問題,對 Node 有了全貌的了解之后,我們就可以通過官方檔案系統的學習了
官方檔案
Node 的官方檔案不止是 API 的呼叫,也是很多模塊的教程,尤其是 Stream 相關,是學習必備,關于 debug 技巧的 Debugging Node.js Apps 是我們開篇需要看的,推薦大家使用 vscode,除錯最簡單
一般來講我們肯定需要看的常用模塊
1.buffer
2.fs
3.path
4.http
5.url
6.stream
7.events
如果英文檔案閱讀有些障礙,可以看一下 Node 中文檔案
作者:Samaritan
鏈接:http://www.imooc.com/article/20579
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/144411.html
標籤:應用服務器
下一篇:vue匯出excel表格
