自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Node.js究竟是什么?

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

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

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

 

如果你了解 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 引擎構(gòu)建的 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 引擎構(gòu)建的 JavaScript 運行時環(huán)境。” 現(xiàn)在讓我們理解剩下的兩行,這樣我們就可以找出為什么 Node.js 如此受歡迎的原因。

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

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

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

 

阻塞 I/O(左)與非阻塞 I/O(右)

阻塞 I/O

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

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

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

非阻塞 I/O

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

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

JavaScript 事件循環(huán)

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

 

  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

 

這些是由令人敬畏的社區(qū)所構(gòu)建的庫,它能解決你的大多數(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 引起了我的注意,除了V8之外,還有許多不同的 JavaScript 引擎,如 Mozilla 的 SpiderMonkey,微軟的 Chakra 等等。更多的東西可以在這里找到。

事件

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

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

在 Node.js 中寫一個 Hello World

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

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

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

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

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

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2019-07-24 11:21:18

Node.jsHTMLCSS

2011-02-16 16:13:40

Debian

2018-09-10 13:47:21

數(shù)據(jù)科學(xué)統(tǒng)計學(xué)決策

2015-09-29 09:47:14

2015-08-26 09:54:19

物聯(lián)網(wǎng)

2022-06-13 09:51:35

UWB超寬帶無線載波通信技術(shù)

2014-07-28 08:28:38

Windows

2014-08-07 10:32:02

Windows微軟

2009-07-30 14:43:30

認識BSM

2012-05-28 22:49:50

PureView

2011-08-04 13:24:28

IT運維

2020-12-17 17:33:47

MLOps大數(shù)據(jù)數(shù)據(jù)

2020-07-08 08:09:08

邊緣計算邊緣云云平臺

2021-03-08 21:44:33

以太坊區(qū)塊鏈比特幣

2021-08-09 05:19:08

Provider 前端前端代碼

2022-02-07 15:20:53

去中心化加密經(jīng)濟學(xué)加密貨幣

2014-06-27 09:35:16

機器學(xué)習(xí)

2012-09-17 09:52:20

云計算云存儲公有云

2009-09-08 18:02:49

PHP

2010-03-19 17:30:18

云計算
點贊
收藏

51CTO技術(shù)棧公眾號