1.什么是Node.js?
Node.js是一個(gè)基于"Chrome V8引擎"的JavaScript運(yùn)行環(huán)境
2.ChromeV8引擎是什么呢?
V8引擎是一款專門解釋和執(zhí)行JS代碼的虛擬機(jī),任何程序只要集成了V8引擎都可以執(zhí)行JS代碼NodeJS不是一門編程語(yǔ)言,只是一個(gè)運(yùn)行環(huán)境,就像windows,Linux,iOS等一樣沥曹。由于集成了V8引擎导坟,可以這個(gè)運(yùn)行環(huán)境可以執(zhí)行我們編寫的JS代碼闷游。這個(gè)運(yùn)行環(huán)境的最大特點(diǎn)是可以操作系統(tǒng)的底層API,通過這些API我們可以編寫出網(wǎng)頁(yè)中無(wú)法實(shí)現(xiàn)的功能
3.Global全局變量
__dirname:絕對(duì)路徑的文件夾打印結(jié)果:/Users/cc/Desktop/web/Web2/10-Node
__filename:絕對(duì)路徑的文件打印結(jié)果:/Users/cc/Desktop/web/Web2/10-Node
/05-js.js延遲執(zhí)行setTimeout(callback, delay[, ...args])定時(shí)器setInterval(callback, delay[, ...args])
4. NodeJS開發(fā)中的模塊NodeJS采用CommonJS規(guī)范實(shí)現(xiàn)了模塊系統(tǒng)在Node.js模塊系統(tǒng)中弓乙,每個(gè)文件都被視為一個(gè)獨(dú)立的模塊CommonJS規(guī)范CommonJS規(guī)范規(guī)定了如何定義一個(gè)模塊,如何暴露(導(dǎo)出)模塊中的變量函數(shù),以及如何使用定義好的模塊在CommonJS規(guī)范中一個(gè)文件就是一個(gè)模塊在CommonJS規(guī)范中每個(gè)文件中的變量函數(shù)都是私有的憨闰,對(duì)其他文件不可見的在CommonJS規(guī)范中每個(gè)文件中的變量函數(shù)必須通過exports暴露(導(dǎo)出)之后其它文件才可以使用在CommonJS規(guī)范中想要使用其它文件暴露的變量函數(shù)必須通過require()導(dǎo)入模塊才可以使用
定義一個(gè)07-a.js模塊內(nèi)容如下
let a =10;functionsum(c,b){returnc + b;}
// exports是一個(gè)對(duì)象
//暴露出去一個(gè)屬性變量exports.a = a;exports.fn = sum;
b.js文件中導(dǎo)入模塊
//導(dǎo)入a.js模塊let? obj = require("./07-a.js");
//打印 console.log(obj);let? res = obj.fn(10,10); console.log(res);
*****暴露模塊內(nèi)部變量的方式有多種?1.通過exports.xxx?= xxx導(dǎo)出
2.通過module.exports.xxx=xxx導(dǎo)出那么上述的a.js文件可以這樣寫
let? name ="CC";functionsum(c,b){return c +b;}
//暴露給外面變量/函數(shù)module.exports.name=name;module.exports.fn=sum;
3.通過全局變量global暴露(不建議使用這個(gè))
let? ?name ="CC";functionsum(c,b){return c +b;}? ?//暴露變量給外界global.str= name;? global.fn = sum;
注意: exports 和 module.exports的區(qū)別
在導(dǎo)入變量的時(shí)候拆宛,exports不能是直接將變量賦值,這樣在打印的時(shí)候的{}键袱,只能給exports對(duì)象添加一個(gè)屬性變量賦值暴露
導(dǎo)入模塊require需要注意一下幾點(diǎn)
1.require導(dǎo)入模塊時(shí)可以不添加導(dǎo)入模塊的類型后綴文件名
如果沒有指定導(dǎo)入模塊的類型, 那么會(huì)依次查找.js .json .node文件 無(wú)論是三種類型中的哪一種, 導(dǎo)入之后都會(huì)轉(zhuǎn)換成JS對(duì)象返回給我們 require可以導(dǎo)入"自定義模塊(文件模塊)"燎窘、"系統(tǒng)模塊(核心模塊)"、"第三方模塊"
***包和包管理工具所謂的包:就是來(lái)維護(hù)多個(gè)模塊之間的關(guān)系的模塊前面說過就是一個(gè)單一功能的函數(shù)包管理工具NPM(NodePackageManager)NPM不需要單獨(dú)安裝,只要配置好Node.js環(huán)境蹄咖,就會(huì)自動(dòng)安裝
npm install(i) -g 包名 安裝包?
npm uninstall -g 包名 卸載包
?npm update -g 包名 更新包 (更新失敗可以直接使用install)
?npm init -> 初始化package.json文件
?npm init -y -> 初始化package.json文件
npm install(i) 包名 --save?
npm install(i) 包名 --save-dev
Path路徑模塊
封裝了各種路徑相關(guān)的操作需要手動(dòng)投入這個(gè)模塊//導(dǎo)入系統(tǒng)Path模塊letpath=require("path");
1.獲取路徑path.dirname(path)? ? let res2 =path.dirname("user/location/index.html");? ??
//打印結(jié)果: user/location? ? console.log(res2);
2.拼接路徑path.join([...paths])? ? let str =path.join("/a/b","c");? ? ?
//打印結(jié)果: /a/b/c3.path.resolve([...paths]):
3.用于解析路徑// let res =path.resolve('/foo/bar','./baz'); // /foo/bar/baz? ? // let res =path.resolve('/foo/bar','../baz'); // /foo/baz? ? let res =path.resolve('/foo/bar','/baz'); // /baz? ? console.log(res);
fs文件模塊
需要手動(dòng)導(dǎo)入才可以使用
//1.導(dǎo)入文件模塊letfs =require("fs");
2.文件的讀取fs.readFile(path[, options], callback)
異步方法fs.readFileSync(path[, options])
//1導(dǎo)入文件模塊letfs =require("fs");
//導(dǎo)入路徑模塊letpath =require("path");
// __dirname絕對(duì)路徑文件夾
// join拼接路徑letfilePath? = path.join(__dirname,"data.txt");
//2.讀取文件fs.readFile(filePath,"utf8",function(err,data){//注意荠耽,如果第二個(gè)參數(shù)utf8不傳遞的話,返回的就是二進(jìn)制數(shù)據(jù)//傳遞的話就返回的事-字符串if(!err){//讀取成功后比藻,獲取的是二進(jìn)制數(shù)據(jù)console.log("讀取成功",data);? ? }else{console.log("讀取失敗",err);? ? }});
3.寫入文件數(shù)據(jù)fs.writeFile(file, data[, options], callback)
異步方法fs.writeFileSync(file, data[, options])//導(dǎo)入文件模塊letfs =require("fs");
//導(dǎo)入路徑模塊letpath =require("path");/
/拼接路徑letfilePath =? path.join(__dirname,"cc.txt");
//異步寫入數(shù)據(jù)//參數(shù)一:寫入的文件路徑//參數(shù)二:寫入的內(nèi)容//參數(shù)三:編碼方式//參數(shù)四:失敗的回調(diào)fs.writeFile(filePath,"我是CC","utf8",function(err){console.log(err);if(err){thrownewError("寫入失敗");? }else{console.log("寫入成功");? }? ? });
//同步寫入數(shù)據(jù)letfileSyncPath =? path.join(__dirname,"Sync.txt");letres = fs.writeFileSync(fileSyncPath,"同步寫入數(shù)據(jù)","utf8");console.log(res);
關(guān)于簡(jiǎn)單認(rèn)識(shí)node.js模塊化開發(fā)
模塊化開發(fā) 傳統(tǒng)非模塊化開發(fā)有如下的缺點(diǎn): 1铝量、命名沖突 2、文件依賴
前端標(biāo)準(zhǔn)的模塊化規(guī)范: 1银亲、AMD - requirejs 2究反、CMD - seajs
服務(wù)器端的模塊化規(guī)范: 1敷钾、CommonJS - Node.js
模塊化相關(guān)的規(guī)則: 1、如何定義模塊:一個(gè)js文件就是一個(gè)模塊,模塊內(nèi)部的成員都是相互獨(dú)立 2峦阁、模塊成員的導(dǎo)出和引入
模塊文件的后綴3種情況:.js .json .node 上述三種模塊的加載優(yōu)先級(jí)(不加文件后綴時(shí)的優(yōu)先級(jí)):.js -> .json -> .node
導(dǎo)出 module.exports = { sum : sum, subtract : subtract }
引入 var mod= require('./01.js');
express模塊
服務(wù)器相關(guān)
服務(wù)器:1荧库,服務(wù)器是一臺(tái)電腦 2砍鸠,服務(wù)器軟件(apach tomcat iis ngnix node) 3.服務(wù)器ip 和 端口號(hào)(80)
局域網(wǎng):服務(wù)器通過網(wǎng)線(無(wú)線連接) 每個(gè)電腦都會(huì)有一個(gè)ip
外網(wǎng):
ip:確定服務(wù)器主機(jī)的位置
port(端口):確定服務(wù)器里的某個(gè)程序
api接口的書寫
接受數(shù)據(jù)
-- get req.query
-- post req.body 需要body-parser 插件進(jìn)行解析
注意數(shù)據(jù)格式 json x-www-form-urencode formdata
中間件 multer
內(nèi)置中間件 static
自定義中間件 (全局和局部)
第三方中間件 (body - parser)
在合適的地方執(zhí)行next
靜態(tài)資源目錄 static (類似apache的www)
非關(guān)系數(shù)據(jù)庫(kù)(文檔) mongodb
1.下載
2.安裝
處理異步的常用方式
promise asyc/awiat (es7)
promise //解決異步回調(diào)處理
封裝的promise函數(shù)有兩個(gè)參數(shù)(reslove湃望,reject)并且會(huì)執(zhí)行兩個(gè)外部函數(shù)then和catch
執(zhí)行reslove表示成功,外部會(huì)走then()函數(shù)院喜;亡蓉;執(zhí)行reject表示失敗,外部會(huì)走catch()函數(shù)
封裝好promise后可以進(jìn)行鏈?zhǔn)秸{(diào)用喷舀,只需要一個(gè)catch()