了解 Node.js,這是一個(gè)用于構(gòu)建服務(wù)器端或桌面應(yīng)用程序的 JavaScript 運(yùn)行時(shí)。
JavaScript 和 Node.js
Javascript 自 1995 年以來就已經(jīng)存在,并已成為 Web 開發(fā)的主要語言。在其生命的大部分時(shí)間里,JavaScript 主要用于<script>
在 Web 瀏覽器中執(zhí)行的標(biāo)簽內(nèi)的客戶端腳本。這種限制意味著開發(fā)人員經(jīng)常在 Web 應(yīng)用程序的前端(客戶端)和后端(服務(wù)器端)方面使用多種不同的語言和框架工作。
盡管還有其他項(xiàng)目將 JavaScript 引入服務(wù)器端應(yīng)用程序,但隨著 2009 年 Node.js 的推出,該功能開始發(fā)揮作用。Node 允許開發(fā)人員編寫直接在計(jì)算機(jī)進(jìn)程本身而不是瀏覽器中運(yùn)行的 JavaScript 代碼。因此,Node 可用于編寫服務(wù)器端應(yīng)用程序,以訪問操作系統(tǒng)、文件系統(tǒng)以及構(gòu)建全功能應(yīng)用程序所需的一切。
Node.js 是用 C、C++ 和 JavaScript 編寫的,它建立在開源V8?JavaScript 引擎之上,該引擎還支持 Google Chrome 等瀏覽器中的 JS。由于 V8 支持 JavaScript 中的新功能,它們被合并到 Node.js 中。
特定于節(jié)點(diǎn)的功能
全局變量
Node 提供對幾個(gè)重要的全局對象的訪問,以便與 Node 程序文件一起使用。在編寫將在 Node 環(huán)境中運(yùn)行的文件時(shí),這些變量將可以在文件的全局范圍內(nèi)訪問。
module
是一個(gè)對象,指的是將從文件中導(dǎo)出的功能。在 Node 中,每個(gè)文件都被視為一個(gè)模塊。require()
是用于從其他文件或 Node 包中導(dǎo)入模塊的函數(shù)。process
是一個(gè)引用運(yùn)行 Node 程序的實(shí)際計(jì)算機(jī)進(jìn)程的對象,并允許訪問命令行參數(shù)等等。
模塊
Node 有許多內(nèi)置模塊來幫助與命令行、計(jì)算機(jī)文件系統(tǒng)和 Internet 進(jìn)行交互。這些包括
- 用于創(chuàng)建 Web 服務(wù)器的HTTP和HTTPS 。
- File System、OS和Path用于與文件系統(tǒng)、操作系統(tǒng)和文件/目錄路徑進(jìn)行交互。
您可以查看完整文檔以了解更多 Node 的內(nèi)置功能。
為什么是節(jié)點(diǎn)?
根據(jù)Node.js 主頁,Node “使用事件驅(qū)動的非阻塞 I/O 模型”。實(shí)際上,這意味著 Node 可以很好地處理異步 JavaScript 代碼以執(zhí)行許多異步活動,例如讀取和寫入文件系統(tǒng)、處理與數(shù)據(jù)庫服務(wù)器的連接或作為 Web 服務(wù)器處理請求。
為了處理異步代碼,Node 使用基于回調(diào)的系統(tǒng)。將實(shí)現(xiàn)一些異步活動的節(jié)點(diǎn)函數(shù)和方法采用回調(diào)函數(shù)。只要異步操作已解決,就會調(diào)用此回調(diào)。按照慣例,此回調(diào)的第一個(gè)參數(shù)是錯(cuò)誤占位符。如果異步操作發(fā)生錯(cuò)誤(例如,試圖讀取不存在的文件),則錯(cuò)誤參數(shù)將是一個(gè)錯(cuò)誤對象,但null
如果沒有發(fā)生錯(cuò)誤,它將是一個(gè)錯(cuò)誤對象。
在這個(gè)例子中,我們使用 Node 的內(nèi)置fs
模塊來讀取script.js文件。文件讀取操作完成后調(diào)用回調(diào)函數(shù)。如果發(fā)生錯(cuò)誤,它將被傳入error
并拋出。如果不存在,則從文件讀取操作中檢索到的數(shù)據(jù)將記錄到控制臺。
如何使用節(jié)點(diǎn)
該視頻將向您展示如何下載和安裝 Node.js。
要在 Node 中運(yùn)行 JS 文件,node
后跟文件路徑的命令將執(zhí)行程序文件。
例如,如果我們將以下內(nèi)容保存在文件script.js中:
在與script.jsnode script.js
相同的文件夾中運(yùn)行終端命令將啟動 Node,打印到終端窗口,然后退出,因?yàn)槟_本文件已完成執(zhí)行。I am a Node program
節(jié)點(diǎn)作為 REPL
Node 也可以在終端窗口中用作 Read-Evaluate-Print-Loop 或 REPL。此功能允許您從命令行執(zhí)行 JavaScript 命令。
安裝 Node 后,您可以通過node
在終端中運(yùn)行命令并按來啟動 REPL?Enter。您現(xiàn)在處于交互式 JavaScript 環(huán)境中,可以運(yùn)行任何有效的 JavaScript 代碼,例如4 + 5
.?執(zhí)行命令后,Node 將始終打印該評估的結(jié)果。
node
在此示例中,用戶使用終端命令在第一行啟動節(jié)點(diǎn)。在第 2 行,用戶鍵入4 + 5
并使用返回鍵進(jìn)行評估。9
打印到輸出終端。
在第 4 行,用戶打開nodeIsGreat
.?因?yàn)檫@個(gè)函數(shù)聲明需要多行,Node REPL 將...
在一行的開頭打印以表明它仍在讀取用戶的輸入語句并且尚未評估。在第 6 行關(guān)閉函數(shù)聲明后,undefined
打印到輸出終端,因?yàn)楹瘮?shù)聲明本身不計(jì)算任何值。在第 8 行調(diào)用該函數(shù)時(shí),Node is great!
記錄到控制臺,并undefined
在之后記錄,因?yàn)?code class="styles_code__NWUNd">nodeIsGreat()返回undefined
.
要退出 Node REPL,請.exit
隨時(shí)使用該命令并返回到系統(tǒng) shell。按ctrl+c兩次也將退出。
加載現(xiàn)有文件
Node REPL 還可以加載現(xiàn)有的 JS 文件。如果我們將以下代碼保存到script.js中:
我們可以使用.load
它來將它加載到 REPL 中。.load
接受一個(gè)路徑參數(shù),所以要加載script.js?,我們將使用.load ./script.js
.
加載腳本文件后,變量可以在 REPL 中訪問,因此當(dāng)我們評估a
變量時(shí),它的值已通過加載script.js設(shè)置,并且“節(jié)點(diǎn) REPL 很有趣!”?打印到控制臺。
通過在終端中運(yùn)行自己嘗試一下,node
或者查看REPL 文檔以獲取更多功能。
包管理
Node 包是在 Node 開發(fā)人員之間共享模塊的便捷方式。服務(wù)npm是 Node 的默認(rèn)包管理器,它附帶了 Node 的安裝。
npm 允許訪問數(shù)十萬個(gè)可用的開源包。
除了 npm,yarn作為另一個(gè) JS 包管理器越來越受歡迎。
要了解更多信息并查看 npm 的實(shí)際應(yīng)用,請參加我們的瀏覽器兼容性和轉(zhuǎn)譯課程。
節(jié)點(diǎn)版本
Node 的主要版本旨在支持最新的 JavaScript 功能,包括 ES6/ES2015 及更高版本,無需轉(zhuǎn)譯。要查看不同版本支持的 JavaScript 功能列表,請?jiān)L問node.green
版本管理
與任何主要的軟件版本一樣,頂級 Node 版本(8.x、7x 等)有時(shí)會在舊版本環(huán)境中構(gòu)建的應(yīng)用程序中引入重大更改。版本管理器可用于在單臺計(jì)算機(jī)上的多個(gè) Node 版本之間切換。有兩個(gè)版本管理器提供此功能:nvm(節(jié)點(diǎn)版本管理器)和n。N 可以很容易地安裝為 npm 包!