Node.js 入門你需要知道的 10 個問題

2022-01-03 前端技術優選

   戳藍字「前端技術優選」關注我們哦!

本文為您分享「Node.js 入門你需要知道的 10 個問題」這些問題可能也是面試中會被問到的,當然問題不僅僅是這 10 道,因此,最近開源了一個新項目 https://github.com/Q-Angelo/Nodejs-Interview-Questions 專注於 Node.js 面試題的分享,提供了中英文版本,您也可以在線預覽: https://interview.nodejs.red/

Q1: 什麼是 Node.js?

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。它是一個開源和跨平臺的服務端應用程式。任何人都可以編寫 JavaScript 代碼來開發 Node.js 應用程式。它可以運行於 Microsoft Windows、Linux、 或 OS 系統。

Node.js 不是一個新的語言,也不僅僅是一個基於 JavaScript 的框架,它基於 Chrome 的 JavaScript 運行時,因此代碼的編寫和執行與瀏覽器非常相似。

Node.js 功能

以下是 Node.js 的一些重要功能

Node.js 使用的單線程模型且採用了事件循環架構,使得編寫可擴展性高的伺服器變得既容易又安全。一些傳統的服務端語言會創建多線程來處理請求,通常創建線程都是有系統資源開銷的,因此也會有一些限制,而 Node.js 只創建一個線程來處理更多的請求。

Node.js 的所有 API 都是異步的。這意味著下一個請求來臨時可以直接處理而不用等待上一次的請求結果先返回。

Node.js 從不緩衝任何任何數據,參見What is No-Buffering feature of Node.js

我們許多人可能會對 Node.js 感到困惑。它不是像 Apache 這樣的 Web 伺服器。Node.js 提供了一種新方法來執行我們的代碼。它是 JavaScript 的運行時。Node.js 提供了創建 HTTP 伺服器的方法,我們可以在這之上託管我們的應用程式。

Source: Introduction To Node.js

Q2: 如何安裝 Node.js?

我們可以從 Node.js 官方網站 https://nodejs.org/en/ 下載安裝軟體。

nvm 安裝

這裡推薦您使用 nvm 工具安裝,方便後期的升級進行 Node.js 版本管理,以下為安裝步驟:

安裝 nvm:wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

查看所有 Node.js 版本:nvm ls-remote

查看本地 Node.js 版本:nvm ls

安裝 Node.js:nvm install v6.9.5

設置系統的默認 Node.js 版本:nvm alias default v6.9.5

驗證安裝結果

在 Node.js 安裝成功之後,我們可以檢查它是否正常工作。

打開命令終端,輸入以下命令

$ node

之後將出現 Node 提示符,我們寫入以下命令,運行查看

console.log("hello world!");

按 Enter 鍵

Q3: 如何用 Node.js 監聽 80 埠?

這是有陷阱的,在類似一些 Unix 系統中你不應該嘗試監聽 80 埠,這麼做你需要擁有超級用戶權限,因此,不推薦你這麼做。

儘管如此,如果你一定要讓應用監聽 80 埠,可以使用 Nginx 來實現,在應用前方加上一層反向代理。還是建議你監聽大於 1024 的埠。

Q4: 什麼是錯誤優先的回調函數?

錯誤優先回調函數用於同時返回錯誤(error)和數據信息(data),返回值的第一個參數做為錯誤信息描述,並且驗證它是否出錯(非錯 error 為 null),其它參數用於返回數據。

fs.readFile(filePath, function(err, data) {

if (err) {

// 錯誤信息處理

return console.log(err)

}

// return the data object

return data;

})

Q5: 你可以在 Node.js 中創建 Http 服務嗎?通過代碼來展示

在 Node.js 中創建一個 Http 服務是很簡單的一件事情,我們可以通過 HTTP 模塊來完成這些操作。

const http = require('http');

const server = http.createServer((request, response) => {

if (request.url === '/hello') {

response.writeHead(200, {

'Content-Type': 'text/plain',

});

response.end('hello world!');

} else {

response.end('OK!');

}

});

server.listen(3000, '127.0.0.1', () => {

console.log('service is listening at http://127.0.0.1:3000');

});

Q6: Node.js 的核心組件有哪些?

Node.js 的核心組建是系統 API、V8 引擎和 Libuv。

Libuv 庫

libuv 庫是一個跨平臺的支持事件驅動的 I/O 庫。它是使用 C 和 C++ 語言為 Node.js 所開發的。但是它也被應用於 Mozilla's 的 Rust、Luvit、Julia、pyuv 等其它的語言。

