Node.js 深入淺出

如果你有一定的前端基礎,比如HTML、CSS、JavaScript、jQuery;那麼,Node.js能讓你以最低的成本快速過渡成爲一個全棧工程師,從而觸及後端和移動端的開發。

像現在非常火熱的Vue.js,Rect…,很多數據層動態交互優先選用了Node.js;So,這爲你爲什麼要學習它又增加了一大理由。

一、什麼是Node.js

本人之前一直對於Node.js存在誤區,以爲它也是一門語言,其實並不然。

Node.js 是谷歌 V8 引擎、libuv平臺抽象層以及主體使用 Javscript 編寫的核心庫。三者集合的一個包裝外殼,大量使用了使用事件驅動來實現異步開發。此外,在實時的Web應用上採用了基於 WebSocket 的推送技術,客戶端和服務器端都可以發起通信,能夠自由地交換數據。非常優雅、實用的打通了前後端。
這裏寫圖片描述

V8是谷歌開發的,目前公認最快的 Javascript 解析引擎,並且具備服務器端解析能力。libuv 是一個開源的、爲 Node 定製而生的跨平臺的異步 IO 庫。

簡單的說Node 就是 JavaScript 語言在服務器端的運行環境。

  • 所謂“運行環境(平臺)”有兩層意思:
    • 首先,JavaScript 語言通過 Node 在服務器運行,在這個意義上,Node 有點像 JavaScript 虛擬機;
    • 其次,Node 提供大量工具庫,使得 JavaScript 語言與操作系統互動(比如讀寫文件、新建子進程),在這個意義上, Node 又是 JavaScript 的工具庫。

所以:node是一個JavaScript的運行環境(平臺),不是一門語言,也不是JavaScript框架

二、Node.js 是全能的麼?

##2.1 Node.js擅長做的

第一大類:後臺管理系統、實時交互系統、聯網軟件、高併發量的web應用程序;
第二大類:基於web、canvas等多人聯網遊戲;
第三大類:基於web的多人實時聊天客戶端;
第四大類:單頁面瀏覽器應用程序;
第五大類:操作數據庫、爲前端和移動端提供基於json的API;
第六大類,…

就拿實時聊天客戶端來窺探下Node.js:

  1. 統一協議端口:從 IRC 開始,有許多開源或者不開源的協議都運行在非標準端口上, 使用Node.js 則統一在標準的80端口運行 WebSockets。
  1. 無需太複雜的計算:輕量級、高流量並且能良好的應對跨平臺設備上運行密集型數據。
  1. 對象數據庫接口:Node.js十分適合通過對象數據庫(object DB)來查詢數據(如 MongoDB)。以 JSON 格式存儲的數據允許 Node.js 直接處理,不需要糾結數據轉換和匹配的問題。
  1. 隊列輸入: 聊天應用要處理高量併發的數據,而Node.js的隊列輸出正解決了這個問題:在數據真正的寫入之前就承認客戶端的數據是真實的。(開發中通常的做法是,種耗時的操作通過回調函數來異步處理,主線程繼續往下執行)
  1. 數據流接收數據:我們可以在線處理正在上傳中的文件,因爲數據是通過流的形式進行接收。那麼,實時音頻和實時視頻在一個網頁上就能進行,無需再通過一個應用程序。

##2.2 Node.js不擅長做的

第一大類:使用關係型數據庫的服務端 WEB 應用;
因爲,Express.js目前還不足以支撐所有的開發需求。

第二大類:有繁重的服務端計算和處理的應用。
凡是涉及CPU密集型操作都會削弱掉 Node通過事件驅動, 異步 I/O 模型等等帶來的在吞吐量上的優勢,因爲當線程被非異步的高計算量佔用時任何傳入的請求將被阻塞。

爲什麼現在大家都在用Node.js

這個主要和Node.js的工作原理息息相關。

Node.js 最大的用武之地在於建設高性能、高擴展性的互聯網應用—因爲它能夠處理龐大的並且高吞吐量的併發連接。主要是因爲node.js的以下幾大特性:

  • event-driven 事件驅動
  • non-blocking 非阻塞的異步I/O調用
  • lightweight 省空間、省設備,輕量意味着更好的移植性
  • Node.js是跨平臺的項目,可以運行在Linux、Unix、Windows
  • efficient 高效(node.js是基於單線程)

在PHP或者JSP中,是每個新增一個連接(請求)便生成一個新的線程,這個新的線程會佔用系統內存,最終會佔掉所有的可用內存。而 Node.js 僅僅只運行在一個單線程中,使用非阻塞的異步 I/O 調用,所有連接都由該線程處理,在 libuv 的加分下,可以允許其支持數萬併發連接(全部掛在該線程的事件循環中)。

注意:Node.js也有潛在的缺陷,比如:如果所有客戶端的請求共享單一線程時也會有問題, 大量的計算可能會使得 Node 的單線程暫時失去反應, 並導致所有的其他客戶端的請求一直阻塞, 直到計算結束才恢復正常;

因此,開發時千萬不要讓一個 Exception 阻塞核心的事件循環,因爲這將導致 Node.js 的應用程序崩潰。比如在 PHP 中某個頁面掛掉是不會影響網站運行的,但是 Nodejs 是一個線程一個線程來處理所有的鏈接,因此一旦異常阻塞了都可能會影響到其他所有的鏈接。

在什麼場合下使用Node.js最好呢?

如果在你的項目需求中不包含CPU密集型操作,也不需要訪問任何阻塞的資源,那麼你就可以利用的 Node.js 的優點,盡情、快速、可擴展的去開發任何網絡應用。

因爲,Node.js 從來就不是用於解決大規模計算問題而創建的。它的出現是爲了解決大規模I/O 的問題,並且在這一點上做的非常好。

在接下來的Node.js 開發中,你會發現絕大多數問題是由誤用阻塞操作而造成的。因此,要十分小心避免這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章