Node.js究竟是什麼?

Node.js是一個JavaScript運行時環境。聽起來不錯,但這是什麼意思?這是如何運作的?

Node.js究竟是什麼?

Node運行時環境包含執行用JavaScript編寫的程序所需的一切。

Node.js究竟是什麼?

當JavaScript的原始開發者將它從只能在瀏覽器中運行的東西擴展到可以作為獨立應用程序在機器上運行的東西時,Node.js就已經存在。(譯者注:大意是說JavaScript不僅僅能夠再瀏覽器中運行,還可以作為獨立應用程序在機器上運行)

現在,您可以使用JavaScript做更多的事情,而不僅僅是讓網站互動。

JavaScript現在有能力做Python等其他腳本語言可以做的事情。

瀏覽器JavaScript和Node.js都運行在V8 JavaScript運行時引擎上。該引擎會將您的JavaScript代碼轉換為更快的機器代碼。機器代碼是計算機無需先解釋即可運行的低級別代碼。

為什麼Node.js?

這是官方Node.js上給出的一個正式定義 網站:

Node.js®是一個基於Chrome的V8 JavaScript引擎構建的JavaScript運行。

Node.js使用事件驅動的非阻塞I / O模型,使其輕量且高效。

Node.js的軟件包生態系統npm是全球最大的開源庫生態系統。

我們已經討論過這個定義的第一行:“Node.js®是一個基於Chrome的V8 JavaScript引擎構建的JavaScript運行。”現在讓我們來了解另外兩條線,以便我們瞭解為什麼Node.js非常流行。

I / O是指輸入/輸出。它可以是從讀取/寫入本地文件到發出HTTP請求到API的任何內容。

I / O需要時間並因此阻塞其他功能。

考慮一個場景,我們需要一個後臺數據庫來獲取user1和user2的詳細信息,然後將其打印在屏幕/控制檯上。對此請求的響應需要時間,但兩個用戶數據請求可以獨立並同時執行。

Node.js究竟是什麼?

阻塞型 I / O

在阻塞方法中,用戶2的數據請求不會啟動,直到用戶1的數據被打印到屏幕上。

如果這是一個Web服務器,我們將不得不為每個新用戶啟動一個新線程。但是JavaScript是單線程的(不是真的,但是它有一個單線程的事件循環,稍後我們會討論它)。所以這會使JavaScript不太適合多線程任務。

這就是需要非阻塞部分進來的地方。

非阻塞 I / O

另一方面,使用非阻塞請求,您可以在不等待響應user1請求的情況下為user2啟動數據請求。您可以並行發起兩個請求。

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

JavaScript事件循環

如果您有26分鐘,請觀看節點事件循環的出色視頻說明:

如果你沒時間,那麼以下是關於JavaScript事件循環如何工作的快速分步說明。

Node.js究竟是什麼?

  1. 將main()推入調用堆棧。

  2. 將console.log()推入調用堆棧。然後馬上運行,然後彈出。

  3. 將setTimeout(2000)推入堆棧。 setTimeout(2000)是一個Node API。當我們調用它時,我們註冊事件回調對。該事件將等待2000毫秒,然後回調函數。

  4. 在API中註冊之後,setTimeout(2000)會從調用堆棧中彈出。

  5. 現在第二個setTimeout(0)以相同的方式被註冊。我們現在有兩個Node API等待執行。

  6. 在等待0秒後,setTimeout(0)被移到回調隊列中,setTimeout(2000)也會發生同樣的情況。

  7. 在回調隊列中,函數等待調用堆棧為空,因為只有一個語句可以執行一次。這由事件循環來處理。

  8. 最後一個console.log()運行,並且main()從調用棧中彈出。

  9. 事件循環看到調用堆棧是空的,並且回調隊列不是空的。因此它將回調(按先入先出的順序)移動到調用堆棧中執行。

npm

Node.js究竟是什麼?

These are libraries built by the awesome community which will solve most of your generic problems. npm (Node package manager) has packages you can use in your apps to make your development faster and efficient.

這些是由_awesome community_建立的庫,它將解決大部分通用問題。 npm(節點包管理器)包含了可以在您的應用中使用的包,以使您的開發更快更高效。

Require

Require 做了以下三件事:

  • 它加載與Node.js捆綁的模塊,如文件系統和來自Node.js API 的HTTP。

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

  • 它可以require你自己的文件和模塊化項目。

Require是一個函數,它接受一個參數“path”並返回module.exports。

Node Modules

節點模塊是可重用的代碼塊,其存在不會意外地影響其他代碼。

您可以編寫自己的模塊並將其用於各種應用程序。 Node.js有一組內置模塊,您可以使用它們而無需進一步安裝。

V8通過利用C ++來增強JavaScript的性能

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

JavaScript -> V8(C++) -> Machine Code

V8按照ECMA-262的規定實現一個名為ECMAScript的腳本。 ECMAScript由Ecma International創建,用於標準化JavaScript。

V8可以獨立運行,也可以嵌入到任何C ++應用程序中。它有一些鉤子,可以讓你編寫自己的C ++代碼,使其可以提供給JavaScript。

這基本上可以讓您通過將V8嵌入到C ++代碼中來為JavaScript添加功能,以便您的C ++代碼理解的不僅僅是ECMAScript標準另有指定。

Events

我們的應用中發生了一些我們可以回應的事情。節點中有兩種類型的事件。

  • 系統事件:來自libuv庫的C ++核心。 (例如,讀完一個文件)。

  • 自定義事件:JavaScript核心。

在Node.js中編寫Hello World

我們必須這樣做,不是嗎?

製作一個文件app.js並添加以下內容。

console.log("Hello World!");

打開節點終端,將目錄更改為保存文件的文件夾並運行節點app.js. Bam - 你剛剛在Node.js中編寫了Hello World。


分享到:


相關文章: