成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 究竟是什么?

yeyan1996 / 3131人閱讀

摘要:在回調(diào)隊(duì)列中,函數(shù)等待調(diào)用棧為空,因?yàn)槊總€(gè)語(yǔ)句都執(zhí)行一次。最后一個(gè)運(yùn)行,并且從調(diào)用棧中彈出。它將回調(diào)以先進(jìn)先出順序移動(dòng)到調(diào)用棧并執(zhí)行。

翻譯:瘋狂的技術(shù)宅
原文: https://medium.freecodecamp.o...

本文首發(fā)微信公眾號(hào):前端先鋒
歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章

Node.js 是一個(gè) JavaScript 運(yùn)行時(shí)環(huán)境。聽(tīng)起來(lái)還不錯(cuò),不過(guò)這究竟意味著什么?它又是如何運(yùn)作的?

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

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

JavaScript 原來(lái)是只能在瀏覽器中運(yùn)行的,當(dāng)把它擴(kuò)展成為可以在你的計(jì)算機(jī)上作為獨(dú)立的程序運(yùn)行時(shí),Node.js 就出現(xiàn)了。

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

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

你 Chrome 瀏覽器中的 JavaScript 和 Node.js 都在 V8 引擎上運(yùn)行。該引擎將你的 JavaScript 代碼轉(zhuǎn)換為更快的機(jī)器代碼。機(jī)器代碼是低級(jí)代碼,計(jì)算機(jī)可以直接運(yùn)行而無(wú)需先解釋它。

為什么選擇 Node.js?

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

Node.js?是基于 Chrome 的 V8 JavaScript 引擎構(gòu)建的 JavaScript 運(yùn)行時(shí)環(huán)境。

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

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

我們?cè)谇懊嬉呀?jīng)討論過(guò)了這個(gè)定義的第一行:“Node.js?是基于 Chrome 的 V8 JavaScript 引擎構(gòu)建的 JavaScript 運(yùn)行時(shí)環(huán)境。” 現(xiàn)在讓我們理解剩下的兩行,這樣我們就可以找出為什么 Node.js 如此受歡迎的原因。

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

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

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

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

阻塞 I/O

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

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

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

非阻塞 I/O

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

這種非阻塞 I/O 消除了對(duì)多線程的需要,因?yàn)榉?wù)器可以同時(shí)處理多個(gè)請(qǐng)求。

JavaScript 事件循環(huán)

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

main() 送入調(diào)用棧。

console.log() 送入調(diào)用棧。然后立即運(yùn)行并彈出。

setTimeout(2000) 送入棧。 setTimeout(2000)是一個(gè) Node API。在調(diào)用它時(shí),先注冊(cè)事件回調(diào)。事件將等待 2000 毫秒,然后回調(diào)這個(gè)函數(shù)。

在 API 中注冊(cè)后,setTimeout(2000) 從調(diào)用堆棧中彈出。

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

等待 0 秒后,setTimeout(0) 被移動(dòng)到回調(diào)隊(duì)列,同樣的事情發(fā)生在 setTimeout(2000)。

在回調(diào)隊(duì)列中,函數(shù)等待調(diào)用棧為空,因?yàn)槊總€(gè)語(yǔ)句都執(zhí)行一次。這由事件循環(huán)處理。

最后一個(gè) console.log() 運(yùn)行,并且 main() 從調(diào)用棧中彈出。

如果事件循環(huán)檢測(cè)到到調(diào)用堆棧為空且回調(diào)隊(duì)列不為空。它將回調(diào)(以先進(jìn)先出順序)移動(dòng)到調(diào)用棧并執(zhí)行。

npm

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

Require

Require 做三件事:

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

它加載從 npm 安裝的第三方庫(kù),如 Express 和 Mongoose 等。

它允許你 require 自己的文件并把項(xiàng)目模塊化。

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

Node 模塊

Node 模塊是一個(gè)可重用的代碼塊,它的存在不會(huì)對(duì)其他代碼產(chǎn)生意外地影響。

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

V8 通過(guò)利用 C++ 來(lái)加速 JavaScript

V8 是一個(gè)用 C++ 編寫的開(kāi)源運(yùn)行時(shí)引擎。

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

V8 實(shí)現(xiàn)了 ECMA-262 中指定的名為 ECMAScript 的腳本。 ECMAScript 由 Ecma International 創(chuàng)建,用于標(biāo)準(zhǔn)化JavaScript。

V8 可以獨(dú)立運(yùn)行,也可以嵌入到任何 C++ 程序中。它有一些鉤子,允許你編寫自己的C++代碼供 JavaScript 使用。

這實(shí)際上允許你通過(guò)將 V8 嵌入到 C++ 代碼中來(lái)向 JavaScript 添加功能,以便使你的 C++ 代碼實(shí)現(xiàn)比 ECMAScript 標(biāo)準(zhǔn)更多的功能。

