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

資訊專欄INFORMATION COLUMN

Node.js 入門你需要知道的 10 個(gè)問題

szysky / 1920人閱讀

摘要:什么是在中什么時(shí)候需要是中的包管理器。允許我們?yōu)榘惭b各種模塊,這個(gè)包管理器為我們提供了安裝刪除等其它命令來管理模塊。

本文為您分享「Node.js 入門你需要知道的 10 個(gè)問題」這些問題可能也是面試中會(huì)被問到的,當(dāng)然問題不僅僅是這 10 道,因此,最近開源了一個(gè)新項(xiàng)目 Nodejs-Interview-Questions 專注于 Node.js 面試題的分享,提供了中英文版本,您也可以在線預(yù)覽: https://interview.nodejs.red/

Q1: 什么是 Node.js?

Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。它是一個(gè)開源和跨平臺(tái)的服務(wù)端應(yīng)用程序。任何人都可以編寫 JavaScript 代碼來開發(fā) Node.js 應(yīng)用程序。它可以運(yùn)行于 Microsoft Windows、Linux、 或 OS 系統(tǒng)。

Node.js 不是一個(gè)新的語言,也不僅僅是一個(gè)基于 JavaScript 的框架,它基于 Chrome 的 JavaScript 運(yùn)行時(shí),因此代碼的編寫和執(zhí)行與瀏覽器非常相似。

Node.js 功能

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

高度可擴(kuò)展

Node.js 使用的單線程模型且采用了事件循環(huán)架構(gòu),使得編寫可擴(kuò)展性高的服務(wù)器變得既容易又安全。一些傳統(tǒng)的服務(wù)端語言會(huì)創(chuàng)建多線程來處理請求,通常創(chuàng)建線程都是有系統(tǒng)資源開銷的,因此也會(huì)有一些限制,而 Node.js 只創(chuàng)建一個(gè)線程來處理更多的請求。

事件驅(qū)動(dòng)和異步

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

No Buffering

Node.js 從不緩沖任何任何數(shù)據(jù),參見What is No-Buffering feature of Node.js

我們許多人可能會(huì)對(duì) Node.js 感到困惑。它不是像 Apache 這樣的 Web 服務(wù)器。Node.js 提供了一種新方法來執(zhí)行我們的代碼。它是 JavaScript 的運(yùn)行時(shí)。Node.js 提供了創(chuàng)建 HTTP 服務(wù)器的方法,我們可以在這之上托管我們的應(yīng)用程序。

Source: Introduction To Node.js

Q2: 如何安裝 Node.js?

我們可以從 Node.js 官方網(wǎng)站 https://nodejs.org/en/ 下載安裝軟件。

nvm 安裝

這里推薦您使用 nvm 工具安裝,方便后期的升級(jí)進(jìn)行 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

設(shè)置系統(tǒng)的默認(rèn) Node.js 版本:nvm alias default v6.9.5

驗(yàn)證安裝結(jié)果

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

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

$ node

之后將出現(xiàn) Node 提示符,我們寫入以下命令,運(yùn)行查看

console.log("hello world!");   

按 Enter 鍵

Q3: 如何用 Node.js 監(jiān)聽 80 端口?

這是有陷阱的,在類似一些 Unix 系統(tǒng)中你不應(yīng)該嘗試監(jiān)聽 80 端口,這么做你需要擁有超級(jí)用戶權(quán)限,因此,不推薦你這么做。

盡管如此,如果你一定要讓應(yīng)用監(jiān)聽 80 端口,可以使用 Nginx 來實(shí)現(xiàn),在應(yīng)用前方加上一層反向代理。還是建議你監(jiān)聽大于 1024 的端口。

Q4: 什么是錯(cuò)誤優(yōu)先的回調(diào)函數(shù)?

錯(cuò)誤優(yōu)先回調(diào)函數(shù)用于同時(shí)返回錯(cuò)誤(error)和數(shù)據(jù)信息(data),返回值的第一個(gè)參數(shù)做為錯(cuò)誤信息描述,并且驗(yàn)證它是否出錯(cuò)(非錯(cuò) error 為 null),其它參數(shù)用于返回?cái)?shù)據(jù)。

