按照: 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
大多數人都認爲 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 瀏覽器中被使用。網絡
梳理一下多線程
核心架構
在解決併發問題上,異步是最好的解決方案,能夠拿排隊和叫號機來理解併發
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 引擎指令的能力,其原理示意圖以下
目前,Node.js 同時支持這2種 JavaScript 引擎,兩者性能和特性上各有千秋,ChakraCore 在特性上感受更潮一些,曾經是第一個支持 Async函數 的引擎,但目前 Node.js 仍是以 Chrome V8 引擎爲主, ChakraCore 版本須要單獨安裝,你們瞭解一下就好。
此爲學習node的學習筆記,爲了本身學習查閱,轉自狼叔的教程,若是侵權請聯繫我刪除
閱讀原文
原文鏈接:https://cnodejs.org/topic/5ab3166be7b166bb7b9eccf7