正如 Greg Bulmash 引起了我的注意,除了V8之外,還有許多不同的 JavaScript 引擎,如 Mozilla 的 SpiderMonkey,微軟的 Chakra 等等。更多的東西可以在這里找到。

事件

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

系統(tǒng)事件:來(lái)自用 C++ 實(shí)現(xiàn)的基于 libuv 庫(kù)的內(nèi)核。(例如,讀取文件完畢)。

自定義事件:JavaScript 核心。

在 Node.js 中寫一個(gè) Hello World

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

console.log("Hello World!");

打開(kāi)終端,將目錄切換到保存文件的文件夾,然后運(yùn)行 node app.js。

就這么簡(jiǎn)單,你在 Node.js 中寫的 “Hello World” 跑起來(lái)了。

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

本文首發(fā)微信公眾號(hào):前端先鋒 歡迎掃描二維碼關(guān)注公眾號(hào),每天都給你推送新鮮的前端技術(shù)文章

歡迎繼續(xù)閱讀本專欄其它高贊文章:

12個(gè)令人驚嘆的CSS實(shí)驗(yàn)項(xiàng)目

必須要會(huì)的 50 個(gè)React 面試題

世界頂級(jí)公司的前端面試都問(wèn)些什么

11 個(gè)最好的 JavaScript 動(dòng)態(tài)效果庫(kù)

CSS Flexbox 可視化手冊(cè)

從設(shè)計(jì)者的角度看 React

過(guò)節(jié)很無(wú)聊?還是用 JavaScript 寫一個(gè)腦力小游戲吧!

CSS粘性定位是怎樣工作的

一步步教你用HTML5 SVG實(shí)現(xiàn)動(dòng)畫效果

程序員30歲前月薪達(dá)不到30K,該何去何從

14個(gè)最好的 JavaScript 數(shù)據(jù)可視化庫(kù)

8 個(gè)給前端的頂級(jí) VS Code 擴(kuò)展插件

Node.js 多線程完全指南

把HTML轉(zhuǎn)成PDF的4個(gè)方案及實(shí)現(xiàn)

更多文章...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109801.html

相關(guān)文章

  • Node.js竟是什么

    摘要:究竟是什么是一個(gè)運(yùn)行時(shí)環(huán)境。對(duì)此請(qǐng)求的響應(yīng)需要時(shí)間,但兩個(gè)用戶數(shù)據(jù)請(qǐng)求可以獨(dú)立并同時(shí)執(zhí)行。所以這會(huì)使不太適合多線程任務(wù)。這種非阻塞消除了多線程的需要,因?yàn)榉?wù)器可以同時(shí)處理多個(gè)請(qǐng)求。該事件將等待毫秒,然后回調(diào)函數(shù)。系統(tǒng)事件來(lái)自庫(kù)的核心。 Node.js究竟是什么? Node.js是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境。聽(tīng)起來(lái)不錯(cuò),但這是什么意思?這是如何運(yùn)作的? Node運(yùn)行時(shí)環(huán)境包含執(zhí)...

    miracledan 評(píng)論0 收藏0
  • Node.js竟是什么

    摘要:究竟是什么是一個(gè)運(yùn)行時(shí)環(huán)境。對(duì)此請(qǐng)求的響應(yīng)需要時(shí)間,但兩個(gè)用戶數(shù)據(jù)請(qǐng)求可以獨(dú)立并同時(shí)執(zhí)行。所以這會(huì)使不太適合多線程任務(wù)。這種非阻塞消除了多線程的需要,因?yàn)榉?wù)器可以同時(shí)處理多個(gè)請(qǐng)求。該事件將等待毫秒,然后回調(diào)函數(shù)。系統(tǒng)事件來(lái)自庫(kù)的核心。 Node.js究竟是什么? Node.js是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境。聽(tīng)起來(lái)不錯(cuò),但這是什么意思?這是如何運(yùn)作的? Node運(yùn)行時(shí)環(huán)境包含執(zhí)...

    dingding199389 評(píng)論0 收藏0
  • 來(lái),告訴你Node.js竟是什么?

    摘要:當(dāng)某個(gè)執(zhí)行完畢時(shí),將以事件的形式通知執(zhí)行操作的線程,線程執(zhí)行這個(gè)事件的回調(diào)函數(shù)。為了處理異步,線程必須有事件循環(huán),不斷的檢查有沒(méi)有未處理的事件,依次予以處理。另外,單線程帶來(lái)的好處,操作系統(tǒng)完全不再有線程創(chuàng)建銷毀的時(shí)間開(kāi)銷。 前言 如果你有一定的前端基礎(chǔ),比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能讓你以最低的成本快速過(guò)渡成為一個(gè)全棧工程師(我稱...

    Jonathan Shieber 評(píng)論0 收藏0
  • 「譯」JavaScript 竟是如何工作的?(第一部分)

    摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國(guó)際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...

    Youngdze 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<