這篇文章給大家分享的是有關(guān)Node.js中Process、Path和File System模塊常用 API的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有宜黃免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
本篇文章給大家介紹一下Nodejs中Process、Path和File System模塊常用 API。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

相關(guān)推薦:《nodejs 教程》
在日常使用 Node 進(jìn)行開發(fā)的時候,會使用到一些文件系統(tǒng)、路徑操作等基礎(chǔ) API,這里整理一下,方便大家理解和直接使用。
這里只介紹最常用的那些,不是所有哈,想要看更全的,直接看官方文檔就 OK。
盡量不廢話,多上代碼。
先介紹 process 模塊,它提供了當(dāng)前 Node 進(jìn)程相關(guān)的全局環(huán)境信息。在后面的 API 中被用到。
// 內(nèi)置模塊,直接使用
const process = require('process');這是一個函數(shù),返回當(dāng)前 Node 進(jìn)程執(zhí)行的目錄,舉例一個常見的場景:
一個 Node 模塊 A 通過 NPM 發(fā)布,項(xiàng)目 B 中使用了模塊 A。在 A 中需要操作 B 項(xiàng)目下的文件時,就可以用 process.cwd() 來獲取 B 項(xiàng)目的路徑。
const cwd = process.cwd(); // 輸出:/Users/xiaolian/Code/node-api-test
在終端通過 Node 執(zhí)行命令的時候,通過 process.argv 可以獲取傳入的命令行參數(shù),返回值是一個數(shù)組:
0: Node 路徑(一般用不到,直接忽略)
1: 被執(zhí)行的 JS 文件路徑(一般用不到,直接忽略)
2~n: 真實(shí)傳入命令的參數(shù)**
所以,我們只要從 process.argv[2] 開始獲取就好了。一般都是這樣用:
const args = process.argv.slice(2);
直接獲取我們想要的參數(shù)。
返回一個對象,存儲當(dāng)前環(huán)境相關(guān)的所有信息,一般很少直接用到。
一般我們會在 process.env 上掛載一些變量標(biāo)識當(dāng)前的環(huán)境。比如最常見的用 process.env.NODE_ENV 區(qū)分 development 和 production。在 vue-cli 的源碼中也經(jīng)常會看到 process.env.VUE_CLI_DEBUG 標(biāo)識當(dāng)前是不是一 DEBUG 模式。
這里提一個 webpack 的插件 DefinePlugin,在日常的構(gòu)建流程中,我們經(jīng)常會通過這個插件來注入不同的全局變量,從而執(zhí)行不同的構(gòu)建流程,并且代碼中的 process.env.xxx 會被替換成具體的值,在 Terser 壓縮階段會將 deadCode 移除,優(yōu)化代碼體積。
這個用的不多,返回當(dāng)前系統(tǒng)信息,枚舉值如下:
console.log(process.platform); // 'aix' // 'darwin' - macOS // 'freebsd' // 'linux' - linux // 'openbsd' // 'sunos' // 'win32' - windows
// 內(nèi)置模塊,直接使用
const path = require('path');Node 中幾乎路徑相關(guān)的操作都會使用這個模塊。
這里就說 5 個最常用的:
path.join 作用是將傳入的多個路徑拼成一個完整的路徑。
const dPath = path.join('template', 'aaa', 'bbb', 'ccc', 'd.js');
// 輸出: template/aaa/bbb/ccc/d.js來看一個非常常見的場景,我們需要獲取當(dāng)前項(xiàng)目的 package.json 文件,就可以這樣獲取它的路徑:
const pkgPath = path.join(process.cwd(), './package.json'); // 輸出: /Users/xiaolian/Code/node-api-test/package.json
path.join 可以傳入任意個路徑,比如:
['package.json', 'README.md'].forEach(fileName => {
const templateFilePath = path.join(process.cwd(), 'template', fileName);
console.log(templateFilePath);
});
// 輸出: /Users/xiaolian/Code/node-api-test/template/package.json
// 輸出: /Users/xiaolian/Code/node-api-test/template/README.mdpath.resovle 和 path.join 的區(qū)別在于它的作用是將傳入的多個路徑和當(dāng)前執(zhí)行路徑拼接成一個完整的絕對路徑。
假設(shè)我現(xiàn)在 index.js 在 scripts 目錄下,然后我在根目錄下執(zhí)行 node scripts/index.js,它的代碼如下:
const dPath = path.resolve('aaa', 'bbb', 'ccc', 'd.js');
// 輸出: /Users/xiaolian/Code/node-api-test/aaa/bbb/ccc/d.js一般情況下,當(dāng) path.resolve 的第一個參數(shù)為 ./ 時,可以直接理解和 path.join(processs.cwd(), '') 表現(xiàn)一致。
path.basename 返回指定 path 最后一個路徑名,其中第二個參數(shù) ext 可選,表示文件擴(kuò)展名。比如:
console.log(path.basename('scripts/index.js')); // index.js
console.log(path.basename('scripts/index.js', '.js')); // 匹配到 .js,返回 index
console.log(path.basename('scripts/index.js', '.json')); // 沒匹配到,返回 index.js和 path.basename 對應(yīng),返回指定 path 最后一個路徑名之前的路徑。比如:
console.log(path.basename('scripts/index.js')); // scripts
console.log(path.basename('scripts/hook/index.js')); // scripts/hook和 path.basename 對應(yīng),返回指定 path 最后一個路徑名的文件擴(kuò)展名(含小數(shù)點(diǎn) .)。比如:
console.log(path.basename('scripts/index.js')); // .js
console.log(path.basename('README.md')); // .md最后再來對比一下各個路徑相關(guān)的 API 的區(qū)別。
項(xiàng)目 A 的目錄結(jié)構(gòu)如下:
├── scripts │ └── index.js ├── src │ └── index.js ├── package.json ├── README.md
scripts/index.js 的代碼如下:
const path = require('path');
console.log(path.join('package.json'));
console.log(path.resolve('package.json'));
console.log(path.join('src', 'index.js'));
console.log(path.resolve('src', 'index.js'));
console.log(path.join(process.cwd(), 'package.json'));
console.log(path.resolve('./', 'package.json'));
console.log(__filename);
console.log(__dirname);然后,我們在項(xiàng)目 A 的跟目錄下執(zhí)行 node scripts/index.js,結(jié)果如下:
-> node scripts/index.js package.json /Users/xiaolian/Code/A/package.json src/index.js /Users/xiaolian/Code/A/src/index.js /Users/xiaolian/Code/A/package.json /Users/xiaolian/Code/A/package.json /Users/xiaolian/Code/A/scripts/index.js /Users/xiaolian/Code/A/scripts
品,仔細(xì)品,它們有什么區(qū)別。
個人而言,一般還是習(xí)慣用 path.join(process.cwd(), 'xxx')。
// 內(nèi)置模塊,直接使用
const fs = require('fs');文件系統(tǒng)相關(guān)操作的模塊,除了 fs 之外,我們還經(jīng)常用到 fs-extra,后面會介紹。
這個模塊在平時的 Node 開發(fā)中會被大量使用,這里簡單列幾個,其它的還是看文檔哈:nodejs.org/dist/latest…
fs 模塊的 API 默認(rèn)都是異步回調(diào)的形式,如果你想使用同步的方法,有兩種解決方法:
使用 Node 提供的同步 API:xxxSync,也就是在 API 的后面加一個 Sync 后綴,它就是一個同步方法了(具體還是需要查文檔哈,是否有提供同步 API)
包裝成一個 Promise 使用
fs.stat() 返回一個文件或者目錄的信息。
const fs = require('fs');
fs.stat('a.js', function(err, stats) {
console.log(stats);
});其中包含的參數(shù)有很多,介紹幾個比較常用的:
export interface StatsBase<T> {
isFile(): boolean; // 判斷是否是一個文件
isDirectory(): boolean; // 判斷是否一個目錄
size: T; // 大小(字節(jié)數(shù))
atime: Date; // 訪問時間
mtime: Date; // 上次文件內(nèi)容修改時間
ctime: Date; // 上次文件狀態(tài)改變時間
birthtime: Date; // 創(chuàng)建時間
}一般我們會使用 fs.stat 來取文件的大小,做一些判斷邏輯,比如發(fā)布的時候可以檢測文件大小是否符合規(guī)范。在 CLI 中,經(jīng)常需要獲取一個路徑下的所有文件,這時候也需要使用 fs.stat 來判斷是目錄還是文件,如果是目錄則繼續(xù)遞歸。當(dāng)然,現(xiàn)在也有更方便的 API 可以完成這個工作。
const fs = require('fs');
try {
const stats = fs.statSync('a.js');
} catch(e) {}fs.readdir(path) 獲取 path 目錄下的文件和目錄,返回值為一個包含 file 和 directory 的數(shù)組。
假設(shè)當(dāng)前目錄為:
. ├── a │ ├── a.js │ └── b │ └── b.js ├── index.js └── package.json
執(zhí)行以下代碼:
const fs = require('fs');
fs.readdir(process.cwd(), function (error, files) {
if (!error) {
console.log(files);
}
});返回值為:
[ 'a', 'index.js', 'package.json' ]
可以看到這里只返回了根目錄下的文件和目錄,并沒有去深度遍歷。所以如果需要獲取所有文件名,就需要自己實(shí)現(xiàn)遞歸。
const fs = require('fs');
try {
const dirs = fs.readdirSync(process.cwd());
} catch(e) {}文件讀取的 API,通過 fs.readFile 可以獲取指定 path 的文件內(nèi)容。
入?yún)⑷缦拢?/p>
第一個參數(shù): 文件路徑
第二個參數(shù): 配置對象,包括 encoding 和 flag,也可以直接傳如 encoding 字符串
第三個參數(shù): 回調(diào)函數(shù)
使用方法如下:
const fs = require('fs');
const path = require('path');
fs.readFile(path.join(process.cwd(), 'package.json'), 'utf-8', function (
error,
content
) {
if (!error) {
console.log(content);
}
});如果沒傳 encoding,則其默認(rèn)值為 null,此時返回的文件內(nèi)容為 Buffer 格式。
const fs = require('fs');
try {
fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8');
} catch(e) {}對應(yīng)著讀文件 readFile,fs 也提供了寫文件的 API writeFile,接收四個參數(shù):
第一個參數(shù): 待寫入的文件路徑
第二個參數(shù): 待寫入的文件內(nèi)容
第三個參數(shù): 配置對象,包括 encoding 和 flag,也可以直接傳如 encoding 字符串
第三個參數(shù): 回調(diào)函數(shù)
使用方法如下:
const fs = require('fs');
const path = require('path');
fs.writeFile(
path.join(process.cwd(), 'result.js'),
'console.log("Hello World")',
function (error, content) {
console.log(error);
}
);const fs = require('fs');
const path = require('path');
try {
fs.writeFileSync(
path.join(process.cwd(), 'result.js'),
'console.log("Hello World")',
'utf-8'
);
} catch (e) {}感謝各位的閱讀!關(guān)于“Node.js中Process、Path和File System模塊常用 API”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
本文名稱:Node.js中Process、Path和FileSystem模塊常用API
當(dāng)前地址:http://chinadenli.net/article42/ggjiec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、外貿(mào)建站、域名注冊、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)