深刻理解NodeJs

一、Node.js簡介前端

Node.js 誕生於 2009 年,由 Joyent 的員工 Ryan Dahl 開發而成,以後 Joyent 公司一直扮演着 Node.js 孵化者的角色。Node.js基金會的創始成員包括 Google、Joyent、IBM、Paypal、微軟、Fidelity 和 Linux基金會,創始成員將共同掌管過去由 Joyent 一家企業掌控的 Node.js 開源項目。此後,Node.js基金會發展很是好,穩定的發佈五、六、七、8等版本,截止發稿最新版本已是8.6,長期支持版本是6.11。vue

Node.js 不是一門語言也不是框架,它只是基於 Google V8 引擎的 JavaScript 運行時環境,同時結合 Libuv 擴展了 JavaScript 功能,使之支持 io、fs 等只有語言纔有的特性,使得 JavaScript 可以同時具備 DOM 操做(瀏覽器)和 I/O、文件讀寫、操做數據庫(服務器端)等能力,是目前最簡單的全棧式語言。react

目前 Node.js 在大部分領域都佔有一席之地,尤爲是 I/O 密集型的,好比 Web 開發,微服務,前端構建等。很多大型網站都是使用 Node.js 做爲後臺開發語言的,用的最多的就是使用Node.js作前端渲染和架構優化,好比 淘寶 雙11、去哪兒網 的 PC 端核心業務等。另外,有很多知名的前端庫也是使用 Node.js 開發的,好比,Webpack 是一個強大的打包器,React/Vue 是成熟的前端組件化框架。webpack

Node.js一般被用來開發低延遲的網絡應用,也就是那些須要在服務器端環境和前端實時收集和交換數據的應用(API、即時聊天、微服務)。阿里巴巴、騰訊、Qunar、百度、PayPal、道瓊斯、沃爾瑪和 LinkedIn 都採用了 Node.js 框架搭建應用。git

Node.js 編寫的包管理器 npm 已成爲開源包管理了領域最好的生態,直接到2017年10月份,有模塊超過47萬,每週下載量超過32億次,每月有超過700萬開發者使用npm。github

Node.js 常常被人們吐槽的一點就是:回調太多難於控制(俗稱回調地獄)和 CPU 密集任務處理的不是很好。可是,目前異步流程技術已經取得了很是不錯的進步,從Callback、Promise 到 Async函數,能夠輕鬆的知足全部開發需求。web

二、什麼是Node.js數據庫

Nodejs官方介紹是:npm

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 不是 JavaScript 應用,不是語言(JavaScript 是語言),不是像 Rails(Ruby)、 Laravel(PHP) 或 Django(Python) 同樣的框架,也不是像 Nginx 同樣的 Web 服務器。Node.js 是 JavaScript 運行時環境
  • 構建在 Chrome’s V8 這個著名的 JavaScript 引擎之上,Chrome V8 引擎以 C/C++ 爲主,至關於使用JavaScript 寫法,轉成 C/C++ 調用,大大的下降了學習成本
  • 事件驅動(event-driven),非阻塞 I/O 模型(non-blocking I/O model),簡單點講就是每一個函數都是異步的,最後由 Libuv 這個 C/C++ 編寫的事件循環處理庫來處理這些 I/O 操做,隱藏了非阻塞 I/O 的具體細節,簡化併發編程模型,讓你能夠輕鬆的編寫高性能的Web應用,因此它是輕量(lightweight)且高效(efficient)的
  • 使用 npm 做爲包管理器,目前 npm 是開源庫裏包管理最大的生態,功能強大,截止到2017年12月,模塊數量超過 60 萬+

大多數人都認爲 Node.js 只能寫網站後臺或者前端工具,這實際上是不全面的,Node.js的目標是讓併發編程更簡單,主要應用在以網絡編程爲主的 I/O 密集型應用。它是開源的,跨平臺,而且高效(尤爲是I/O處理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃爾瑪及GoDaddy都是 Node.js 的用戶。編程

 

三、基本原理

Node.js 早期的架構圖,來自 Node.js 之父 Ryan Dahl 的演講稿,在今天依然不過期,它簡要的介紹了 Node.js 是基於 Chrome V8引擎構建的,由事件循環(Event Loop)分發 I/O 任務,最終工做線程(Work Thread)將任務丟到線程池(Thread Pool)裏去執行,而事件循環只要等待執行結果就能夠了。

核心概念

  • Chrome V8 是 Google 發佈的開源 JavaScript 引擎,採用 C/C++ 編寫,在 Google 的 Chrome 瀏覽器中被使用。Chrome V8 引擎能夠獨立運行,也能夠用來嵌入到 C/C++ 應用程序中執行。
  • Event Loop 事件循環(由 libuv 提供)
  • Thread Pool 線程池(由 libuv 提供)

總結:

  • Chrome V8 是 JavaScript 引擎
  • Node.js 內置 Chrome V8 引擎,因此它使用的 JavaScript 語法
  • JavaScript 語言的一大特色就是單線程,也就是說,同一個時間只能作一件事
  • 單線程就意味着,全部任務須要排隊,前一個任務結束,纔會執行後一個任務。若是前一個任務耗時很長,後一個任務就不得不一直等着。
  • 若是排隊是由於計算量大,CPU 忙不過來,倒也算了,可是不少時候 CPU 是閒着的,由於 I/O 很慢,不得不等着結果出來,再往下執行
  • CPU 徹底能夠無論 I/O 設備,掛起處於等待中的任務,先運行排在後面的任務
  • 將等待中的 I/O 任務放到 Event Loop 裏
  • 由 Event Loop 將 I/O 任務放到線程池裏
  • 只要有資源,就盡力執行

Node.js 其實就是幫咱們構建相似的機制。咱們在寫代碼的時候,實際上就是取號的過程,由 Event Loop 來接受處理,而真正執行操做的是具體的線程池裏的 I/O 任務。之因此說 Node.js 是單線程,就是由於在接受任務的時候是單線程的,它無需進程/線程切換上下文的成本,很是高效,但它在執行具體任務的時候是多線程的。

Node.js 公開宣稱的目標是 「旨在提供一種簡單的構建可伸縮網絡程序的方法」,毫無疑問,它確實作到了。這種作法將併發編程模型簡化了,Event Loop和具體線程池等細節被 Node.js 封裝了,繼而將異步調用 Api 寫法暴露給開發者。真是福禍相依,一方面簡化了併發編程,另外一方面在寫法上埋下了禍根,這種作法的好處是能讓更多人垂手可得的寫出高性能的程序!

在Node.js Bindings層作的事兒就是將 Chrome V8 等暴露的 C/C++ 接口轉成JavaScript Api,而且結合這些 Api 編寫了 Node.js 標準庫,全部這些 Api 統稱爲 Node.js SDK,後面模塊章節會有更詳細的討論。

相關文章
相關標籤/搜索