摘要:究竟是什么是一個(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)事件來自庫的核心。
Node.js究竟是什么?
Node.js是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境。聽起來不錯(cuò),但這是什么意思?這是如何運(yùn)作的?
Node運(yùn)行時(shí)環(huán)境包含執(zhí)行用JavaScript編寫的程序所需的一切。
當(dāng)JavaScript的原始開發(fā)者將它從只能在瀏覽器中運(yùn)行的東西擴(kuò)展到可以作為獨(dú)立應(yīng)用程序在機(jī)器上運(yùn)行的東西時(shí),Node.js就已經(jīng)存在。(譯者注:大意是說JavaScript不僅僅能夠再瀏覽器中運(yùn)行,還可以作為獨(dú)立應(yīng)用程序在機(jī)器上運(yùn)行)
現(xiàn)在,您可以使用JavaScript做更多的事情,而不僅僅是讓網(wǎng)站互動(dòng)。
JavaScript現(xiàn)在有能力做Python等其他腳本語言可以做的事情。
瀏覽器JavaScript和Node.js都運(yùn)行在V8 JavaScript運(yùn)行時(shí)引擎上。該引擎會(huì)將您的JavaScript代碼轉(zhuǎn)換為更快的機(jī)器代碼。機(jī)器代碼是計(jì)算機(jī)無需先解釋即可運(yùn)行的低級(jí)別代碼。
為什么Node.js?這是官方Node.js上給出的一個(gè)正式定義 網(wǎng)站:
Node.js?是一個(gè)基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運(yùn)行。Node.js使用事件驅(qū)動(dòng)的非阻塞I / O模型,使其輕量且高效。
Node.js的軟件包生態(tài)系統(tǒng)npm是全球最大的開源庫生態(tài)系統(tǒng)。
我們已經(jīng)討論過這個(gè)定義的第一行:“Node.js?是一個(gè)基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運(yùn)行。”現(xiàn)在讓我們來了解另外兩條線,以便我們了解為什么Node.js非常流行。
I / O是指輸入/輸出。它可以是從讀取/寫入本地文件到發(fā)出HTTP請(qǐng)求到API的任何內(nèi)容。
I / O需要時(shí)間并因此阻塞其他功能。
考慮一個(gè)場景,我們需要一個(gè)后臺(tái)數(shù)據(jù)庫來獲取user1和user2的詳細(xì)信息,然后將其打印在屏幕/控制臺(tái)上。對(duì)此請(qǐng)求的響應(yīng)需要時(shí)間,但兩個(gè)用戶數(shù)據(jù)請(qǐng)求可以獨(dú)立并同時(shí)執(zhí)行。
阻塞型 I / O在阻塞方法中,用戶2的數(shù)據(jù)請(qǐng)求不會(huì)啟動(dòng),直到用戶1的數(shù)據(jù)被打印到屏幕上。
如果這是一個(gè)Web服務(wù)器,我們將不得不為每個(gè)新用戶啟動(dòng)一個(gè)新線程。但是JavaScript是單線程的(不是真的,但是它有一個(gè)單線程的事件循環(huán),稍后我們會(huì)討論它)。所以這會(huì)使JavaScript不太適合多線程任務(wù)。
這就是需要非阻塞部分進(jìn)來的地方。
非阻塞 I / O另一方面,使用非阻塞請(qǐng)求,您可以在不等待響應(yīng)user1請(qǐng)求的情況下為user2啟動(dòng)數(shù)據(jù)請(qǐng)求。您可以并行發(fā)起兩個(gè)請(qǐng)求。
這種非阻塞I / O消除了多線程的需要,因?yàn)榉?wù)器可以同時(shí)處理多個(gè)請(qǐng)求。
JavaScript事件循環(huán)如果您有26分鐘,請(qǐng)觀看節(jié)點(diǎn)事件循環(huán)的出色視頻說明:
如果你沒時(shí)間,那么以下是關(guān)于JavaScript事件循環(huán)如何工作的快速分步說明。
將main()推入調(diào)用堆棧。
將console.log()推入調(diào)用堆棧。然后馬上運(yùn)行,然后彈出。
將setTimeout(2000)推入堆棧。 setTimeout(2000)是一個(gè)Node API。當(dāng)我們調(diào)用它時(shí),我們注冊(cè)事件回調(diào)對(duì)。該事件將等待2000毫秒,然后回調(diào)函數(shù)。
在API中注冊(cè)之后,setTimeout(2000)會(huì)從調(diào)用堆棧中彈出。
現(xiàn)在第二個(gè)setTimeout(0)以相同的方式被注冊(cè)。我們現(xiàn)在有兩個(gè)Node API等待執(zhí)行。
在等待0秒后,setTimeout(0)被移到回調(diào)隊(duì)列中,setTimeout(2000)也會(huì)發(fā)生同樣的情況。
在回調(diào)隊(duì)列中,函數(shù)等待調(diào)用堆棧為空,因?yàn)橹挥幸粋€(gè)語句可以執(zhí)行一次。這由事件循環(huán)來處理。
最后一個(gè)console.log()運(yùn)行,并且main()從調(diào)用棧中彈出。
事件循環(huán)看到調(diào)用堆棧是空的,并且回調(diào)隊(duì)列不是空的。因此它將回調(diào)(按先入先出的順序)移動(dòng)到調(diào)用堆棧中執(zhí)行。
npmThese 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(節(jié)點(diǎn)包管理器)包含了可以在您的應(yīng)用中使用的包,以使您的開發(fā)更快更高效。
RequireRequire 做了以下三件事:
它加載與Node.js捆綁的模塊,如文件系統(tǒng)和來自Node.js API?的HTTP。
它加載從npm安裝的第三方庫,如Express和Mongoose。
它可以require你自己的文件和模塊化項(xiàng)目。
Require是一個(gè)函數(shù),它接受一個(gè)參數(shù)“path”并返回module.exports。
Node Modules節(jié)點(diǎn)模塊是可重用的代碼塊,其存在不會(huì)意外地影響其他代碼。
您可以編寫自己的模塊并將其用于各種應(yīng)用程序。 Node.js有一組內(nèi)置模塊,您可以使用它們而無需進(jìn)一步安裝。
V8通過利用C ++來增強(qiáng)JavaScript的性能V8是一個(gè)用C ++編寫的開源運(yùn)行時(shí)引擎。
JavaScript -> V8(C++) -> Machine Code
V8按照ECMA-262的規(guī)定實(shí)現(xiàn)一個(gè)名為ECMAScript的腳本。 ECMAScript由Ecma International創(chuàng)建,用于標(biāo)準(zhǔn)化JavaScript。
V8可以獨(dú)立運(yùn)行,也可以嵌入到任何C ++應(yīng)用程序中。它有一些鉤子,可以讓你編寫自己的C ++代碼,使其可以提供給JavaScript。
這基本上可以讓您通過將V8嵌入到C ++代碼中來為JavaScript添加功能,以便您的C ++代碼理解的不僅僅是ECMAScript標(biāo)準(zhǔn)另有指定。
Events我們的應(yīng)用中發(fā)生了一些我們可以回應(yīng)的事情。節(jié)點(diǎn)中有兩種類型的事件。
系統(tǒng)事件:來自libuv庫的C ++核心。 (例如,讀完一個(gè)文件)。
自定義事件:JavaScript核心。
在Node.js中編寫Hello World我們必須這樣做,不是嗎?
制作一個(gè)文件app.js并添加以下內(nèi)容。
console.log("Hello World!");
打開節(jié)點(diǎn)終端,將目錄更改為保存文件的文件夾并運(yùn)行節(jié)點(diǎn)app.js. Bam - 你剛剛在Node.js中編寫了Hello World。
您可以通過freeCodeCamp.org來獲取使用大量的資源來了解關(guān)于Node.js的更多信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/113258.html
摘要:究竟是什么是一個(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)事件來自庫的核心。 Node.js究竟是什么? Node.js是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境。聽起來不錯(cuò),但這是什么意思?這是如何運(yùn)作的? Node運(yùn)行時(shí)環(huán)境包含執(zhí)...
摘要:當(dāng)某個(gè)執(zhí)行完畢時(shí),將以事件的形式通知執(zhí)行操作的線程,線程執(zhí)行這個(gè)事件的回調(diào)函數(shù)。為了處理異步,線程必須有事件循環(huán),不斷的檢查有沒有未處理的事件,依次予以處理。另外,單線程帶來的好處,操作系統(tǒng)完全不再有線程創(chuàng)建銷毀的時(shí)間開銷。 前言 如果你有一定的前端基礎(chǔ),比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能讓你以最低的成本快速過渡成為一個(gè)全棧工程師(我稱...
摘要:在回調(diào)隊(duì)列中,函數(shù)等待調(diào)用棧為空,因?yàn)槊總€(gè)語句都執(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)境。聽起來還不錯(cuò),不過這究竟...
摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...
閱讀 2128·2021-09-27 14:04
閱讀 1873·2019-08-30 15:55
閱讀 1698·2019-08-30 13:13
閱讀 1065·2019-08-30 13:07
閱讀 2742·2019-08-29 15:20
閱讀 3239·2019-08-29 12:42
閱讀 3323·2019-08-28 17:58
閱讀 3593·2019-08-28 17:56