摘要:什么是在中什么時候需要是中的包管理器。允許我們為安裝各種模塊,這個包管理器為我們提供了安裝刪除等其它命令來管理模塊。
本文為您分享「Node.js 入門你需要知道的 10 個問題」這些問題可能也是面試中會被問到的,當然問題不僅僅是這 10 道,因此,最近開源了一個新項目 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 都是異步的。這意味著下一個請求來臨時可以直接處理而不用等待上一次的請求結果先返回。
No Buffering
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... | 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(mongoose)/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
本片文章首發于慕課網:https://www.imooc.com/article/289202
閱讀推薦Nodejs-Interview-Questions —專注于 Node.js 面試及常見問題分享
Nodejs 技術棧 — 一份 Node.js 開發與學習的技術棧指南
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105535.html
摘要:入門你必須知道的那些事最基本的一些操作和概念用執行一段代碼在命令行中用切換到桌面創建一個文件夾和并用命令切換到這個文件夾創建一個文件并寫上簡單的代碼在命令行中輸入命令行會輸出引用文件的方式采用了規范通過來引入一個文件新建文件并在文件中引入執 入門node.js你必須知道的那些事 最基本的一些操作和概念 用node執行一段js代碼 在命令行中用cd切換到桌面 創建一個文件夾和并用cd命...
閱讀 1847·2021-11-22 15:25
閱讀 3912·2021-11-17 09:33
閱讀 2507·2021-10-12 10:12
閱讀 1802·2021-10-09 09:44
閱讀 3235·2021-10-08 10:04
閱讀 1313·2021-09-29 09:35
閱讀 1947·2019-08-30 12:57
閱讀 1303·2019-08-29 16:22