typora-copy-images-to: media
node
簡(jiǎn)介
node.js是瀏覽器的js引擎。
瀏覽器中有一個(gè)js引擎用來解析js代碼,只能解析js代碼中的ECMAScript,dom和bom的解析依賴的是瀏覽器本身。
將這個(gè)js引擎單獨(dú)拿出來,就是node了。
node.js和js的關(guān)系
node.js和js的關(guān)系
要讓這個(gè)引擎運(yùn)行起來,有人將他做成了一個(gè)軟件,安裝在電腦上,js代碼就不用依賴瀏覽器運(yùn)行了,在電腦的命令行也能運(yùn)行js代碼。
為什么要這么做?因?yàn)檫@樣的話,js就能寫后臺(tái)了。
官網(wǎng):https://nodejs.org/en/
中文網(wǎng):http://nodejs.cn/
初體驗(yàn)
在命令行運(yùn)行js代碼:
node
console.log(123);
Math.max(1,3,6,9,3,2,5,8);
運(yùn)行結(jié)果和瀏覽器的控制臺(tái)中的結(jié)果是一致的。
退出命令行:
.exit// 或者按兩次ctrl+c
在命令行運(yùn)行js文件:
新建test.js文件寫入下面代碼:
for(leti=1;i<=3;i++){
console.log(i);
}
在命令行中輸入:
node文件路徑
執(zhí)行結(jié)果:
運(yùn)行一個(gè)文件
簡(jiǎn)單的命令
盤符:# 進(jìn)入某個(gè)盤符
cd目錄# 進(jìn)入某個(gè)目錄? -? cd /
cd..# 回到上一級(jí)目錄 - 一樣
dir# 查看當(dāng)前文件夾中的文件和文件夾 - ls ?
tree# 查看當(dāng)前文件夾中的所有文件和文件夾包括子文件夾及其文件,樹狀結(jié)構(gòu)
cls# 清屏 - clear
ipconfig# 查看當(dāng)前電腦的網(wǎng)管信息 - ifconfig
systeminfo# 查看當(dāng)前電腦的配置信息
md 文件夾名# 新建文件夾 - mkdir ? make directory
rd 文件夾名# 刪除文件夾 - rm -rf 文件夾 ? remove? directory
xcopy 文件夾 新文件夾名# 復(fù)制文件夾,并起新的名字 - cp 源文件 目標(biāo)文件
type nul> 文件名# 新建文件 - touch? 文件名
copy 文件名 新文件名# 復(fù)制文件,并起新的名字
echo內(nèi)容 > 文件名# 給文件中寫入內(nèi)容
move 文件路徑 新的路徑# 將文件移動(dòng)到新的路徑
ren 文件名 新的文件名# 將文件重命名
del 文件名# 刪除一個(gè)文件 - rm -rf 文件名
在vscode中,自帶了命令行,可以直接在編輯器中執(zhí)行命令:
ctrl+` # 打開編輯器的命令行
或者: 在文件上右擊 “用命令打開”
導(dǎo)入導(dǎo)出
在實(shí)際開發(fā)中,一般是每個(gè)人完成一個(gè)功能,然后將多個(gè)功能組合在一起,從而完成整個(gè)項(xiàng)目。我們將這個(gè)過程叫做模塊化開發(fā)。每個(gè)文件都是一個(gè)單獨(dú)的模塊。
每個(gè)人開發(fā)的功能都是一個(gè)單獨(dú)的文件,要將多個(gè)文件組合在一起,需要將這多個(gè)文件導(dǎo)出,然后在一個(gè)最終的項(xiàng)目文件中導(dǎo)入。
導(dǎo)出:
每個(gè)文件都有一個(gè)對(duì)象:module。這個(gè)對(duì)象中有一個(gè)屬性叫做exports,值也是一個(gè)對(duì)象,默認(rèn)是一個(gè)空對(duì)象。當(dāng)前文件默認(rèn)導(dǎo)出的就是這個(gè)exports對(duì)象,導(dǎo)出的內(nèi)容都寫在這個(gè)對(duì)象中。
module={
exports:{
name:"張三"
?? }
}
這個(gè)對(duì)象默認(rèn)是存在的,所以不用重新賦值,直接添加內(nèi)容即可。例:
module.exports.name='張三';
module.exports.age=20;
導(dǎo)入:
將另一個(gè)文件中導(dǎo)出的內(nèi)容接收起來。
varres=require(要導(dǎo)入的文件);// 返回值就是文件導(dǎo)出的內(nèi)容:module.exports對(duì)象
內(nèi)置模塊
在node中,模塊分三種:
內(nèi)置模塊,node系統(tǒng)自帶的一些文件模塊
自定義模塊,自己的一些文件
第三方模塊,雷鋒寫好的,下載來使用
fs模塊
這個(gè)模塊主要用來操作文件:讀取、寫入文件。
node系統(tǒng)自帶的,直接引入進(jìn)來使用。
constfs=require("fs");
寫入文件
異步寫入
fs.writeFile(被寫入的文件,寫入的內(nèi)容,寫入完成后執(zhí)行的回調(diào)函數(shù));// 這個(gè)操作是異步的
使用說明:
文件存在則寫入,文件不存在則創(chuàng)建文件寫入。
文件中沒內(nèi)容就直接寫,有內(nèi)容會(huì)覆蓋寫入。
例:
constfs=require("fs");
fs.writeFile("./test.txt","hello node",function(){
console.log("寫入完成!");
});
console.log(123);
執(zhí)行結(jié)果:
異步寫入結(jié)果
同步寫入
fs.writeFileSync(被寫入的文件,寫入的內(nèi)容);// 這個(gè)操作是同步的
例:
constfs=require("fs");
fs.writeFileSync("./test.txt","hello node",function(){
console.log("寫入完成!");
});
console.log(123);
執(zhí)行結(jié)果:
同步寫入結(jié)果
讀取文件
異步讀取
fs.readFile(要讀取的文件,[讀取文件編碼方式],讀取成功后執(zhí)行的回調(diào)函數(shù));
使用說明:
可選項(xiàng)參數(shù)是讀取文件使用的編碼方式,可以寫utf-8
回調(diào)函數(shù)中需要兩個(gè)參數(shù),參數(shù)1為錯(cuò)誤對(duì)象,讀取成功為undefined,讀取失敗為錯(cuò)誤信息;參數(shù)2為讀取的結(jié)果。如果沒有編碼方式,讀取的是一個(gè)buffer,使用16進(jìn)制來描述二進(jìn)制數(shù)據(jù),需要轉(zhuǎn)為字符串查看。
例:
varfs=require("fs");
/*fs.readFile("./a.txt",(err,data)=>{
? ? if(err){
? ? ? ? console.log("讀取失敗,錯(cuò)誤為:",err);
? ? ? ? return
? ? }
? ? console.log("讀取成功,數(shù)據(jù)為:",data.toString());
});*/
fs.readFile("./a.txt","utf-8",(err,data)=>{
? ? if(err){
? ? ? ? console.log("讀取失敗,錯(cuò)誤為:",err);
? ? ? ? return
? ? }
? ? console.log("讀取成功,數(shù)據(jù)為:",data);
});
console.log(123);
讀取結(jié)果:
異步讀取文件結(jié)果
同步讀取
fs.readFileSync(要讀取的文件[,讀取文件的編碼]);
使用說明:返回讀取的結(jié)果
例:
varfs=require("fs");
/*
var data = fs.readFileSync("./a.txt");
console.log("讀取成功,數(shù)據(jù)為:",data);
*/
vardata=fs.readFileSync("./a.txt","utf-8");
console.log("讀取成功,數(shù)據(jù)為:",data);
console.log(123);
讀取結(jié)果:
同步讀取文件結(jié)果
http模塊
node做后端,沒有現(xiàn)成的服務(wù)器,需要使用http這個(gè)模塊。
引入模塊:
consthttp=require("http");
利用這個(gè)模塊做服務(wù)器:
// 創(chuàng)建服務(wù)器,返回這個(gè)服務(wù)的名稱
varserver=http.createServer(function(){
// 處理客戶端的請(qǐng)求
console.log("有請(qǐng)求");
});
// 監(jiān)聽端口
server.listen(9988);// 端口號(hào)要大于5000,不要使用6661~6669
啟動(dòng)文件,服務(wù)器就啟動(dòng)了,一直是阻塞狀態(tài),等待客戶端的請(qǐng)求進(jìn)來:
啟動(dòng)服務(wù)器結(jié)果
創(chuàng)建服務(wù)器的回調(diào)函數(shù)有兩個(gè)參數(shù):參數(shù)1是請(qǐng)求的信息,參數(shù)2是響應(yīng)信息:
http.createServer(function(request,response){
// 處理客戶端的請(qǐng)求
console.log(request);
response.end("你的請(qǐng)求成功");
});
request中包含所有請(qǐng)求的信息,請(qǐng)求行,請(qǐng)求頭,請(qǐng)求空行,請(qǐng)求主體,如下圖:
請(qǐng)求信息
response是服務(wù)器給客戶端響應(yīng)的信息,可以自己設(shè)置,常用的屬性和方法:
res.write(data): 給瀏覽器發(fā)送請(qǐng)求體,可以調(diào)用多次,從而提供連續(xù)的請(qǐng)求體
res.end(); ? 通知服務(wù)器,所有響應(yīng)頭和響應(yīng)主體都已被發(fā)送,即服務(wù)器將其視為已完成。
res.end(data); 結(jié)束請(qǐng)求,并且響應(yīng)一段內(nèi)容,相當(dāng)于res.write(data)+res.end()
res.statusCode: 響應(yīng)的的狀態(tài)碼200404500
res.statusMessage: 響應(yīng)的狀態(tài)信息, OK Not Found ,會(huì)根據(jù)statusCode自動(dòng)設(shè)置。不能賦值中文
res.setHeader(name, value); 設(shè)置響應(yīng)頭信息, 比如content-type
res.writeHead(statusCode, statusMessage, options); 設(shè)置響應(yīng)頭,同時(shí)可以設(shè)置狀態(tài)碼和狀態(tài)信息。
注意:必須先設(shè)置狀態(tài)碼,再設(shè)置響應(yīng)頭,最后設(shè)置響應(yīng)主體,順序不能亂。?
例:
consthttp=require("http");
constserver=http.createServer();
server.on("request",function(req,res){
? ? // 設(shè)置狀態(tài)行和響應(yīng)頭
? ? // 語法:res.writeHead(狀態(tài)碼,狀態(tài)文本,{響應(yīng)頭});
? ? res.writeHead(404,'ccc',{'content-type':'text/html'});
? ? res.end("ok");
});
server.listen(9988,function(){
? ? console.log("服務(wù)器啟動(dòng)成功");
});
查看響應(yīng)信息:
自定義的響應(yīng)結(jié)果
npm
第三方模塊是別人寫好的一些文件,我們要使用這些文件,就需要下載。
node提供了一個(gè)工具,叫做npm,專門用來管理這些模塊??梢韵螺d,可以更新。。。,npm除了可以管理第三方模塊,還可以管理一些框架、插件和庫。所以npm叫做包管理器,我們將模塊、插件、庫統(tǒng)稱為包。
npm這個(gè)工具在安裝node的時(shí)候會(huì)自帶npm。
npm可以連接到各個(gè)插件、框架、模塊、庫的下載地址,使用的時(shí)候需要在命令執(zhí)行命令。
下載命令:
npminstall 包名# 下載一個(gè)包
例:下載jquery
npminstall jquery# 下載jquery
下載完成后,會(huì)在當(dāng)前文件夾中新建一個(gè)文件叫node_modules,在這個(gè)文件夾中有一個(gè)文件夾叫做jquery,這就是下載成功的包。
下載jquery的示意圖
使用說明:
install關(guān)鍵字可以簡(jiǎn)寫為i
默認(rèn)下載的是最新版本,要下載指定版本可以在包名后面加@版本號(hào)
可以同時(shí)下載多個(gè)包,多個(gè)包名中間用空格隔開
每次下載會(huì)自動(dòng)生成一個(gè)文件:package-lock.json,里面下載的各種信息
如果某個(gè)包不想使用了,可以使用命令進(jìn)行卸載:
npmuninstall 包名
package.json這個(gè)文件用來描述當(dāng)前項(xiàng)目的各種信息。通常一個(gè)項(xiàng)目中會(huì)使用到很多的包、庫、模塊、插件等等,到項(xiàng)目完成的時(shí)候,node_modules這個(gè)文件夾會(huì)很大,如果要上線了或者要放到別的地方運(yùn)行,將這個(gè)文件夾復(fù)制的話,會(huì)很大。解決這個(gè)問題,可以使用package.json。在這個(gè)文件中可以將項(xiàng)目依賴的包的信息,寫進(jìn)去,以后別人拿到這個(gè)文件就能知道,這個(gè)項(xiàng)目依賴的包有哪些。
如何使用這個(gè)文件:
npminit
命令執(zhí)行后,需要根據(jù)提示輸入項(xiàng)目的信息。
如果不想輸入很多信息,可以全部使用默認(rèn)值:
npminit-y
如果要使用默認(rèn)的話,當(dāng)前文件夾名不能是中文
有了這個(gè)文件后,再下載包的話,文件中就會(huì)添加依賴的包的信息:
{
"name":"03-npm",//描述了包的名字,不能有中文
"version":"1.0.0",//描述了包的的版本信息, x.y.z? 如果只是修復(fù)bug,需要更新Z位。如果是新增了功能,但是向下兼容,需要更新Y位。如果有大變動(dòng),向下不兼容,需要更新X位。
"description":"",//包的描述信息
"main":"index.js",//入口文件(模塊化加載規(guī)則的時(shí)候詳細(xì)的講)
"scripts": {//配置一些腳本,在vue的時(shí)候會(huì)用到,現(xiàn)在體會(huì)不到
"test":"echo \"Error: no test specified\" && exit 1"
? },
"keywords": [],//關(guān)鍵字(方便搜索)
"author":"",//作者的信息
"license":"ISC",//許可證,開源協(xié)議
"dependencies": {//重要,項(xiàng)目的依賴, 方便代碼的共享? 通過 npm install可以直接安裝所有的依賴項(xiàng)
"bootstrap":"^3.3.7",
"jquery":"^3.3.1"
? }
}
別人拿到這個(gè)文件,只需要執(zhí)行命令就可以將項(xiàng)目依賴的包都下載下來:
npmi
如果安裝失敗, 可以通過以下命令清除npm緩存:
npmcache clean-f//-f強(qiáng)制清除
# 或者在執(zhí)行完命令再刪除緩存文件夾
上面安裝的包,都是只能在當(dāng)前文件夾使用,如果將項(xiàng)目文件放到別的地方,就找不到安裝的依賴包了,我們將這種安裝方式叫做局部安裝。
還有一種安裝方式叫做全局安裝,只需要在當(dāng)前電腦上安裝一次,在電腦的任何地方都能使用。
局部安裝只是在當(dāng)前文件夾中安裝,全局安裝是安裝在當(dāng)前電腦上。
全局安裝命令:
npminstall--global包名;
npminstall-g包名;
nrm
npm在下載包的時(shí)候,默認(rèn)下載地址在國外,有時(shí)候網(wǎng)速不太好。所以node提供了一個(gè)工具用來管理npm下載工具,可以改變npm的下載地址,這個(gè)工具就是nrm。
nrm這個(gè)工具不自帶,需要手動(dòng)下載安裝:
npmi-gnrm
檢測(cè)是否安裝成功:
nrm--version
nrm的使用:
nrm test# 用來檢測(cè)哪個(gè)地址下載速度快一些,當(dāng)前使用地址前面會(huì)帶*
現(xiàn)在有很多網(wǎng)址,將常用的工具放上去,供人們下載,我們將這些網(wǎng)址叫做鏡像源。
測(cè)試出來的結(jié)果:鏡像源名稱 ---- 網(wǎng)速,我們挑選網(wǎng)速最快的鏡像源地址使用:
nrm use taobao# 將下載地址切換成taobao的鏡像源