Node基礎(chǔ)

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
  • 卸載一個(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();

請(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ù))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓤摧,一起剝皮案震驚了整個(gè)濱河市竿裂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌照弥,老刑警劉巖腻异,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異这揣,居然都是意外死亡悔常,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門给赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來这嚣,“玉大人,你說我怎么就攤上這事塞俱〗阒悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵障涯,是天一觀的道長(zhǎng)罐旗。 經(jīng)常有香客問我,道長(zhǎng)唯蝶,這世上最難降的妖魔是什么九秀? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粘我,結(jié)果婚禮上鼓蜒,老公的妹妹穿的比我還像新娘痹换。我一直安慰自己,他們只是感情好都弹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布娇豫。 她就那樣靜靜地躺著,像睡著了一般畅厢。 火紅的嫁衣襯著肌膚如雪冯痢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天框杜,我揣著相機(jī)與錄音浦楣,去河邊找鬼。 笑死咪辱,一個(gè)胖子當(dāng)著我的面吹牛振劳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播油狂,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼历恐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了选调?” 一聲冷哼從身側(cè)響起夹供,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤灵份,失蹤者是張志新(化名)和其女友劉穎仁堪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體填渠,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弦聂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氛什。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莺葫。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枪眉,靈堂內(nèi)的尸體忽然破棺而出捺檬,到底是詐尸還是另有隱情,我是刑警寧澤贸铜,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布堡纬,位于F島的核電站,受9級(jí)特大地震影響蒿秦,放射性物質(zhì)發(fā)生泄漏烤镐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一棍鳖、第九天 我趴在偏房一處隱蔽的房頂上張望炮叶。 院中可真熱鬧,春花似錦、人聲如沸镜悉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽积瞒。三九已至川尖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茫孔,已是汗流浹背叮喳。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缰贝,地道東北人馍悟。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剩晴,于是被迫代替她去往敵國(guó)和親锣咒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348