Node.js入門指南(一)

目錄

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 是一個類似于數組的對象 ? ,用于表示固定長度的字節序列。Buffer 本質是一段內存空間,專門用來處理 二進制數據 ? 。它的大小是固定的且無法調整。性能較好,可以直接對計算機內存進行操作。每個元素的大小為 1 字節( byte )。

使用

創建的方式有如下的三種:第一種使用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 全稱為 file system ,稱之為 文件系統 ,是 Node.js 中的 內置模塊 ,可以對計算機中的磁盤進行操作。例如文件的創建、刪除、重命名、移動以及文件內容的寫入、讀取等文件夾的相關操作。

文件寫入

使用writeFile異步寫入 ,它可以傳四個參數:file文件名,data文件中需要寫入的數據,options選項設置(可選)以及callback寫入回調。在回調函數中聲明一個形參err,當我們寫入失敗時err則是寫入失敗的錯誤對象,若寫入成功,它等于null。
// 導入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 查看日志 、上傳文件 以及查看聊天記錄等。

文件移動與重命名

在 Node.js 中,我們可以使用 rename renameSync 來移動或重命名文件或文件夾。 fs.rename該方法是異步的,接收三個參數: oldPath 文件當前的路徑、 newPath 文件新的路徑、 callback 操作后的回調。而fs.renameSync是同步的,并且只接收前兩個參數,沒有回調函數參數。
// 導入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("刪除成功")
});

文件夾操作

Node.js 除了可以對文件進行操作之外,我們還可以對文件夾進行 創建 、 讀取 、 刪除 等操作。
首先在 Node.js 中,我們可以使用 mkdir mkdirSync 來創建文件夾。mkdir方法接受三個參數:
path 文件夾路徑 、options 選項配置( 可選 ) 、callback 操作后的回調。而mkdirSync只接受前兩個參數。前者為異步方法后者為同步方法。
// 導入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('創建成功')
});
當我們需要在創建的文件夾下面再創建文件夾時,我們就需要使用到mkdir方法的第二個參數:通過設置{recursive:true},讓其可以實現遞歸創建。
在 Node.js 中,我們可以使用 readdir 或 readdirSync 來讀取文件夾。readdir 接受三個參數: path 文件夾路徑、options 選項配置( 可選 )以及callback 操作后的回調。回調有兩個形參,err以及data,err接受失敗的對象,data為接受成功時的數據,將讀取到的文件夾中存在的文件的名稱以數組的形式輸出。
// 導入fs模塊
const fs=require("fs");
fs.readdir('./',(err,data)=>{if(err){console.log('讀取失敗');return;}console.log(data);
});

在 Node.js 中,我們可以使用 rmdir rmdirSync 來刪除文件夾。rmdir方法接受三個參數:path 文件夾路徑、options 選項配置( 可選 )以及callback 操作后的回調。若想要進行遞歸地刪除文件夾,需要設置第二個參數為:{recursive:true}。但是不推薦使用rmdir進行遞歸地刪除,因為運行之后會有警告。所以若想要進行遞歸刪除,可以使用 rm 來進行操作,使用方式也rmdir相同。
// 導入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('刪除成功');
})

查看資源狀態

我們可以使用 stat statSync 來查看資源的詳細信息 ,stat 接受三個參數:path 文件夾路徑、options 選項配置( 可選 )、callback 操作后的回調。
// 導入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 模塊對資源進行操作時,路徑的寫法有兩種:相對路徑以及絕對路徑。
// 導入fs模塊
const fs=require("fs");
//相對路徑
fs.writeFileSync('./index.html','N-A');
//絕對路徑
fs.writeFileSync('D:/index.html','N-A')
但是需要注意的是:相對路徑中所謂的當前目錄 ,指的是命令行的工作目錄 ,而并非是文件的所在目錄。所以當命令行的工作目錄與文件所在目錄不一致時,會出現一些 BUG。
?
因為我們引入了 __dirname 。__dirname 與 require 類似,都是 Node.js 環境中的'全局'變量。__dirname 保存著 當前文件所在目錄的絕對路徑 ,可以使用 __dirname 與文件名拼接成絕對路徑。
// 導入fs模塊
const fs=require("fs");
let data = fs.readFileSync(__dirname + '/study.txt');
console.log(data);
使用 fs 模塊的時候,盡量使用 __dirname 將路徑轉化為絕對路徑,這樣可以避免相對路徑產生的
Bug。

