Node基礎(chǔ)

Node基礎(chǔ)

為什么學(xué)習(xí)Node?

  • IO優(yōu)勢
    • 對于文件讀寫,Node采用的是非阻塞IO
    • 傳統(tǒng)IO在讀寫文件的時(shí)候CPU來處理,而代碼執(zhí)行也處于等待中,浪費(fèi)性能
    • 非阻塞IO將讀寫操作交給CPU,而代碼正常執(zhí)行,減少等待浪費(fèi)的性能
  • 應(yī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 是一個后端語言 , 其具備操作文件的能力, 可以具備服務(wù)器的創(chuàng)建和操作能力
    • 其語法是JavaScript語法,代碼運(yùn)行在chrome V8 引擎之上

基本使用

  • 官網(wǎng)上下載 node-v-xx.msi 傻瓜式的安裝包 一路下一步,就ok
  • 檢測是否安裝成功 node -v
  • 運(yùn)行程序 node ./xxx.js

內(nèi)置對象介紹


分類

  • 全局對象: 何時(shí)何處都能訪問
  • 核心對象: 向系統(tǒng)索要,引入即可使用
  • 自定義對象: 按路徑引入即可

process(全局對象)

  • 每個系統(tǒng)的環(huán)境變量幾乎都不一樣,可以利用環(huán)境變量中的具體某個特定的值來區(qū)分不同的機(jī)器

  • process.env 是一個對象,我們可以通過其.屬性名來獲取具體的環(huán)境變量值

    • 設(shè)置一個特定的環(huán)境變量,以達(dá)到簡單區(qū)分不同的機(jī)器,從而針對生產(chǎn)/開發(fā)環(huán)境運(yùn)行不同的效果
  • process.argv 獲取命令行參數(shù)

filename/dirname(全局對象)

  • __filename 獲取當(dāng)前運(yùn)行文件的目錄,絕對路徑
  • __dirname 當(dāng)前運(yùn)行文件的絕對路徑

nodejs實(shí)現(xiàn)規(guī)范

  • CommonJS : 規(guī)范JavaScript語言作為后端語言運(yùn)行的標(biāo)準(zhǔn)
    • 具備什么能力,該怎么做 ,比如: 具備服務(wù)器的功能/ 可以操作文件 .....
    • 模塊應(yīng)該怎么寫: Module :
      • 1:依賴一個模塊 require('模塊名(id)')
      • 2: 需要被模塊依賴 module.exports = 給外部的數(shù)據(jù)
      • 3:一個文件是一個模塊

核心對象path

  • 1:const path = require('path');
  • 路徑 -> 在處理路徑的時(shí)候很擅長,但是,其不負(fù)責(zé)判斷路徑是否存在文件
  • 拼接并修正路徑 path. (__dirname,'a','b'); 以當(dāng)前目錄/a/b
  • path.resovle('./xxx') 相對轉(zhuǎn)絕對
  • 接收一個合法的路徑字符串,轉(zhuǎn)換成一個對象
    • let pathObj = path.parse(mypath);
  • 接收一個路徑對象,轉(zhuǎn)換成一個字符串路徑
    • let str = path.format(pathObj);
{ root: 'C:\\',
  dir: 'C:\\Users\\孫悟空',
  base: '金箍棒.txt',   // 該屬性可以用于修改文件名和后綴
  ext: '.txt',
  name: '金箍棒' }

  • 注意:path對象是方便我們操作路徑的,對于獲取來講: parse解析成對象,format轉(zhuǎn)換成字符串.join拼接并修正.... 對于修改路徑對象來講,可以用base屬性更改,不能用name,ext更改

模塊

  • 弊端
    • 在js中要涉及到邏輯,還要在html中,為邏輯對象考慮引用順序
    • 所有對象默認(rèn)都是全局對象,命名沖突
    • commonjs規(guī)范
    • 一個文件就是一個模塊
      • 導(dǎo)入用require('./xxx.js');
      • 導(dǎo)出用module.exports = xxx;
      • 在每一個模塊內(nèi)聲明的變量屬于模塊內(nèi)的作用域

fs文件模塊

  • 文件讀寫
  • 其他功能
  • 擴(kuò)展介紹

操作文件對象

  • IO

    • I :input輸入
    • O:output 輸出
    • 文件的操作就是IO
  • 復(fù)制文件的過程, I: 通過計(jì)算機(jī),存儲文件到剪切板

    • 粘貼到指定目錄: O: 通過計(jì)算機(jī),將剪切板上的數(shù)據(jù),寫出到 指定目錄
  • node中有兩種IO的操作

    • 同步IO

      • 一行代碼(讀文件)不執(zhí)行完畢...后續(xù)代碼不能執(zhí)行
    • 異步IO (建議)

      • 一行代碼(讀寫文件) 不執(zhí)行完畢(正在讀寫中) ... 后續(xù)代碼也可以執(zhí)行
    • 代碼體驗(yàn):

      • 讀寫文件

      • const fs = require('fs'); //必須這個名稱
        //讀 fs.readFile(路徑,回調(diào)函數(shù));
        //寫 fs.writeFile(路徑,數(shù)據(jù),回調(diào)函數(shù));
        
      • 總結(jié): 異步的讀/寫文件 參數(shù)1:都是路徑,可以相對可以絕對,最后一個參數(shù)都是回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù)中錯誤對象優(yōu)先

  • 同步和異步IO的區(qū)別: 同步IO會阻塞后續(xù)代碼執(zhí)行,異步IO不會阻塞后續(xù)代碼執(zhí)行