libuv 庫是 I/O 操作的核心部分,例如讀取文件和 OS 交互。

關於 Libuv 的學習,可以參考 libuv中文教程

V8 引擎

來自於谷歌:「V8 是谷歌開源的高性能 JavaScript 引擎」,使用 C++ 開發,並在谷歌瀏覽器中使用。V8 中實現的 ECMAScript 中指定 ECMA - 262 ,第 3版運行在 Windows XP 和 Vista、Mac OS X 的 10.5 和 Linux 系統使用 IA - 32 或 ARM/MIPS 處理器。V8 可以獨立運行,也可以嵌入到任何 C++ 應用程式。

如果你感興趣想學習更多的 V8 引擎,請訪問 What is V8?

APIs (NodeJS Core Libs)

Node.js APIs 是根據您的請求去調用一些函數執行一些業務操作。默認情況下 Node.js 的 APIs 都是異步的,但是你想同步使用也是可以的(同步方式是不推薦的)。

例如,這個 fs 模塊可以使用同步方式也可以使用異步方式。

var fs = require('fs');

fs.readFile('/files/help.txt', function(err, buf) {

// use fs.readFileSync() for sync operation. console.log(buf.toString());

});

Source: Introduction to NodeJS, A SSJS: Part I - Components Explained

Q7: 什麼是「回調地獄」及如何避免它?

「回調地獄」是指嚴重的回調嵌套,這些回調嵌套使得代碼變得難以閱讀和維護。

以下是回調嵌套的示例:

query("SELECT clientId FROM clients WHERE clientName='picanteverde';", function(id){

query(`SELECT * FROM transactions WHERE clientId=${id}`, function(transactions){

transactions.each((transac) => {

query(`UPDATE transactions SET value = ${transac.value*0.1} WHERE id=${transac.id}`, (error) => {

if(!error){

console.log("success!!");

}else{

console.log("error");

}

});

});

});

});

在某種程度上,修復「回調地獄」的方式是模塊化。回調被分解為獨立的函數,這些函數可以通過參數進行傳遞。所以,針對以上代碼的第一個改進如下所示:

const logError = (error) => {

if(!error){

console.log("success!!");

}else{

console.log("error");

}

},

updateTransaction = (t) => {

query(`UPDATE transactions SET value = ${t.value*0.1} WHERE id=${t.id}`, logError);

},

handleTransactions = (transactions) => {

transactions.each(updateTransaction);

},

handleClient = (id) => {

query(`SELECT * FROM transactions WHERE clientId=${id}`, handleTransactions);

};

query("SELECT clientId FROM clients WHERE clientName='picanteverde';",handleClient);

儘管這個代碼相比第一個示例更容易易讀,而且我們創建的的函數還可以得到復用。但是在某些情況下,我們想要使程序更健壯可通過 Promise 來解決。

此外,generators 也提供了強大的回調地獄解決方案,使用它可以解決不同回調之間的依賴關係。然而 generators 會更高級一些使用起來會複雜一些。關於 Generators 更多信息可以閱讀這篇文章 Generators in Node.js

然而,以上的雖然能很好解決回調地獄問題,但是目前有了更好的方案 Async/Await。使用 Async/Await 需要注意 Node.js 版本要在 v7.5 版本之上。

Source: 8 Essential Node.js Interview Questions

Q8: 什麼是 Node.js 的事件驅動編程?