path模塊

path 模塊提供了 操作路徑 的功能,以下是它較為常用的幾個 API:
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的介紹就先到這里了,接下來還會持續更新!拜拜!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023最新面試題

第一家 自我介紹介紹一下最近一個&#xff08;最熟悉的一個&#xff09;項目 項目幾個人在負責 項目實際在用了嗎&#xff0c;哪個平臺在用啊&#xff08;在哪里上線&#xff09; 你認為你自己做的項目里面哪個比較難做呢&#xff0c;項目里面有什么難點&#xff1f;常用的是V…

安卓隱私指示器學習筆記

最近了解到Google 在Android12上新增了權限指示器&#xff0c;可以在信號欄的右側顯示當前訪問錄音機和Camera的應用&#xff0c;點擊后可以跳轉到相應應用的權限界面&#xff0c;消費者可以控制權限的開啟和關閉。國內手機廠商最近幾年都在增加隱私看板供能&#xff0c;消費者…

java 中漢字轉拼音

需要引入的jar <!-- pinyin --><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version></dependency> 實現工具類 package com.julong.util;import java.util.regex…

編程語言發展史:高級語言的興起

一、高級語言的定義 高級語言是相對于匯編語言而言的&#xff0c;它是一種更加抽象、更加易于理解和使用的計算機編程語言。高級語言的特點是語法簡單、易于學習、易于使用、可讀性強、可移植性好等。高級語言的出現極大地提高了程序員的工作效率&#xff0c;同時也使得計算機…

Qt connect()方法Qt::ConnectionType

connect() Qt&#xff0c;綁定信號和槽原型&#xff1a; static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType Qt::AutoConnection);static QMetaObject::Connection conn…

JSP:Javabean

起初&#xff0c;JavaBean的目的是為了將可以重復使用的代碼進行打包&#xff0c;在傳統的應用中&#xff0c;JavaBean主要用于實現一些可視化界面&#xff0c;如一個窗體、按鈕、文本框等&#xff0c;這樣的JavaBean稱之可視化的JavaBean。 隨著技術的不斷發展與項目的需求&am…

防火墻部署模式 -- 鏡像流量(旁路模式)

鏡像流量&#xff08;旁路模式&#xff09; 如圖&#xff0c;與單臂路由模式不同&#xff0c;旁路模式中&#xff0c;PC的流量不會流經防火墻&#xff0c;就算防火墻宕機也不會影他們之間的數據傳輸。 鏡像的原理是交換機把被鏡像端口的流量復制一份&#xff0c;發到監聽端口&…

尋找二叉樹最近公共祖先

二叉樹為BST LCR 193. 二叉搜索樹的最近公共祖先 1.1 遞歸 利用BST的性質 p root 或者 q root ,顯然根為公共祖先p < root < q 或者 p > root > q,顯然p&#xff0c;q分別位于root的一顆子樹上&#xff0c;故根為公共祖先max{p,q} < root ,顯然 p 和q 均在…

基于單片機聲光控智能路燈系統仿真設計

**單片機設計介紹&#xff0c; 基于單片機聲光控智能路燈系統仿真設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于單片機的聲光控智能路燈系統是一種利用單片機技術實現智能控制的路燈系統。它通過感知環境音量和光照強度…

Axios 請求響應結果的結構

發送請求 this.$axios.get(https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/,{params: {id: 10}}).then(res > {console.log(res)})輸出返回結果 confing 請求時的配置對象&#xff0c;如果請求的url&#xff0c;請求的方法&#xff0c;請求的參數&#xff0c…

