Node基礎(chǔ)
為什么學(xué)習(xí)Node?
- IO優(yōu)勢(shì)
- 對(duì)于文件讀寫,Node采用的是非阻塞IO
- 傳統(tǒng)IO在讀寫文件的時(shí)候CPU來處理,而代碼執(zhí)行也處于等待中,浪費(fèi)性能
- 非阻塞IO將讀寫操作交給CPU,而代碼正常執(zhí)行,減少等待浪費(fèi)的性能
- 應(yīng)用場(chǎng)景
- 實(shí)際應(yīng)用: webpack/gulp/npm/http-server/json-server
- 服務(wù)器中負(fù)責(zé)IO讀寫的中間層服務(wù)器(天貓中間層IO服務(wù)器)
NodeJS特點(diǎn)
- 其移植了chrome V8 引擎,解析和執(zhí)行代碼機(jī)制和瀏覽器js相同
- 其沿用了JavaScript語法、另外擴(kuò)展了自己需要的功能
- 總結(jié): nodejs 是一個(gè)后端語言 , 其具備操作文件的能力, 可以具備服務(wù)器的創(chuàng)建和操作能力
- 其語法是JavaScript語法,代碼運(yùn)行在chrome V8 引擎之上
基本使用
- 官網(wǎng)上下載 node-v-xx.msi 傻瓜式的安裝包 一路下一步,就ok
- 檢測(cè)是否安裝成功 node -v
- 運(yùn)行程序 node ./xxx.js
內(nèi)置對(duì)象介紹
分類
- 全局對(duì)象: 何時(shí)何處都能訪問
- 核心對(duì)象: 向系統(tǒng)索要,引入即可使用
- 自定義對(duì)象: 按路徑引入即可
process(全局對(duì)象)
每個(gè)系統(tǒng)的環(huán)境變量幾乎都不一樣赠尾,可以利用環(huán)境變量中的具體某個(gè)特定的值來區(qū)分不同的機(jī)器
-
process.env 是一個(gè)對(duì)象定血,我們可以通過其.屬性名來獲取具體的環(huán)境變量值
- 設(shè)置一個(gè)特定的環(huán)境變量,以達(dá)到簡(jiǎn)單區(qū)分不同的機(jī)器,從而針對(duì)生產(chǎn)/開發(fā)環(huán)境運(yùn)行不同的效果
process.argv 獲取命令行參數(shù)
filename/dirname(全局對(duì)象)
- __filename 獲取當(dāng)前運(yùn)行文件的目錄,絕對(duì)路徑
- __dirname 當(dāng)前運(yùn)行文件的絕對(duì)路徑
nodejs實(shí)現(xiàn)規(guī)范
- CommonJS : 規(guī)范JavaScript語言作為后端語言運(yùn)行的標(biāo)準(zhǔn)
- 具備什么能力,該怎么做 ,比如: 具備服務(wù)器的功能/ 可以操作文件 .....
- 模塊應(yīng)該怎么寫: Module :
- 1:依賴一個(gè)模塊 require('模塊名(id)')
- 2: 需要被模塊依賴 module.exports = 給外部的數(shù)據(jù)
- 3:一個(gè)文件是一個(gè)模塊
核心對(duì)象path
- 1:
const path = require('path');
- 路徑 -> 在處理路徑的時(shí)候很擅長(zhǎng),但是,其不負(fù)責(zé)判斷路徑是否存在文件
- 拼接并修正路徑
path. (__dirname,'a','b');
以當(dāng)前目錄/a/b path.resovle('./xxx') 相對(duì)轉(zhuǎn)絕對(duì)
- 接收一個(gè)合法的路徑字符串,轉(zhuǎn)換成一個(gè)對(duì)象
let pathObj = path.parse(mypath);
- 接收一個(gè)路徑對(duì)象蔫仙,轉(zhuǎn)換成一個(gè)字符串路徑
let str = path.format(pathObj);
{ root: 'C:\\',
dir: 'C:\\Users\\孫悟空',
base: '金箍棒.txt', // 該屬性可以用于修改文件名和后綴
ext: '.txt',
name: '金箍棒' }
- 注意:path對(duì)象是方便我們操作路徑的,對(duì)于獲取來講: parse解析成對(duì)象,format轉(zhuǎn)換成字符串.join拼接并修正.... 對(duì)于修改路徑對(duì)象來講,可以用base屬性更改,不能用name,ext更改
模塊
- 弊端
- 在js中要涉及到邏輯,還要在html中,為邏輯對(duì)象考慮引用順序
- 所有對(duì)象默認(rèn)都是全局對(duì)象丐箩,命名沖突
- commonjs規(guī)范
- 一個(gè)文件就是一個(gè)模塊
- 導(dǎo)入用require('./xxx.js');
- 導(dǎo)出用module.exports = xxx;
- 在每一個(gè)模塊內(nèi)聲明的變量屬于模塊內(nèi)的作用域
fs文件模塊
- 文件讀寫
- 其他功能
- 擴(kuò)展介紹
操作文件對(duì)象
-
IO
- I :input輸入
- O:output 輸出
- 文件的操作就是IO
-
復(fù)制文件的過程, I: 通過計(jì)算機(jī),存儲(chǔ)文件到剪切板
- 粘貼到指定目錄: O: 通過計(jì)算機(jī),將剪切板上的數(shù)據(jù),寫出到 指定目錄
-
node中有兩種IO的操作
-
同步IO
- 一行代碼(讀文件)不執(zhí)行完畢...后續(xù)代碼不能執(zhí)行
-
異步IO (建議)
- 一行代碼(讀寫文件) 不執(zhí)行完畢(正在讀寫中) ... 后續(xù)代碼也可以執(zhí)行
-
代碼體驗(yàn):
讀寫文件
const fs = require('fs'); //必須這個(gè)名稱 //讀 fs.readFile(路徑,回調(diào)函數(shù)); //寫 fs.writeFile(路徑,數(shù)據(jù),回調(diào)函數(shù));
總結(jié): 異步的讀/寫文件 參數(shù)1:都是路徑,可以相對(duì)可以絕對(duì),最后一個(gè)參數(shù)都是回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù)中錯(cuò)誤對(duì)象優(yōu)先
-
- 同步和異步IO的區(qū)別: 同步IO會(huì)阻塞后續(xù)代碼執(zhí)行,異步IO不會(huì)阻塞后續(xù)代碼執(zhí)行
nginx負(fù)載均衡
- [圖片上傳失敗...(image-cc710d-1557457943882)]
包(文件夾)
- 多個(gè)文件摇邦,有效的被組織與管理的一個(gè)單位
- 留一個(gè)入口
npm
- 自己先有一個(gè)包描述文件
- 創(chuàng)建一個(gè)包描述文件
npm init
- 下載一個(gè)包
npm install art-template jquery@1.5.1 --save
- 記錄依賴
--save
- 記錄依賴
- 根據(jù)package.json文件中的
dependencies
屬性恢復(fù)依賴- 恢復(fù)包
npm install
- 恢復(fù)包
- 卸載一個(gè)包
npm uninstall jquery@1.5.1 --save
- 查看包的信息
npm info jquery
- 查看包的信息中的某個(gè)字段(版本)
npm info jquery versions
- 查看包的文檔
npm docs jquery
- 安裝全局命令行工具
npm install -g http-server
- 卸載全局命令行工具
npm uninstall -g http-server
- 查看全局包的下載路徑
npm root -g
nrm是npm的鏡像源管理工具
- 1:全局安裝
npm install -g nrm
- 2:查看當(dāng)前可選的鏡像源
nrm ls
- 3:切換鏡像源
nrm use taobao
包的加載機(jī)制
- 我們未來可能需要辨識(shí)一個(gè)包中,入口是否是我們想要的啟動(dòng)程序
- 1:查找node_modules下的包名文件夾中的main屬性(常用)
- 2:不常用:查找node_modules下的包名.js
- 3:查找node_modules下的包名文件夾中的index.js(常用)
http核心模塊
http超文本傳輸協(xié)議
- 協(xié)議至少雙方 -> http雙方J嚎薄施籍!
- 客戶端(瀏覽器) -> 服務(wù)器
- 原生應(yīng)用(QQ) -> 服務(wù)器
請(qǐng)求與響應(yīng)交互的過程
- 見圖
主體對(duì)象
- 服務(wù)器對(duì)象
- 客戶端對(duì)象
- 請(qǐng)求報(bào)文對(duì)象(對(duì)于服務(wù)器來說,是可讀)
- 響應(yīng)報(bào)文對(duì)象(對(duì)于服務(wù)器來說概漱,是可寫)
創(chuàng)建服務(wù)器步驟
- 1:引入http核心對(duì)象
- 2:利用http核心對(duì)象的.createServer(callback); 創(chuàng)建服務(wù)器對(duì)象
- 3:使用服務(wù)器對(duì)象.listen(端口,ip地址) 開啟服務(wù)器
- 4:callback(req,res) 根據(jù)請(qǐng)求處理響應(yīng)
請(qǐng)求對(duì)象
- 請(qǐng)求首行中的url
req.url
- 請(qǐng)求首行中的請(qǐng)求方式
req.method
- 請(qǐng)求頭中的數(shù)據(jù)
req.headers
是一個(gè)對(duì)象 - 頭信息中丑慎,也可以作為與服務(wù)器交互的一種途徑
獲取請(qǐng)求體數(shù)據(jù)
- 代碼對(duì)比
- 瀏覽器: $('#xx').on('submit',function(e){ })
- 服務(wù)器: req.on('data',function(d){ d.toString(); })
querystring核心對(duì)象
- querystring.parse(formStr)
- username=jack&password=123轉(zhuǎn)換成如下
- { username: 'jack', password: '123' }
響應(yīng)對(duì)象
- 響應(yīng)首行
res.writeHead(狀態(tài)碼)
- 寫響應(yīng)頭
- 一次性寫回頭信息
res.writeHead(200,headers)
- 多次設(shè)置頭信息
res.setHeader(key,value);
- 一次性寫回頭信息
- 寫響應(yīng)體
- 一次性寫回響應(yīng)體
res.end();
- 多次寫回響應(yīng)體
res.write();
- 一次性寫回響應(yīng)體
請(qǐng)求與響應(yīng)
- 頭行體
- content-type是對(duì)請(qǐng)求或者響應(yīng)體數(shù)據(jù),做出的說明
響應(yīng)體數(shù)據(jù)
- res.write('字符串'||讀出文件的二進(jìn)制數(shù)據(jù))
- res.end('字符串'||讀出文件的二進(jìn)制數(shù))