Node.js 究竟是什么字旭?

Node.js 是一個 JavaScript 運行時環(huán)境。聽起來還不錯崖叫,不過這究竟意味著什么遗淳?它又是如何運作的?

Node 運行時環(huán)境包含執(zhí)行 JavaScript 程序所需要的一切心傀。

image

<figcaption style="margin: 10px 0px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; line-height: inherit; text-align: center; color: rgb(153, 153, 153); font-size: 0.7em;">如果你了解 Java 的話屈暗,會發(fā)現(xiàn)它們有點像</figcaption>

如果你了解 Java 的話,會發(fā)現(xiàn)它們有點像脂男。

JavaScript 原來是只能在瀏覽器中運行的养叛,當把它擴展成為可以在你的計算機上作為獨立的程序運行時,Node.js 就出現(xiàn)了宰翅。

現(xiàn)在你可以用 JavaScript 做更多的事情弃甥,而不僅僅是用在網(wǎng)站的互動和特效上。

JavaScript 現(xiàn)在能夠去做其他腳本語言(如Python)可以執(zhí)行的操作汁讼。

你 Chrome 瀏覽器中的 JavaScript 和 Node.js 都在 V8 引擎上運行淆攻。該引擎將你的 JavaScript 代碼轉(zhuǎn)換為更快的機器代碼肮之。機器代碼是低級代碼,計算機可以直接運行而無需先解釋它卜录。

為什么選擇 Node.js戈擒?

這是 Node.js 官方網(wǎng)站上給出的正式定義:

Node.js?是基于 Chrome 的 V8 JavaScript 引擎構建的 JavaScript 運行時環(huán)境。

Node.js 使用事件驅(qū)動的非阻塞 I/O模型艰毒,輕量且高效筐高。

Node.js 的包生態(tài)系統(tǒng) npm 是世界上最大的開源庫生態(tài)系統(tǒng)。

我們在前面已經(jīng)討論過了這個定義的第一行:“Node.js?是基于 Chrome 的 V8 JavaScript 引擎【https://developers.google.com/v8/】構建的 JavaScript 運行時環(huán)境丑瞧「掏粒” 現(xiàn)在讓我們理解剩下的兩行,這樣我們就可以找出為什么 Node.js 如此受歡迎的原因绊汹。

I/O 指的是輸入/輸出稽屏。它可以是從讀取/寫入本地文件到向 API 發(fā)出 HTTP 的任何內(nèi)容。

I/O 需要時間西乖,因此會阻止其他函數(shù)狐榔。

考慮一下這種情況,我們需要通過請求后端數(shù)據(jù)庫來獲取 user1 和 user2 的詳細信息获雕,然后在屏幕或控制臺上打印它們薄腻。對該請求的響應需要時間,但是兩個用戶數(shù)據(jù)的請求可以獨立地同時執(zhí)行届案。

image

<figcaption style="margin: 10px 0px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; line-height: inherit; text-align: center; color: rgb(153, 153, 153); font-size: 0.7em;">阻塞 I/O(左)與非阻塞 I/O(右)</figcaption>

阻塞 I/O

在阻塞方法中庵楷,在 user1 的數(shù)據(jù)被輸出到屏幕之前,不會啟動 user2 的數(shù)據(jù)請求楣颠。

如果這是一個Web服務器尽纽,我們必須為每個新用戶啟動一個新線程。但 JavaScript 是單線程的(實際上不是真的童漩,但它有一個單線程的事件循環(huán)弄贿,我們稍后會討論)。所以這會使 JavaScript 不太適合多線程任務睁冬。

這就是非阻塞的用武之地挎春。

非阻塞 I/O

另一方面,如果用非阻塞請求豆拨,可以在為 user2 發(fā)起數(shù)據(jù)請求時直奋,無需先等待對 user1 請求的響應。你可以并行啟動這兩個請求施禾。

這種非阻塞 I/O 消除了對多線程的需要脚线,因為服務器可以同時處理多個請求。

JavaScript 事件循環(huán)

以下是 JavaScript 事件循環(huán)工作原理簡要的逐步描述弥搞。

image

<figcaption style="margin: 10px 0px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; line-height: inherit; text-align: center; color: rgb(153, 153, 153); font-size: 0.7em;">JavaScript 事件循環(huán)</figcaption>

  1. main() 送入調(diào)用棧邮绿。

  2. console.log() 送入調(diào)用棧渠旁。然后立即運行并彈出。

  3. setTimeout(2000) 送入棧船逮。 setTimeout(2000)是一個 Node API顾腊。在調(diào)用它時,先注冊事件回調(diào)挖胃。事件將等待 2000 毫秒杂靶,然后回調(diào)這個函數(shù)。

  4. 在 API 中注冊后酱鸭,setTimeout(2000) 從調(diào)用堆棧中彈出吗垮。

  5. 現(xiàn)在第二個 setTimeout(0) 以相同的方式注冊。我們現(xiàn)在有兩個 Node API 等待執(zhí)行凹髓。

  6. 等待 0 秒后烁登,setTimeout(0) 被移動到回調(diào)隊列,同樣的事情發(fā)生在 setTimeout(2000)蔚舀。

  7. 在回調(diào)隊列中饵沧,函數(shù)等待調(diào)用棧為空,因為每個語句都執(zhí)行一次蝗敢。這由事件循環(huán)處理捷泞。

  8. 最后一個 console.log() 運行足删,并且 main() 從調(diào)用棧中彈出寿谴。

  9. 如果事件循環(huán)檢測到到調(diào)用堆棧為空且回調(diào)隊列不為空。它將回調(diào)(以先進先出順序)移動到調(diào)用棧并執(zhí)行失受。