深入理解Java注解的實現原理以及前世今生

深入理解Java注解的實現原理以及前世今生 小雪初寒&#xff0c;請添衣&#xff0c;冬棋如意&#xff0c;待良人&#xff0c;望歸期。 1.Java注解的前世今生 Java注解是一種元數據標記&#xff0c;它提供了一種在Java代碼中添加元數據&#xff08;注釋&#xff09;的方式。注解…

Linux文件

目錄 一、基本概念 二、研究進程和被打開文件的關系 &#xff08;一&#xff09;w方式 &#xff08;二&#xff09;a方式 三、認識系統接口&#xff0c;操作文件 &#xff08;一&#xff09;認識文件描述符 &#xff08;二&#xff09;舉例 &#xff08;三&#xff09;…

2023年中國油墨樹脂主要環節、產量及市場規模分析[圖]

油墨樹脂是指用于油墨制造中的一種高分子材料&#xff0c;主要用于改善油墨的粘性、流動性、光澤度和耐磨性等性能。其主要成分為合成樹脂&#xff0c;如聚酯、聚酰胺、聚丙烯酸酯等。油墨樹脂在油墨制造中的應用非常廣泛&#xff0c;可以用于各種類型的油墨&#xff0c;包括印…

github訪問不了問題

git clone github上的項目的時候&#xff0c;不是訪問不了&#xff0c;就是克隆過程被中斷了 最近找到一個代理&#xff0c;從代理那里clone而不是github上 GitHub代理 – 初果編程

python BDD 的相關概念

在Python 語言中進行BDD的規格和測試文件的編寫的時候&#xff0c;常常會遇到下面的概念&#xff1a; Fixture : 測試設施。設定測試環境的預設狀態或值的機制。Background&#xff1a; 背景。所有場景的公共部分。Scenario&#xff1a; 場景。Given &#xff1a; 前置條件Whe…

centos7 安裝node.js,不用wget也不用解壓文件

更新系統&#xff1a;首先&#xff0c;更新系統的軟件包列表和已安裝的軟件包。在終端中以root用戶或具有sudo權限的用戶身份運行以下命令&#xff1a; sudo yum update添加Node.js源&#xff1a;CentOS 7默認的軟件倉庫中可能不包含最新的Node.js版本。因此&#xff0c;我們需…

[leetcode 數位運算] 2939. 最大異或乘積 M

給你三個整數 a &#xff0c;b 和 n &#xff0c;請你返回 (a XOR x) * (b XOR x) 的 最大值 且 x 需要滿足 0 < x < 2n。 由于答案可能會很大&#xff0c;返回它對 109 7 取余 后的結果。 注意&#xff0c;XOR 是按位異或操作。 示例 1&#xff1a; 輸入&#xff1…

git中的分支管理:git branch,git checkout,解決git中的分支沖突的方法【Git學習三】

&#x1f601; 作者簡介&#xff1a;一名大四的學生&#xff0c;致力學習前端開發技術 ??個人主頁&#xff1a;夜宵餑餑的主頁 ? 系列專欄&#xff1a;Git等軟件工具技術的使用 &#x1f450;學習格言&#xff1a;成功不是終點&#xff0c;失敗也并非末日&#xff0c;最重要…

vue2 識別頁面參數中的html

在Vue 2中&#xff0c;你可以使用v-html指令來識別頁面參數中的HTML內容。v-html指令允許你將HTML代碼作為Vue模板的一部分進行渲染。 以下是一個示例&#xff0c;演示了如何在Vue 2中使用v-html指令來識別頁面參數中的HTML內容&#xff1a; <template><div v-html&…

C語言計算一個數的 n 次方

1、要求 計算一個數的 n 次方&#xff0c;例如: 2 3&#xff0c;其中 2 為基數&#xff0c;3 為指數。 2、使用for循環 #include <stdio.h> int main(){int i,j,k,l1;printf("請輸入基數和指數&#xff1a;");scanf("%d %d",&i,&j);for(k…