一.什么是 Node.js
Node.js是一個(gè)讓JavaScript運(yùn)行在服務(wù)器端的開發(fā)平臺(tái),它讓 JavaScript的觸角伸到了服務(wù)器端.它使用了 Google 的 V8 虛擬機(jī)( Google 的Chrome 瀏覽器使用的 JavaScript 執(zhí)行環(huán)境),來(lái)解釋和執(zhí)行 JavaScript代碼.
所以說(shuō) Node.js 不是一門新的語(yǔ)言而是一個(gè)運(yùn)行時(shí)的環(huán)境.
官網(wǎng):https://nodejs.org/en/
二. Node.js 的特點(diǎn)
Node.js? is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
在官網(wǎng)的首頁(yè),我們看到上面的一句話.概括了 Node.js 的三個(gè)特點(diǎn).
-
2.1單線程:
Node.js不為每個(gè)客戶連接創(chuàng)建一個(gè)新的線程,而僅僅使用一個(gè)線程.當(dāng)有用戶連接了,就觸發(fā)一個(gè)內(nèi)部事件,通過(guò)非阻塞I/O,事件驅(qū)動(dòng)機(jī)制,讓Node.js程序宏觀上也是并行的.
由于每開一個(gè)線程,就會(huì)消耗大概2M 的內(nèi)存,單線程使得操作系統(tǒng)完全不再有線程創(chuàng)建和銷毀的時(shí)間開銷,同時(shí)減少了內(nèi)存的消耗.同時(shí)如果一個(gè)用戶造成了線程的崩潰,整個(gè)服務(wù)也就崩潰了. -
2.2 非阻塞I/O
當(dāng)出現(xiàn)讀取文件或數(shù)據(jù)庫(kù),網(wǎng)絡(luò)請(qǐng)求等耗時(shí)操作時(shí),會(huì)阻塞線程.由于 Node.js 采用了非阻塞 I/O, 當(dāng)某個(gè) I/O 執(zhí)行完畢時(shí),將以事件的形式通知執(zhí)行 I/O 操作的線程,線程執(zhí)行這個(gè)事件的回調(diào)函數(shù).為了處理異步 I/O, 線程必須有事件循環(huán),不斷的檢查有沒(méi)有未處理的事件.
2.3 事件驅(qū)動(dòng)
Node 中,數(shù)據(jù)請(qǐng)求等行為都會(huì)觸發(fā)相應(yīng)的事件.在一個(gè)時(shí)間只能執(zhí)行一個(gè)事件回調(diào)函數(shù),在執(zhí)行一個(gè)事件回調(diào)函數(shù)的過(guò)程中,可以繼續(xù)處理其他的事件,然后返回執(zhí)行原事件的回調(diào)函數(shù).
所以在 Node.js 中所有的 I/O 都是異步的,通過(guò)回調(diào)函數(shù)進(jìn)行操作.
三. Node.js 安裝
進(jìn)入官網(wǎng) 就能看到下載的鏈接.
下載完成后進(jìn)行安裝.
裝成功后你可以在終端機(jī)中運(yùn)行 node 命令進(jìn)入了 Node.js 的交互模式.如果出現(xiàn) -bash: node: command not found,說(shuō)明沒(méi)有正確安裝.
四. helloworld
使用 node在控制臺(tái)輸出 helloworld.
- 4.1 創(chuàng)建一個(gè) js 文件,輸入
console.log('helloworld');
- 4.2 在 terminal中執(zhí)行文件
node 文件名. js
這時(shí)我們就會(huì)在控制臺(tái)中看到輸出的 helloworld.
五. REPL 環(huán)境
REPL (Read-eval-print loop),即輸入—求值—輸出循環(huán)。當(dāng)我們?cè)?terminal 中輸入 node, 就會(huì)進(jìn)入 REPL 環(huán)境
進(jìn)入 REPL 模式以后,會(huì)出現(xiàn)一個(gè)“>”提示符提示你輸入命令,輸入后按回車,Node.js 將會(huì)解析并執(zhí)行命令。如果你執(zhí)行了一個(gè)函數(shù),那么 REPL 還會(huì)在下面顯示這個(gè)函數(shù)的返回 值,上面例子中的 undefined 就是 console.log 的返回值.
六.創(chuàng)建HTTP服務(wù)器
// 使用嚴(yán)格模式, 使用 let 代替的以前的 var.
'use strict';
// const 常量
const http = require('http'); // require 引入 http 模塊
// 創(chuàng)建服務(wù)器
const server = http.createServer((req, res) => {
if(req.url == '/favicon.ico') return; // 在 chrome 瀏覽器下.會(huì)請(qǐng)求一次favicon圖標(biāo).
res.writeHead(200, {"Content-type": "text/html;charset=UTF-8"});
res.write("<h1>Node.js</h1>");
res.end(); // 注意:必須有一個(gè)end(), 否則請(qǐng)求無(wú)法結(jié)束.
}).listen(3000, "127.0.0.1"); // 監(jiān)聽端口號(hào)3000
通過(guò)上面的幾行代碼,我們即可創(chuàng)建一個(gè) HTTP 服務(wù)器.