1. 認(rèn)識(shí)node
1.1 什么是node
Node.js是一個(gè)基于 Chrome V8引擎的JavaScript 運(yùn)行環(huán)境,
1.2 Nodejs與JavaScript
首先了解JavaScript,JavaScript是前端腳本語(yǔ)言,運(yùn)行在瀏覽器中, JavaScript賦予了網(wǎng)頁(yè)新的生命力.
因此,我們知道了JavaScript是一門(mén)語(yǔ)言, 而瀏覽器是運(yùn)行JavaScript這門(mén)語(yǔ)言的環(huán)境
而Node也是一個(gè)運(yùn)行環(huán)境, 運(yùn)行JavaScript語(yǔ)言的.
其實(shí)node和JavaScript的關(guān)系就像 瀏覽器內(nèi)核中處理JS的引擎和JavaScript的關(guān)系.
簡(jiǎn)單的理解就是node不是一門(mén)語(yǔ)言,而是一個(gè)環(huán)境, 一個(gè)能讓JavaScript的運(yùn)行在后臺(tái)的環(huán)境環(huán)境,
Node其實(shí)就是使用chrome開(kāi)源的V8引擎為基礎(chǔ) 并添加了服務(wù)器語(yǔ)言應(yīng)該有的功能,如文件系統(tǒng),模塊,包,操作系統(tǒng)API,網(wǎng)絡(luò)通信等而搭建的服務(wù)端運(yùn)行
總結(jié):
NodeJS : 一個(gè)可以運(yùn)行JavaScript 的運(yùn)行環(huán)境(平臺(tái)),是基于Chrome JavaScript V8 引擎,并且對(duì)JavaScript語(yǔ)言進(jìn)行了增強(qiáng).使JavaScript具有服務(wù)器語(yǔ)言開(kāi)發(fā)的能力(操作文件,讀取系統(tǒng)信息,網(wǎng)絡(luò)等)
JavaScript: 一門(mén)編程語(yǔ)言,只要有JavaScript引擎就能 運(yùn)行,每個(gè)瀏覽器都有自己的JS引擎,如果運(yùn)行在瀏覽器中,瀏覽器對(duì)JavaScript加入了瀏覽器和文檔操作的接口
簡(jiǎn)單理解: JavaScript運(yùn)行需要JavaScript引擎, JavaScript引擎可以在瀏覽器中(IE,Chrome,Firefox),也可以獨(dú)立出來(lái)(node),雖然都是JavaScript,但是在不同的運(yùn)行環(huán)境下,責(zé)任也不同,瀏覽器下的JavaScript 主要操作BOM,DOM ,而Node則具有服務(wù)端語(yǔ)言的功能(處理網(wǎng)絡(luò)請(qǐng)求,保存數(shù)據(jù)到數(shù)據(jù)庫(kù)中)

2. NodeJS的特點(diǎn)
作為后端JavaScript的運(yùn)行平臺(tái), Node保留了前端JavaScript中哪些屬性的接口,并沒(méi)有改變語(yǔ)言本身的任何特性, 依舊基于作用域和原型鏈.
Node的特點(diǎn):
- Non-blocking I/0 非阻塞異步I/O
- Event Driven 事件驅(qū)動(dòng)
- single Thread 單線程 ,
三個(gè)特點(diǎn)可以理解是相輔相成,
在低硬件條件下處理高并發(fā),必須選擇減少內(nèi)存消耗,所以選擇單線程,
為了防止線程阻塞,單線程就必須非阻塞異步 I/O,
為了非阻塞I/O 就必須處理異步調(diào)度問(wèn)題,所以事件驅(qū)動(dòng)
接下來(lái)好好看看這三個(gè)特點(diǎn).
創(chuàng)建node是為什么要選擇單線程,事件驅(qū)動(dòng),非阻塞I/O?
在傳統(tǒng)服務(wù)器模型中,大多都使用多線程來(lái)解決并發(fā)的問(wèn)題, 而每一個(gè)客戶端在連接創(chuàng)建一個(gè)線程,需要消耗2MB的內(nèi)存,也就是說(shuō),理論上一個(gè)8GB的服務(wù)器可以同時(shí)鏈接用戶數(shù)量為4000個(gè)左右
而Node.js 單線程,利用非阻塞IO,事件驅(qū)動(dòng),理論上一個(gè)8GB內(nèi)存的服務(wù)器,可以容納3萬(wàn)到4萬(wàn)的用戶連接
2.1.NodeJS 單線程
Node保持了JavaScript單線程的特點(diǎn). 單線程最大的好處是不用像多線程編程那樣處處在意狀態(tài)的同步問(wèn)題, 也沒(méi)有死鎖的存在.也沒(méi)有線程上下文交換帶來(lái)的性能開(kāi)銷.

但是單線程也有其弱點(diǎn):
- 無(wú)法利用多核CPU
- 錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出, 應(yīng)用的健壯性值得考慮
- 大量的計(jì)算占用CPU
2.2. 非阻塞異步I/ O
Node.js采用了非阻塞異步I/O機(jī)制,當(dāng)某個(gè)I/O執(zhí)行完畢時(shí),將以事件/回調(diào)函數(shù)的形式通知執(zhí)行操作后的結(jié)果
非阻塞模式下,一個(gè)線程用用在執(zhí)行計(jì)算操作,這個(gè)線程CPU核心利用率永遠(yuǎn)是100%
例如:讀取文件操作

Node 適合I/O操作比較多的服務(wù)器, 不適合計(jì)算比較多的.
2.3. 事件驅(qū)動(dòng)模型
Node將前端瀏覽器中應(yīng)用廣泛且成熟的事件引入后端, 配合異步I/O, 將事件點(diǎn)暴露給業(yè)務(wù)邏輯
NodeJS單線程只是一個(gè)JS主線程,本質(zhì)上的異步操作還是有線程池完成的
NodeJS之所以單線程處理高并發(fā)的原因,得益于c++的異步框架libuv層來(lái)實(shí)現(xiàn)的,循環(huán)機(jī)制,和底層的線程池
而Node.js的高性能也是得益于其將阻塞的I/O異步化,使得不影響主邏輯的執(zhí)行

3. 安裝運(yùn)行
官網(wǎng)下載安裝運(yùn)行
3.1 檢查有沒(méi)有安裝成功
$ node -v
$ npm -v
3.2 運(yùn)行模式
- REPL模式(Read-Evaluate-Print-Loop) 輸入- 求值 - 輸出 - 循環(huán)
$ node
node 回車直接進(jìn)入REPL模式(了解即可)
- 直接運(yùn)行js文件
$ node index.js
3.3 常用DOS命令
- e: 切換盤(pán)符
- dir 顯示當(dāng)前文件夾中所有文件及文件夾列表
- cd 進(jìn)入文件夾(../上一層文件夾)
- exit 退出命令行