fs.readFile(filePath, function(err, data) {  
  if (err) {
    // 錯(cuò)誤信息處理
    return console.log(err)
  }
  
  // return the data object
  return data;
})
Q5: 你可以在 Node.js 中創(chuàng)建 Http 服務(wù)嗎?通過代碼來展示

在 Node.js 中創(chuàng)建一個(gè) Http 服務(wù)是很簡單的一件事情,我們可以通過 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 的核心組建是系統(tǒng) API、V8 引擎和 Libuv。

Libuv 庫

libuv 庫是一個(gè)跨平臺(tái)的支持事件驅(qū)動(dòng)的 I/O 庫。它是使用 C 和 C++ 語言為 Node.js 所開發(fā)的。但是它也被應(yīng)用于 Mozilla"s 的 Rust、Luvit、Julia、pyuv 等其它的語言。

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

關(guān)于 Libuv 的學(xué)習(xí),可以參考 libuv中文教程

V8 引擎

來自于谷歌:“V8 是谷歌開源的高性能 JavaScript 引擎”,使用 C++ 開發(fā),并在谷歌瀏覽器中使用。V8 中實(shí)現(xiàn)的 ECMAScript 中指定 ECMA - 262 ,第 3版運(yùn)行在 Windows XP 和 Vista、Mac OS X 的 10.5 和 Linux 系統(tǒng)使用 IA - 32 或 ARM/MIPS 處理器。V8 可以獨(dú)立運(yùn)行,也可以嵌入到任何 C++ 應(yīng)用程序。

如果你感興趣想學(xué)習(xí)更多的 V8 引擎,請?jiān)L問 What is V8?

APIs (NodeJS Core Libs)

Node.js APIs 是根據(jù)您的請求去調(diào)用一些函數(shù)執(zhí)行一些業(yè)務(wù)操作。默認(rèn)情況下 Node.js 的 APIs 都是異步的,但是你想同步使用也是可以的(同步方式是不推薦的)。

例如,這個(gè) 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: 什么是“回調(diào)地獄”及如何避免它?

“回調(diào)地獄”是指嚴(yán)重的回調(diào)嵌套,這些回調(diào)嵌套使得代碼變得難以閱讀和維護(hù)。

以下是回調(diào)嵌套的示例:

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");
        }
      });
    });
  });
});

在某種程度上,修復(fù)“回調(diào)地獄”的方式是模塊化?;卣{(diào)被分解為獨(dú)立的函數(shù),這些函數(shù)可以通過參數(shù)進(jìn)行傳遞。所以,針對(duì)以上代碼的第一個(gè)改進(jìn)如下所示:

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);

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

此外,generators 也提供了強(qiáng)大的回調(diào)地獄解決方案,使用它可以解決不同回調(diào)之間的依賴關(guān)系。然而 generators 會(huì)更高級(jí)一些使用起來會(huì)復(fù)雜一些。關(guān)于 Generators 更多信息可以閱讀這篇文章 Generators in Node.js

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

Source: 8 Essential Node.js Interview Questions

Q8: 什么是 Node.js 的事件驅(qū)動(dòng)編程?

事件驅(qū)動(dòng)程序是由事件(click、load 等)決定的代碼流程術(shù)語。它是當(dāng)今流行編程語言(例如 C#、Java)里一個(gè)最基本的里程碑,在這里不會(huì)詳細(xì)講述。在 Node.js 中或者一些其它類型的 JavaScript 項(xiàng)目中,我們都在使用事件驅(qū)動(dòng)編程。也許你并不知道事件驅(qū)動(dòng)編程,但是在一些頁面加載或按鈕單擊事件中,你已經(jīng)在使用了。

舉一個(gè)典型的事件驅(qū)動(dòng)流程的例子,看下它是如何在 Node.js 中完成中:

result = getJSONfromDestination();  
binddata(result);  

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

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

json_finished = function(result){  
    binddata(result);  
}  
  
getJSONfromDestination(jsonfinished); 

如上所示,這是一個(gè)非阻塞的例子,因?yàn)?json_finished 不是你所想向的那樣會(huì)直接工作。當(dāng)您調(diào)用 getJSONfromDestination 函數(shù)并將 jsonfinished 做為參數(shù)傳遞時(shí),它才開始工作。

