node是什么
- node 是基于chrome v8引擎的javascript運(yùn)行時(shí)環(huán)境。 node使用了事件驅(qū)動(dòng)和非阻塞I/O模型,使其輕量高效。node的包管理器是npm
- 查看更多node相關(guān)
node的安裝(mac)
//1. 安裝nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
//2. 安裝node指定版本
nvm install 8.11.3
//3. 使用指定版本
nvm use 8.11.3
//4. 查看node版本
node -v
//5. 用cnpm替換npm提高下載模塊速度
npm i cnpm -g
相關(guān)概念
- node的主線程是單線程的
- web異步方式有:setTimeout, callback, onClick, ajax
- 同步/阻塞,異步/非阻塞;同步是針對(duì)應(yīng)用程序執(zhí)行流程來(lái)說(shuō)的,阻塞是針對(duì)內(nèi)核輸入輸出來(lái)說(shuō)的;異步和非阻塞也是同樣的道理
4.i/o操作, 就是讀寫(xiě)操作,能用異步就不要用同步 - 區(qū)分環(huán)境變量,代碼里通過(guò)
process.env.NODE_ENV;
export NODE_NEV=XXX;//linux
set NODE_ENV=XXX;//window
- process.nextTick(function(){})//異步的,當(dāng)前隊(duì)列的底步,同步之后的執(zhí)行
setImmediate(function(){})//放入到第二個(gè)隊(duì)列中
setTimeout(function(){})//也是放在第二個(gè)隊(duì)列,如果不加參數(shù)是跟setImmediate一樣,哪個(gè)先執(zhí)行,不一定;如果需要設(shè)置時(shí)間需要用setTimeout
7.剩余運(yùn)算符(...如果放在形參里面就是剩余運(yùn)算符)(es6語(yǔ)法)
通過(guò)...剩余運(yùn)算符,將所有的參數(shù)放到args數(shù)組里面
setTimeout((...args) => {
console.log(args.length)
},100, '吃飯’)
- 展開(kāi)運(yùn)算符(...如果放在實(shí)參里面就是展開(kāi)運(yùn)算符)(es6語(yǔ)法)
function add($1,$2) {
console.log($1,$2)
}
add(...[1,3]);
- 合并對(duì)象(用...擴(kuò)展運(yùn)算符,es7語(yǔ)法,需要node版本8.5以上)
let obj1 = {name:'miaozhirui'};
let obj2 = {age:18}
let obj3 = {...obj1, ...obj2};
console.log(obj3)
- node 里面的js文件有個(gè)全局變量arguments,該參數(shù)表示的是外層的閉包的形參,值有以下幾個(gè),這幾個(gè)參數(shù)可以在文件中直接使用
exports requre module __filename __dirname
- 模塊化的作用: 低耦合,高內(nèi)聚,把實(shí)現(xiàn)相同功能的代碼放在一個(gè)文件(高內(nèi)聚),把實(shí)現(xiàn)不同功能的代碼分開(kāi)成不同的文件(低耦合);方便維護(hù);防止代碼沖突(命名沖突)
- 實(shí)現(xiàn)模塊化的方式有哪些:閉包和單例;單例最終被淘汰,在js里面單例就是定義了字面量對(duì)象,一個(gè)人用obj對(duì)象,另一個(gè)人也用了obj對(duì)象,并不能保證唯一沖突, 還是會(huì)導(dǎo)致沖突,所以最終被淘汰了,
- 瀏覽器端通過(guò)閉包實(shí)現(xiàn)的模塊化主要有兩種規(guī)范,一個(gè)是CMD, 一個(gè)是AMD(瀏覽器端的模塊規(guī)范,seajs是CMD的代表作(就近依賴(lài)),requirejs是AMD的代表作(依賴(lài)前置))
- nodejs實(shí)現(xiàn)模塊化的規(guī)范是基于commonjs,規(guī)范定義了以下規(guī)則
1. 定義如何創(chuàng)建一個(gè)模塊:一個(gè)js文件就是一個(gè)模塊
2. 定義如何使用一個(gè)模塊: 使用一個(gè)文件只需要require一個(gè)文件
3. 定義如何導(dǎo)出一個(gè)模塊: exports/module.exports
- nodejs里面如果一個(gè)函數(shù)是異步函數(shù)的話,一般都有回調(diào)函數(shù)
- exports和module.exports的區(qū)別: exports和module.exports都指向了同一個(gè)對(duì)象,但是模塊最終導(dǎo)出的是module.exports, 也就是說(shuō)如果導(dǎo)出的時(shí)候是
exports=demo,這句話其實(shí)是不生效的,這句話只是給exports重新復(fù)制了,但是module.exports指向的對(duì)象并沒(méi)有變化 - utils.isArray 和utils.isFunction, utils.inherits(繼承共有方法)
- util.promisify把普通的帶有回調(diào)函數(shù)的方法轉(zhuǎn)成promise
//要想一個(gè)函數(shù)執(zhí)行完之后具有then方法,只需要執(zhí)行完成之后,返回promise即可
read().then(function(data){},function(error){})
//所以read方法可以像下面這樣寫(xiě)
function read(){
//resolve和reject都是函數(shù),當(dāng)調(diào)用resolve會(huì)調(diào)用then的第一個(gè)方法;當(dāng)調(diào)用reject會(huì)調(diào)用then的第二個(gè)參數(shù)
return new Promise((resolve, reject) => {
})
}
############## 以上的方法太麻煩了 ################
let util = require('util');
let fs = require('fs');
let readFile = util.promisify(fs.readFile);//將函數(shù)promisify化
readFile('2.js', 'utf8').then(function (data) {
console.log(data)
}, function (error) {
console.log(error)
})
模塊的安裝
-
全局安裝
- npm i xxx -g (只能在命令行中使用)
- npm root -g 可以查看全局安裝的包安裝到哪里了
- nvm是切換node的版本的,用來(lái)管理的node的版本,可以安裝在全局
- nrm是切換npm的源,具體使用如下
//安裝 cnpm i nrm -g nrm ls nrm use taobao //切換倉(cāng)庫(kù)源- http-server模塊的使用,用來(lái)啟動(dòng)一個(gè)server,如果想以哪個(gè)目錄作為根目錄建server,就進(jìn)入到哪個(gè)目錄,執(zhí)行http-server集合
npm http-server -g cd /demo http-server;- 可以基于node第三方模塊idoc模塊新建一個(gè)博客模板
-
本地安裝
- 本地安裝沒(méi)有-g參數(shù),安裝之前需要在目錄里面初始化,用來(lái)記錄安裝的依賴(lài)
- npm init -y 會(huì)在當(dāng)前目前新增加一個(gè)package.json文件
- 當(dāng)在某個(gè)目錄下安裝第三方模塊的時(shí)候,會(huì)先在當(dāng)前目錄找package.json文件; 如果找不到,會(huì)到父及目錄找,找不到才會(huì)在當(dāng)前目錄下安裝
- package.json中的scripts可以配置快捷命令腳本
npm run dev - 本地的依賴(lài)分為開(kāi)發(fā)依賴(lài)和項(xiàng)目依賴(lài);項(xiàng)目依賴(lài)是開(kāi)發(fā)時(shí)需要,上線也需要;開(kāi)發(fā)依賴(lài)是開(kāi)發(fā)時(shí)需要,上線時(shí)不需要;
//安裝項(xiàng)目依賴(lài) npm install jquery --save //刪除項(xiàng)目依賴(lài) npm uninstall jquery --save // 安裝開(kāi)發(fā)依賴(lài) npm install less -D || npm i less --save-dev //刪除開(kāi)發(fā)依賴(lài) npm uninstall less --save-dev //安裝全部依賴(lài) npm install //會(huì)把package.json文件里面記錄的依賴(lài)全部安裝上 //安裝指定版本 npm install jquery@xxx
發(fā)布包
- 先回到國(guó)外
nrm use npm - 包名不能和已有的包名相同
- 需要一個(gè)入口文件來(lái)做整合
-
npm whoami//查看當(dāng)前用戶(hù)是誰(shuí) - 注冊(cè)賬號(hào)
npm addUser - 如果有賬號(hào)的話
npm login輸入賬號(hào)即可 - 發(fā)包
npm publish [floder]//不帶floader表示發(fā)布當(dāng)前目錄
buffer
-
概念
- 概念: buffer是
緩沖區(qū),就是暫時(shí)用來(lái)存放輸入輸出數(shù)據(jù)的一段內(nèi)存 - 引入原因: js語(yǔ)言沒(méi)有二進(jìn)制數(shù)據(jù)類(lèi)型,而在處理TCP流和文件流的時(shí)候,必須要
處理二進(jìn)制數(shù)據(jù) - Nodejs提供了一個(gè)Buffer對(duì)象來(lái)提供對(duì)二進(jìn)制數(shù)據(jù)的操作
- buffer對(duì)象是一個(gè)表示
固定內(nèi)存分配的全局對(duì)象,也就是說(shuō)要放到緩存區(qū)中的字節(jié)數(shù)需要提前確定 - buffer好比由多位自己元素組成的數(shù)組,可以有效的在javascript中表示二進(jìn)制數(shù)據(jù)
- buffer里面存放的是16進(jìn)制
- 概念: buffer是
-
字節(jié)
- 計(jì)算機(jī)最小存儲(chǔ)計(jì)量單位是:BIT(位) 二進(jìn)制數(shù)據(jù)
- 計(jì)算機(jī)最基本存儲(chǔ)計(jì)量單位是:Bytes(字節(jié))
1024bytes = 1k 8bit(8個(gè)二進(jìn)制) = 1bytes 1個(gè)漢字(3個(gè)bytes) 1個(gè)字節(jié)轉(zhuǎn)成十進(jìn)制最大是255 1個(gè)字節(jié)最大轉(zhuǎn)換成16進(jìn)制是ff -
定義buffer的三種方式
- 通過(guò)長(zhǎng)度定義buffer(最常用)
let buffer = Buffer.alloc('6'); let buffer = Buffer.allocUnsafe(6);- 通過(guò)數(shù)組定義buffer
let buffer = Buffer.from([1,2,3,4])- 字符串創(chuàng)建buffer(把字符串轉(zhuǎn)成buffer)
let buffer = Buffer.from('珠峰培訓(xùn)') -
buffer轉(zhuǎn)成字符串
buffer.toString()