node必知必會之node簡介

1.什麼是node.js

按照: Node.js官方網站主頁 的說法:前端

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

從這段介紹來看,解讀要點以下npm

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

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

2.基本原理

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

image

核心概念服務器

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 任務放到線程池裏
  • 只要有資源,就盡力執行
  • 咱們再換一個維度看一下
    image

核心架構

  1. Chrome V8 解釋並執行 JavaScript 代碼(這就是爲何瀏覽器能執行 JavaScript 緣由)
  2. libuv 由事件循環和線程池組成,負責全部 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,後面模塊章節會有更詳細的討論。

微軟在2016年宣佈在MIT許可協議下開放 Chakra 引擎,並以 ChakraCore 爲名在 Github 上開放了源代碼,ChakraCore 是一個完整的 JavaScript 虛擬機,它擁有着和 Chakra 幾乎相同的功能與特性。微軟向 Node.js 主分支提交代碼合併請求,讓 Node.js 用上 ChakraCore引擎,即 nodejs/node-chakracore 項目。實際上微軟是經過建立名爲 V8 shim 的庫的賦予了 ChakraCore 處理谷歌 Chrome V8 引擎指令的能力,其原理示意圖以下

image

目前,Node.js 同時支持這2種 JavaScript 引擎,兩者性能和特性上各有千秋,ChakraCore 在特性上感受更潮一些,曾經是第一個支持 Async函數 的引擎,但目前 Node.js 仍是以 Chrome V8 引擎爲主, ChakraCore 版本須要單獨安裝,你們瞭解一下就好。

此爲學習node的學習筆記,爲了本身學習查閱,轉自狼叔的教程,若是侵權請聯繫我刪除
閱讀原文
原文鏈接:https://cnodejs.org/topic/5ab3166be7b166bb7b9eccf7

相關文章
相關標籤/搜索