2021-09-17 node

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的鏡像源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 客 戶端的JavaScript是怎樣的 什么是JavaScript? +是一個(gè)腳本語言 運(yùn)行在瀏覽器(瀏覽器...
    hcySam閱讀 522評(píng)論 0 2
  • Node.js 服務(wù)端開發(fā)要做的事情:實(shí)現(xiàn)網(wǎng)站的業(yè)務(wù)邏輯,數(shù)據(jù)的增刪改查。 Node是一個(gè)基于Chrome V8引...
    coder_shen閱讀 260評(píng)論 0 0
  • 技術(shù)交流QQ群:1027579432,歡迎你的加入! 歡迎關(guān)注我的微信公眾號(hào):CurryCoder的程序人生 1....
    CurryCoder閱讀 389評(píng)論 0 4
  • 個(gè)人入門學(xué)習(xí)用筆記、不過多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,654評(píng)論 1 37
  • NODE.JS 什么是node.js? Node.js? is a JavaScript runtime(運(yùn)行時(shí)、...
    渣一窩閱讀 748評(píng)論 0 1

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