目錄
Node.js入門
什么是Node.js
Node.js的作用
Node.js安裝
Node.js編碼注意事項
Buffer(緩沖器)
定義
使用
fs模塊
概念
文件寫入
文件讀取
文件移動與重命名
文件刪除
文件夾操作
查看資源狀態
路徑問題
path模塊
Node.js入門
什么是Node.js
何為Node.js,官方的定義是:Node.js是一個開源的,跨平臺的JavaScript運行環境。簡單的來講,Node.js就是一款應用程序,是一款軟件,它可以運行JavaScript。
Node.js的作用
它的主要功能有:開發服務器應用,讓我們可以通過向服務器發送請求,服務器可以返回我們想要的數據。
開發工具類應用:我們熟悉的Webpack,Vite以及Babel,可以提高我們前端的開發效率與質量。而它們三者都是借助Node.js的開發能力而實現的。
開發桌面端應用,比如我們熟悉的VScode,它是借助electron框架實現的,而electron又是借助與Node.js開發出來的。
Node.js安裝
如何進行安裝呢?可以打開Nodo.js對應的官網:Node.js。會出現以下的界面,然后可以點擊進行安裝,一般都是點擊右邊的,因此左邊的版本會長期維護,也是官方推薦使用的。
但是由于Node.js官網是在國外,因此可以下載會比較慢,也可以直接訪問國內的網站:Node.js 中文網。下載方式相同,還可以查看并選擇之前的所有的Node.js版本CNPM Binaries Mirror。點擊對應自己想要的版本下載即可。一路next,下載完畢之后,打開命令窗口,輸入node -v來進行判斷是否安裝成功,若有輸出版本即表示安裝成功。
Node.js編碼注意事項
在瀏覽器中的JavaScript包括兩大塊,其一為核心語法:ECMAScript。其二為Web API,包括:DOM,BOM,AJAX,Storage,console,定時器以及alter等。而在Node.js中的JavaScript,核心語法也是ECMAScript,不同點在于它有屬于自己的Node API,包括:fs,url,http,util,console,定時器,path等。
在Node.js中不能使用BOM和DOM的API,可以使用console和定時器API。Node.js中的頂級對象為global,也可以用globalThis訪問頂級對象。
Buffer(緩沖器)
定義
使用
創建的方式有如下的三種:第一種使用Buffer.alloc。創建的時候會申請內存空間,傳入的數字為需要申請多少字節數的Buffer,它會讓每一個字節的值都為0。
第二種使用Buffer.allocUnsafe,使用它是需要注意,用它創建的buffer中可能會存在舊的數據,可能會影響執行的結果,但是它的創建速度會比使用Buffer.alloc快。
第三種是使用Buffer.from進行創建,它可以傳入字符串或者數組來進行創建Buffer。在控制臺輸出的是十六進制。
// 1.alloc
let buf=Buffer.alloc(10);
console.log(buf);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 2.allocUnsafe
let buf2=Buffer.allocUnsafe(10);
console.log(buf2);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 3.from
let buf3=Buffer.from('hello');
let buf4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf3)//<Buffer 68 65 6c 6c 6f>
console.log(buf4)//<Buffer 69 6c 6f 76 65 79 6f 75>
我們可以使用toString方法來將Buffer轉為字符串。toString默認是按照utf-8編碼方式來進行轉換的。
let buf = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf.toString())//iloveyou
除此之外,我們也可以讀取以及修改Buffer,通過使用[ ]的方式來對數據進行處理。
let buf = Buffer.from('hello');
// 讀取下標為4的字符
console.log(buf[4])//111
// 對其進行修改
buf[4]=98;
// 讀取對應的字符串
console.log(buf.toString())//hellb
注意:?如果修改的數值超過255?,則超過 8 位數據會被舍棄 。?一個 utf-8 的字符一般?占 3 個字節。
fs模塊
概念
文件寫入
// 導入fs模塊
const fs=require("fs");
// 寫入文件
fs.writeFile('./study.txt','今天學習Node.js',err=>{if(err){console.log("寫入失敗");return;}console.log('寫入成功');
});
當我們執行js文件之后,我們就可以在同級的目錄下創建一個名為study.txt,里面編寫了“今天學習Node.js”的txt文件。若本身該目錄下就有對應的文件,則它會重新編寫里面的內容。
我們還可以采取writeFileSync進行文件的寫入,相比于writeFile方式,它是一種同步的執行方式,并且它只有三個參數,沒有最后一個回調函數的參數。寫法如下:
// 導入fs模塊
const fs=require("fs");
fs.writeFileSync('./study.txt','這是一個同步的寫入')
補充:可能有一些小伙伴對同步以及異步還不太清楚,說白了同步就是順序的執行,主線程 會等待其他線程的執行結果,然后再繼續執行主線程的代碼,效率較低。而異步不是順序執行的。主線程不會等待其他線程的執行結果,直接執行后續的主線程代碼,效率較高。
那你有沒有想過,若我們想要在原本的文件中繼續編寫東西,不覆蓋原先編寫的內容,那我們該如果實現呢?我們可以使用到前面介紹的writeFile方法,在第三個參數中設它的配置項為:{flag:'a'}即可實現文件內容的追加。
// 導入fs模塊
const fs=require("fs");
// 寫入文件
fs.writeFile('./study.txt','并且發布一篇博客!',{flag:'a'},err=>{if(err){console.log("寫入失敗");return;}console.log('寫入成功');
});
除了使用以上的方式進行追加,還可以使用appendFile / appendFileSync 進行追加寫入。appendFile 語法與 writeFile 語法完全相同。都是異步的,而appenFileSync則與writeFileSync相似,都是同步的。不同點在與一個是寫入,一個是進行追加。
// 導入fs模塊
const fs=require("fs");
// 使用appendFile寫入文件
fs.appendFile('./study.txt','并且發布一篇博客!',err=>{if(err){console.log("寫入失敗");return;}console.log('寫入成功');
});
//使用appendFileSync
fs.appendFileSync('./study.txt','然后睡覺');
// 若想要換行使用/r/n
fs.appendFileSync('./study.txt','\r\n然后睡覺');
接一下在介紹一種文件寫入方法:createWriteStream 流式寫入,流式寫入方式適用于大文件寫入或者頻繁寫入的場景, writeFile 適合于 寫入頻率較低的場景。
// 導入fs模塊
const fs=require("fs");
// 創建寫入流對象
const ws=fs.createWriteStream('./study.txt');
// write
ws.write("前天學習Webpack\r\n");
ws.write("昨天學習ES6\r\n");
ws.write("今天學習Node.js\r\n");
//關閉通道,可寫可不寫
ws.close();
最后文件寫入有哪些應用場景呢?下載文件、安裝軟件 、保存程序日志,如 Git 、編輯器保存文件 、視頻錄制都使用到了文件的寫入。當需要持久化保存數據的時候,應該想到文件寫入。
文件讀取
Node.js也提供了一些讀取文件的方式,第一種方式可以使用readFile 異步讀取,其接收三個參數:path 文件路徑 ,options 選項配置(可寫可不寫) ,callback 回調函數。回調函數有兩個參數,err以及data,第一個是接受讀取失敗的對象,第二個參數則是讀取到的文件的數據。
第二種方式可以使用readFileSync同步讀取進行同步讀取。只接受兩個參數:path 文件路徑 ,options 選項配置(可選)。
// 導入fs模塊
const fs=require("fs");
// 使用readFile進行異步讀取
fs.readFile('./study.txt',(err,data)=>{if(err){console.log('讀取失敗');return;}// 使用toString()轉為了字符串console.log(data.toString());
});
//使用readFileSync同步讀取
let data=fs.readFileSync('./study.txt');
console.log(data.toString());
除了以上的兩種方式可以讀取文件,還可以使用createReadStream 流式讀取。它接受兩個參數:path 文件路徑 ,options 選項配置(可選)。它不是將文件中的數據一次性讀取出來的,而是一塊一塊地進行讀取。適用于讀取大的文件,對大文件進行處理。它每一個chunk可以讀取65536字節(64KB)大小的數據。
// 導入fs模塊
const fs=require("fs");
// 創建讀取流對象
const rs=fs.createReadStream("./study.txt");
//綁定data事件
rs.on('data',chunk=>{console.log(chunk.length);
})
//綁定end事件。可選
rs.on('end',()=>{console.log('讀取完畢');
});
文件讀取的應用場景有很多,比如:電腦開機 、程序運行 、編輯器打開文件 、查看圖片 、播放視頻 、播放音樂 、Git 查看日志 、上傳文件 以及查看聊天記錄等。
文件移動與重命名
// 導入fs模塊
const fs=require("fs");
// 調用rename方法修改名字
fs.rename('./study.txt','./play.txt',err=>{if(err){console.log('操作失敗');return;}console.log('操作成功');
});
//調用rename方法來移動文件
fs.rename('./play.txt','./課程代碼/paly.txt',err=>{if(err){console.log('操作失敗');return;}console.log('操作成功');
});// 調用renameSync方法修改名字
fs.renameSync('./paly.txt','./study.txt');
文件刪除
當我們需要刪除文件時,我們可以使用Node.js提供的unlink 方法以及rm方法。兩個方法的接受參數都相同:path 文件路徑 ,callback 操作后的回調。它們都有對應的同步方法:unlickSync以及rmSync。在此就只對它們的異步方法進行演示。
// 導入fs模塊
const fs=require("fs");
//調用unlink方法
fs.unlink('./study.txt',err=>{if(err){console.log("刪除失敗");return;}console.log("刪除成功")
});
//調用rm方法
fs.rm('./study.txt',err=>{if(err){console.log("刪除失敗");return;}console.log("刪除成功")
});
文件夾操作
// 導入fs模塊
const fs=require("fs");
//使用mkdir創建單個文件夾
fs.mkdir('./Node.js',err=>{if(err){console.log('創建失敗');return;}console.log('創建成功')
});
//使用遞歸創建
fs.mkdir('./a/b/c',{recursive:true},err=>{if(err){console.log('創建失敗');return;}console.log('創建成功')
});
// 導入fs模塊
const fs=require("fs");
fs.readdir('./',(err,data)=>{if(err){console.log('讀取失敗');return;}console.log(data);
});
// 導入fs模塊
const fs=require("fs");
//使用rmdir進行刪除
fs.rmdir('./Node.js',err=>{if(err){console.log('刪除失敗');return;}console.log('刪除成功');
})
//使用rmdir進行遞歸刪除(不推薦)
fs.rmdir('./a',{recursive:true},err=>{if(err){console.log('刪除失敗');return;}console.log('刪除成功');
})
//使用rm進行遞歸刪除(推薦)
fs.rm('./a',{recursive:true},err=>{if(err){console.log('刪除失敗');return;}console.log('刪除成功');
})
查看資源狀態
// 導入fs模塊
const fs=require("fs");
//stat方法
fs.stat('./study.txt',(err,data)=>{if(err){console.log(err);return;}// 輸出資源的狀態console.log(data);//用于判斷該資源是否為文件console.log(data.isFile());//用于判斷該資源是否為文件夾console.log(data.isDirectory());
})
路徑問題
// 導入fs模塊
const fs=require("fs");
//相對路徑
fs.writeFileSync('./index.html','N-A');
//絕對路徑
fs.writeFileSync('D:/index.html','N-A')
?
// 導入fs模塊
const fs=require("fs");
let data = fs.readFileSync(__dirname + '/study.txt');
console.log(data);
path模塊
API | 說明 |
path.resolve | 拼接規范的絕對路徑 常用 |
path.sep | 獲取操作系統的路徑分隔符 |
path.parse | 解析路徑并返回對象 |
path.basename | 獲取路徑的基礎名稱 |
path.dirname | 獲取路徑的目錄名 |
path.extname | 獲得路徑的擴展名 |
// 導入fs模塊
const fs=require("fs");
const path=require('path');
//resolve 會使得路徑的分隔符統一,解決了__dirname拼接之后路徑不太規范的問題。
console.log(path.resolve(__dirname,'./index.html'));//D:\編程\前端\index.html
//sep
console.log(path.sep);// windows下為 \ Linux下為 /
//parse方法可以對路徑進行解析,返回一個對象:root,dir,base,ext以及name
//先通過__filename獲取當前文件的絕對路徑
let str=__filename;
console.log(path.parse(str));//返回一個對象:root,dir,base,ext以及name
//basename
console.log(path.basename(str));//index.js
//dirname
console.log(path.dirname(str));//D:\編程\前端
//extname
console.log(path.extname(str));//.js
好啦!Node.js的介紹就先到這里了,接下來還會持續更新!拜拜!!