Source: NodeJS Series #6: Event - Driven Programming

Q9: 什么是 NPM? 在 Node.js 中什么時(shí)候需要 NPM?

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

NPM 最好的一點(diǎn)是它會(huì)在本地存儲(chǔ)我們所安裝的依賴項(xiàng),存在于 package.json 的 dependencies 對(duì)象里。例如,如果一個(gè)模塊 X 使用了模塊 A 版本為 1.0,模塊 Y 使用了模塊 A 版本為 1.5,那么模塊 X 或 Y 都將在本地?fù)碛凶约簩?duì)應(yīng)的模塊 A 的副本。

// 模塊 X
{
  "name": "X",
  "dependencies": {
    "A": "^1.0"
  }
}
// 模塊 Y
{
  "name": "Y",
  "dependencies": {
    "A": "^1.5"
  }
}

需要 NPM 包

當(dāng)我們在開發(fā)一些 Node.js 項(xiàng)目時(shí),可能會(huì)遇到一些地方需要 NPM,例如鏈接 Redis、MongoDB 或者發(fā)送請求 Request 等,有了這些模塊可以使我們更專注于業(yè)務(wù)開發(fā),當(dāng)然有時(shí)你會(huì)有些特別的需求,這時(shí)可能需要自己去封裝一個(gè) NPM 模塊,實(shí)現(xiàn)復(fù)用。

點(diǎn)擊下面 Source 閱讀更多關(guān)于 NPM 的相關(guān)內(nèi)容

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

Q10: Node.js 可以做什么? 10 個(gè) Node.js 的應(yīng)用場景?

Node.js 可以做 Web 服務(wù)端、命令行工具 (Java, PHP 可以做的 JS 也可以做),現(xiàn)在讓我們看下 Node.js 的 10 個(gè)應(yīng)用場景:

Web 開發(fā): Express + EJS + MongoDB(mongoose)/Mysql

REST 開發(fā): Restify

IM 即時(shí)聊天: Express + Socket.io

網(wǎng)絡(luò)爬蟲: Cheerio/request

博客系統(tǒng): Hexo

網(wǎng)絡(luò)論壇: Nodeclub

Web 幻燈片: Cleaver

前端構(gòu)建工具: bower.js

OAuth 認(rèn)證: Passport

定時(shí)任務(wù)工具: Later

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

本片文章首發(fā)于慕課網(wǎng):https://www.imooc.com/article/289202

閱讀推薦

Nodejs-Interview-Questions —專注于 Node.js 面試及常見問題分享

Nodejs 技術(shù)棧 — 一份 Node.js 開發(fā)與學(xué)習(xí)的技術(shù)棧指南

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

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

相關(guān)文章

  • 入門node.js必須知道那些事

    摘要:入門你必須知道的那些事最基本的一些操作和概念用執(zhí)行一段代碼在命令行中用切換到桌面創(chuàng)建一個(gè)文件夾和并用命令切換到這個(gè)文件夾創(chuàng)建一個(gè)文件并寫上簡單的代碼在命令行中輸入命令行會(huì)輸出引用文件的方式采用了規(guī)范通過來引入一個(gè)文件新建文件并在文件中引入執(zhí) 入門node.js你必須知道的那些事 最基本的一些操作和概念 用node執(zhí)行一段js代碼 在命令行中用cd切換到桌面 創(chuàng)建一個(gè)文件夾和并用cd命...

    learn_shifeng 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    muddyway 評(píng)論0 收藏0
  • 前端相關(guān)大雜燴

    摘要:希望幫助更多的前端愛好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒有網(wǎng)絡(luò)請求功能的庫。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡單 原文地址:Learning React.js is easier than you think 原文作...

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

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

0條評(píng)論

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