npm

image

<figcaption style="margin: 10px 0px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; line-height: inherit; text-align: center; color: rgb(153, 153, 153); font-size: 0.7em;">npm</figcaption>

這些是由令人敬畏的社區(qū)所構建的庫讶泰,它能解決你的大多數(shù)的常規(guī)問題。 npm(Node package manager))中有很多可以用在你的程序中包拂到,可以使你的開發(fā)更快更有效痪署。

Require

Require 做三件事:

  • 它從 Node.js API 加載與 Node.js 捆綁在一起的模塊,如文件系統(tǒng)和 HTTP 等兄旬。

  • 它加載從 npm 安裝的第三方庫狼犯,如 Express 和 Mongoose 等。

  • 它允許你 require 自己的文件并把項目模塊化领铐。

Require 是一個函數(shù)悯森,它接受參數(shù) “path” 并返回 module.exports

Node 模塊

Node 模塊是一個可重用的代碼塊绪撵,它的存在不會對其他代碼產(chǎn)生意外地影響瓢姻。

你可以編寫自己的模塊并在各種程序中使用它。 Node.js 有一組內(nèi)置模塊音诈,無需進一步安裝即可使用幻碱。

V8 通過利用 C++ 來加速 JavaScript

V8 是一個用 C++ 編寫的開源運行時引擎绎狭。

JavaScript => V8(C ++)=> 機器碼

V8 實現(xiàn)了 ECMA-262 中指定的名為 ECMAScript 的腳本。 ECMAScript 由 Ecma International 創(chuàng)建褥傍,用于標準化JavaScript儡嘶。

V8 可以獨立運行,也可以嵌入到任何 C++ 程序中恍风。它有一些鉤子社付,允許你編寫自己的C++代碼供 JavaScript 使用。

這實際上允許你通過將 V8 嵌入到 C++ 代碼中來向 JavaScript 添加功能邻耕,以便使你的 C++ 代碼實現(xiàn)比 ECMAScript 標準更多的功能鸥咖。

正如 Greg Bulmash 【https://medium.com/@gregbulmash】引起了我的注意,除了V8之外兄世,還有許多不同的 JavaScript 引擎啼辣,如 Mozilla 的 SpiderMonkey,微軟的 Chakra 等等御滩。更多的東西可以在這里找到鸥拧。

事件

事件指的是我們可以對在程序中發(fā)生的事情作出回應。Node 中有兩種類型的事件削解。

  • 系統(tǒng)事件:來自用 C++ 實現(xiàn)的基于 libuv 庫的內(nèi)核富弦。(例如,讀取文件完畢)氛驮。

  • 自定義事件:JavaScript 核心腕柜。

在 Node.js 中寫一個 Hello World

創(chuàng)建文件 app.js 并將以下內(nèi)容添加到其中。

1console.log("Hello World!");

打開終端矫废,將目錄切換到保存文件的文件夾盏缤,然后運行 node app.js

就這么簡單蓖扑,你在 Node.js 中寫的 “Hello World” 跑起來了唉铜。

最后,你可以通過互聯(lián)網(wǎng)上的大量資源去了解關于 Node.js 的更多信息律杠。

原文:https://medium.freecodecamp.org/the-definitive-node-js-handbook-6912378afc6e

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潭流,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柜去,更是在濱河造成了極大的恐慌灰嫉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡蜓,死亡現(xiàn)場離奇詭異熬甫,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門椿肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞻颂,“玉大人,你說我怎么就攤上這事郑象」闭猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵厂榛,是天一觀的道長盖矫。 經(jīng)常有香客問我,道長击奶,這世上最難降的妖魔是什么辈双? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮柜砾,結果婚禮上湃望,老公的妹妹穿的比我還像新娘。我一直安慰自己痰驱,他們只是感情好证芭,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著担映,像睡著了一般废士。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝇完,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天官硝,我揣著相機與錄音,去河邊找鬼四敞。 笑死泛源,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忿危。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼没龙,長吁一口氣:“原來是場噩夢啊……” “哼铺厨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起硬纤,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤解滓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筝家,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洼裤,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年溪王,在試婚紗的時候發(fā)現(xiàn)自己被綠了腮鞍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值骇。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖移国,靈堂內(nèi)的尸體忽然破棺而出吱瘩,到底是詐尸還是另有隱情,我是刑警寧澤迹缀,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布使碾,位于F島的核電站,受9級特大地震影響祝懂,放射性物質(zhì)發(fā)生泄漏票摇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一砚蓬、第九天 我趴在偏房一處隱蔽的房頂上張望兄朋。 院中可真熱鬧,春花似錦怜械、人聲如沸颅和。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡扩。三九已至,卻和暖如春障本,著一層夾襖步出監(jiān)牢的瞬間教届,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工驾霜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留案训,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓粪糙,卻偏偏與公主長得像强霎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓉冈,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容