事件驅動程序是由事件(click、load 等)決定的代碼流程術語。它是當今流行程式語言(例如 C#、Java)裡一個最基本的裡程碑,在這裡不會詳細講述。在 Node.js 中或者一些其它類型的 JavaScript 項目中,我們都在使用事件驅動編程。也許你並不知道事件驅動編程,但是在一些頁面加載或按鈕單擊事件中,你已經在使用了。

舉一個典型的事件驅動流程的例子,看下它是如何在 Node.js 中完成中:

result = getJSONfromDestination();

binddata(result);

上述操作是一個阻塞 I/O(單線程模式下將會等待這個阻塞 I/O 完成之後才會進行下一步)

現在讓我們看看異步方式該如何進行(非阻塞 I/O 進程)

json_finished = function(result){

binddata(result);

}

getJSONfromDestination(jsonfinished);

如上所示,這是一個非阻塞的例子,因為 json_finished 不是你所想向的那樣會直接工作。當您調用 getJSONfromDestination 函數並將 jsonfinished 做為參數傳遞時,它才開始工作。

Source: NodeJS Series #6: Event - Driven Programming

Q9: 什麼是 NPM? 在 Node.js 中什麼時候需要 NPM?

NPM 是 Node.js 中的包管理器。允許我們為 Node.js 安裝各種模塊,這個包管理器為我們提供了安裝、刪除等其它命令來管理模塊。這裡有一點我們需要注意,我們必須要有一個 package.json 文件或 node_modules 目錄安裝模塊到本地。

NPM 最好的一點是它會在本地存儲我們所安裝的依賴項,存在於 package.json 的 dependencies 對象裡。例如,如果一個模塊 X 使用了模塊 A 版本為 1.0,模塊 Y 使用了模塊 A 版本為 1.5,那麼模塊 X 或 Y 都將在本地擁有自己對應的模塊 A 的副本。

// 模塊 X

{

"name": "X",

"dependencies": {

"A": "^1.0"

}

}

// 模塊 Y

{

"name": "Y",

"dependencies": {

"A": "^1.5"

}

}

需要 NPM 包

當我們在開發一些 Node.js 項目時,可能會遇到一些地方需要 NPM,例如連結 Redis、MongoDB 或者發送請求 Request 等,有了這些模塊可以使我們更專注於業務開發,當然有時你會有些特別的需求,這時可能需要自己去封裝一個 NPM 模塊,實現復用。

點擊下面 Source 閱讀更多關於 NPM 的相關內容

Source: How to Create Nodejs Module and Publish Over to Npm

Q10: Node.js 可以做什麼? 10 個 Node.js 的應用場景?

Node.js 可以做 Web 服務端、命令行工具 (Java, PHP 可以做的 JS 也可以做),現在讓我們看下 Node.js 的 10 個應用場景:

Web 開發: Express + EJS + MongoDB/Mysql

REST 開發: Restify

IM 即時聊天: Express + Socket.io

網絡爬蟲: Cheerio/request

博客系統: Hexo

網絡論壇: Nodeclub

Web 幻燈片: Cleaver

前端構建工具: bower.js

OAuth 認證: Passport

定時任務工具: Later

Source: What does node. js do? 10 application scenarios for node. js

閱讀推薦

相關焦點

  • Node.JS快速入門
    -v會顯示當前node的版本號2.快速入門2.1 控制臺輸出我們現在做個最簡單的小例子,演示如何在控制臺輸出,在e盤創建文件夾nodedemo ,創建文本文件demo1.js,代碼內容我們在命令提示符下輸入命令node demo1.js ,結果如下:2.2 使用函數我們剛才的例子非常簡單,咱們這裡再看一下函數的使用:我們在命令提示符下輸入命令node demo2.js ,結果如下:
  • Node.js模塊化你所需要知道的事
    前言我們知道,Node.js是基於CommonJS規範進行模塊化管理的,模塊化是面對複雜的業務場景不可或缺的工具,或許你經常使用它,但卻從沒有系統的了解過,所以今天我們來聊一聊Node.js模塊化你所需要知道的一些事兒,一探Node.js模塊化的面貌。
  • Node.js 入門到幹活,10 個項目就夠了
    Node.js 入門到幹活,10 個項目就夠了 Node.js 在很多大公司都有不錯的實踐,比如:淘寶、天貓 Web 版,很多頁面都是在 Node 伺服器上渲染的。還有各種腳手架、前端打包發布工具、構建生態的小工具,也基本都是 Node.js 編寫的。
  • Node.js 原生開發入門完全教程(上)
    node和npm的版本,說明Node.js安裝成功。簡單解釋一下為什麼每一次列印後面都出現了一個 undefined,原因是因為你輸入js代碼並按下回車後,node會輸出執行完該代碼後的返回值,如果沒有返回值,就會顯示undefined,這個跟Chrome的調試工具相似。如上代碼所示,當輸入 process.exit()並回車時,即可退出 node模式。
  • 最新Node.js框架:Koa 2 實用入門
    本文主要koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一個更簡單直接的理解Koa 2實用入門koa2已發布了一段時間,可以考慮入手,參見Node.js最新Web技術棧(2016年4月) http://nodeonly.com/stack/本文主要是koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一個更簡單直接的理解
  • 10+ 最佳的 Node.js 教程結合實例
    對於完全的Node.js初學者,  在深入挖掘本文章後續提到的學習項目之前,一步步按照airpair.com上面入門指南的要點 或 Node.js入門指南 之類的文章學習是不錯的選擇。Nodeschool.io是另一個比較好的網站,上面有著非常多的資料,可以學習基本的node.js及相關的技術。
  • 10+ 最佳的 Node.js 教程和實例
    以下是Node.js入門的簡單介紹,如果你對Node.js略有了解可以直接跳過此部分。那什麼是Node.js呢?Node.js是迄今運用最多的服務端JavaScript運行時環境,使用JavaScript開發跨平臺的實時WEB應用。Node.js基於Google的V8 JavaScript引擎。
  • 你需要了解的 Node.js 模塊
    > require.resolve('find-me');'/Users/samer/learn-node/node_modules/find-me/start.js'> require.resolve('not-there');Error: Cannot find module 'not-there'    at
  • 【 Node.js】你應該知道的 NPM 知識都在這!
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • Node.js新手必須知道的4個JavaScript概念
    如果只需要知道一種程式語言就可以構建一個全棧的應用程式,是不是特別了不起?Ryan Dahl為了把這個想法成為現實,創造了node.js。
  • 10 個最適合 Web 和 APP 開發的 NodeJS 框架
    讓我們來看看目前可用的最好、最強大的 NodeJS 框架,並幫助你建立實時的、各種規模和複雜性的可擴展 Web 應用程式 1. Node.js Express 對於一個已經在使用 node.js 的開發人員來說,Express 或者」node.js express」並不是一個新鮮事。
  • 【 Node.js 進階】你應該知道的 NPM 知識都在這!
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • 你不知道的 Npm(Node.js 進階必備好文)
    為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助,上面三個場景如果你都用不到,配置上節約時間,
  • Node.js 學習資料和教程(值得收藏)
    >被誤解的 Node.jsNode.js C++ addon編寫實戰系列熱門node.js模塊排行榜,方便找出你想要的模塊nodejs多線程,真正的非阻塞淺析nodejs百萬級並發 Node.js也能行高性能Node.js:來自LinkedIn Mobile的10條優化建議Kraken:改變PayPal開發文化的Node.js框架Groupon拋棄Rails,轉向
  • 讓你 nodejs 水平暴增的 debugger 技巧
    我覺得學習 nodejs 除了要掌握基礎的 api、常用的一些包外,最重要的能力是學會使用 debugger。因為當流程複雜的時候,斷點調試能夠幫你更好的理清邏輯,有 bug 的時候也能更快的定位問題。狼叔說過,是否會使用 debugger 是區分一個程式設計師 nodejs 水平的重要標誌。
  • 15 個常見的 Node.js 面試問題及答案
    準備使你有信心參加面試,而不用擔心莫名的緊張情緒。如果第一次參加編程面試,這一點尤其重要。為幫助 Node.js 開發人員更好的面試,我列出了 15 個常見的 Node.js 和網絡開發相關的面試問題。在本文中,我們將重點討論 Node.js 相關問題。但是,請記住 JavaScript 問題在 Node.js 面試中也經常問到,所以準備一些對你來說沒什麼壞處。
  • Linux Foundation 提供的免費 Node.js 教程
    Node.js 以其速度、輕量級的足跡和輕鬆擴展的能力而備受推崇,使其成為微服務架構的首選。Node.js 的使用和吸收速度穩步增長,市場一直在渴求更多具備使用該技術知識和技能的人才。然而,對於那些想要開始學習 Node.js 的人來說,學習路徑並不是很清晰。
  • centos7編程實踐:安裝nodejs
    由於最近項目的需要,我需要在centos7上安裝nodejs,故總結這份教程,希望能幫助需要的同學。一、nodeJS簡介1、Nodejs是什麼?2、node.js的優勢2.1、Nodejs語法完全是js語法,只要你懂js基礎就可以學會Nodejs後端開發Node打破了過去JavaScript只能在瀏覽器中運行的局面。
  • 看了就會的 Node.js 常用三方工具包
    前言之前一篇文章介紹了 Node.js 的三個模塊的基礎 API,面對文檔時不那麼抓瞎,基礎 API 用習慣了也差不多找到感覺,之後想用啥就可以自己照著文檔找就好了。,但是用過的同學都知道,它的能力還是挺有限的。
  • 專門針對初學者的Node.js教程
    Node.js只是計算機上執行代碼的另一種方式,它是一個簡單的JavaScript Runtime.安裝Node.jsNode.js的安裝十分容易。只需在這裡下載滿足你需要的安裝程序即可。已安裝好Node.js,下一步做什麼?