nginx負(fù)載均衡

  • [圖片上傳失敗...(image-cc710d-1557457943882)]

包(文件夾)

  • 多個文件,有效的被組織與管理的一個單位
  • 留一個入口

npm

  • 自己先有一個包描述文件
  • 創(chuàng)建一個包描述文件 npm init
  • 下載一個包 npm install art-template jquery@1.5.1 --save
    • 記錄依賴--save
  • 根據(jù)package.json文件中的dependencies屬性恢復(fù)依賴
    • 恢復(fù)包 npm install
  • 卸載一個包 npm uninstall jquery@1.5.1 --save
  • 查看包的信息
    • npm info jquery
  • 查看包的信息中的某個字段(版本)
    • 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ī)制

  • 我們未來可能需要辨識一個包中,入口是否是我們想要的啟動程序
  • 1:查找node_modules下的包名文件夾中的main屬性(常用)
  • 2:不常用:查找node_modules下的包名.js
  • 3:查找node_modules下的包名文件夾中的index.js(常用)

http核心模塊


http超文本傳輸協(xié)議

  • 協(xié)議至少雙方 -> http雙方??!
  • 客戶端(瀏覽器) -> 服務(wù)器
    • 原生應(yīng)用(QQ) -> 服務(wù)器

請求與響應(yīng)交互的過程

  • 見圖

主體對象

  • 服務(wù)器對象
  • 客戶端對象
  • 請求報(bào)文對象(對于服務(wù)器來說,是可讀)
  • 響應(yīng)報(bào)文對象(對于服務(wù)器來說,是可寫)

創(chuàng)建服務(wù)器步驟

  • 1:引入http核心對象
  • 2:利用http核心對象的.createServer(callback); 創(chuàng)建服務(wù)器對象
  • 3:使用服務(wù)器對象.listen(端口,ip地址) 開啟服務(wù)器
  • 4:callback(req,res) 根據(jù)請求處理響應(yīng)

請求對象

  • 請求首行中的url req.url
  • 請求首行中的請求方式 req.method
  • 請求頭中的數(shù)據(jù)req.headers 是一個對象
  • 頭信息中,也可以作為與服務(wù)器交互的一種途徑

獲取請求體數(shù)據(jù)

  • 代碼對比
  • 瀏覽器: $('#xx').on('submit',function(e){ })
  • 服務(wù)器: req.on('data',function(d){ d.toString(); })

querystring核心對象

  • querystring.parse(formStr)
  • username=jack&password=123轉(zhuǎn)換成如下
  • { username: 'jack', password: '123' }

響應(yīng)對象

  • 響應(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)

  • 頭行體
  • content-type是對請求或者響應(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容