看了就會的 Node.js 三大基礎模塊常用 API

大家好,我是若川。歡迎加我微信?ruochuan12,加群交流學習。今天分享一篇nodejs基礎的文章。點擊下方卡片關注我,或者查看源碼等系列文章。

在日常使用 Node 進行開發的時候,會使用到一些文件系統、路徑操作等基礎 API,這里整理一下,方便大家理解和直接使用。

這里只介紹最常用的那些,不是所有哈,想要看更全的,直接看官方文檔[1]就 OK。

盡量不廢話,多上代碼。

Process 模塊

先介紹 process 模塊,它提供了當前 Node 進程相關的全局環境信息。在后面的 API 中被用到。

//?內置模塊,直接使用
const?process?=?require('process');

process.cwd()

這是一個函數,返回當前 Node 進程執行的目錄,舉例一個常見的場景:

一個 Node 模塊 A 通過 NPM 發布,項目 B 中使用了模塊 A。在 A 中需要操作 B 項目下的文件時,就可以用 process.cwd() 來獲取 B 項目的路徑。

const?cwd?=?process.cwd();?//?輸出:/Users/xiaolian/Code/node-api-test

process.argv

在終端通過 Node 執行命令的時候,通過 process.argv 可以獲取傳入的命令行參數,返回值是一個數組:

  • 0: Node 路徑(一般用不到,直接忽略)

  • 1: 被執行的 JS 文件路徑(一般用不到,直接忽略)

  • 2~n: 真實傳入命令的參數**

所以,我們只要從 process.argv[2] 開始獲取就好了。一般都是這樣用

const?args?=?process.argv.slice(2);

直接獲取我們想要的參數。

process.env

返回一個對象,存儲當前環境相關的所有信息,一般很少直接用到。

一般我們會在 process.env 上掛載一些變量標識當前的環境。比如最常見的用 process.env.NODE_ENV 區分 developmentproduction。在 vue-cli 的源碼中也經常會看到 process.env.VUE_CLI_DEBUG 標識當前是不是一 DEBUG 模式。

這里提一個 webpack 的插件 DefinePlugin[2],在日常的構建流程中,我們經常會通過這個插件來注入不同的全局變量,從而執行不同的構建流程,并且代碼中的 process.env.xxx 會被替換成具體的值,在 Terser 壓縮階段會將 deadCode 移除,優化代碼體積。

process.platform

這個用的不多,返回當前系統信息,枚舉值如下:

console.log(process.platform);//?'aix'
//?'darwin'??-?macOS
//?'freebsd'
//?'linux'?-?linux
//?'openbsd'
//?'sunos'
//?'win32'?-?windows

Path 模塊

//?內置模塊,直接使用
const?path?=?require('path');

Node 中幾乎路徑相關的操作都會使用這個模塊。

這里就說 5 個最常用的:

path.join(...paths)

path.join 作用是將傳入的多個路徑拼成一個完整的路徑。

const?dPath?=?path.join('template',?'aaa',?'bbb',?'ccc',?'d.js');
//?輸出:?template/aaa/bbb/ccc/d.js

來看一個非常常見的場景,我們需要獲取當前項目的 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.md

path.resolve(...paths)

path.resovlepath.join 的區別在于它的作用是將傳入的多個路徑和當前執行路徑拼接成一個完整的絕對路徑。

假設我現在 index.jsscripts 目錄下,然后我在根目錄下執行 node scripts/index.js,它的代碼如下:

const?dPath?=?path.resolve('aaa',?'bbb',?'ccc',?'d.js');
//?輸出:??/Users/xiaolian/Code/node-api-test/aaa/bbb/ccc/d.js

一般情況下,當 path.resolve 的第一個參數為 ./ 時,可以直接理解和 path.join(processs.cwd(), '') 表現一致。

path.basename(path[, ext])

path.basename 返回指定 path 最后一個路徑名,其中第二個參數 ext 可選,表示文件擴展名。比如:

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.dirname(path)

path.basename 對應,返回指定 path 最后一個路徑名之前的路徑。比如:

console.log(path.basename('scripts/index.js'));??//?scripts
console.log(path.basename('scripts/hook/index.js'));??//?scripts/hook

path.extname(path)

path.basename 對應,返回指定 path 最后一個路徑名的文件擴展名(含小數點 .)。比如:

console.log(path.basename('scripts/index.js'));??//?.js
console.log(path.basename('README.md'));??//?.md

對比

最后再來對比一下各個路徑相關的 API 的區別。

項目 A 的目錄結構如下:

├──?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);

然后,我們在項目 A 的根目錄下執行 node scripts/index.js,結果如下:

->?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

品,仔細品,它們有什么區別。

個人而言,一般還是習慣用 path.join(process.cwd(), 'xxx')

File System 模塊

//?內置模塊,直接使用
const?fs?=?require('fs');

文件系統相關操作的模塊,除了 fs 之外,我們還經常用到 fs-extra,后面會介紹。

這個模塊在平時的 Node 開發中會被大量使用,這里簡單列幾個,其它的還是看文檔哈:https://nodejs.org/dist/latest-v14.x/docs/api/fs.html[3]

fs 模塊的 API 默認都是異步回調的形式,如果你想使用同步的方法,有兩種解決方法:

  1. 使用 Node 提供的同步 API:xxxSync,也就是在 API 的后面加一個 Sync 后綴,它就是一個同步方法了(具體還是需要查文檔哈,是否有提供同步 API)

  2. 包裝成一個 Promise 使用

fs.stat(path[, options], callback)

fs.stat() 返回一個文件或者目錄的信息。

const?fs?=?require('fs');fs.stat('a.js',?function(err,?stats)?{console.log(stats);
});

其中包含的參數有很多,介紹幾個比較常用的:

export?interface?StatsBase<T>?{isFile():?boolean;?????????????????//?判斷是否是一個文件isDirectory():?boolean;????????????//?判斷是否一個目錄size:?T;???????????????????????????//?大小(字節數)atime:?Date;???????????????????????//?訪問時間mtime:?Date;???????????????????????//?上次文件內容修改時間ctime:?Date;???????????????????????//?上次文件狀態改變時間birthtime:?Date;???????????????????//?創建時間
}

一般我們會使用 fs.stat 來取文件的大小,做一些判斷邏輯,比如發布的時候可以檢測文件大小是否符合規范。在 CLI 中,經常需要獲取一個路徑下的所有文件,這時候也需要使用 fs.stat 來判斷是目錄還是文件,如果是目錄則繼續遞歸。當然,現在也有更方便的 API 可以完成這個工作。

同步方法

const?fs?=?require('fs');try?{const?stats?=?fs.statSync('a.js');
}?catch(e)?{}

fs.readdir(path[, options], callback)

fs.readdir(path) 獲取 path 目錄下的文件和目錄,返回值為一個包含 filedirectory 的數組。

假設當前目錄為:

.
├──?a
│???├──?a.js
│???└──?b
│???????└──?b.js
├──?index.js
└──?package.json

執行以下代碼:

const?fs?=?require('fs');fs.readdir(process.cwd(),?function?(error,?files)?{if?(!error)?{console.log(files);}
});

返回值為:

[?'a','index.js','package.json'?]

可以看到這里只返回了根目錄下的文件和目錄,并沒有去深度遍歷。所以如果需要獲取所有文件名,就需要自己實現遞歸。

同步方法

const?fs?=?require('fs');try?{const?dirs?=?fs.readdirSync(process.cwd());
}?catch(e)?{}

fs.readFile(path[, options], callback)

文件讀取的 API,通過 fs.readFile 可以獲取指定 path 的文件內容。

入參如下:

  • 第一個參數: 文件路徑

  • 第二個參數: 配置對象,包括 encodingflag,也可以直接傳如 encoding 字符串

  • 第三個參數: 回調函數

使用方法如下:

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,則其默認值為 null,此時返回的文件內容為 Buffer 格式。

同步方法

const?fs?=?require('fs');try?{fs.readFileSync(path.join(process.cwd(),?'package.json'),?'utf-8');
}?catch(e)?{}

fs.writeFile(file, data[, options], callback)

對應著讀文件 readFilefs 也提供了寫文件的 API writeFile,接收四個參數:

  • 第一個參數: 待寫入的文件路徑

  • 第二個參數: 待寫入的文件內容

  • 第三個參數: 配置對象,包括 encodingflag,也可以直接傳如 encoding 字符串

  • 第三個參數: 回調函數

使用方法如下:

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)?{}

本文主要是總結了一下在開發 Node 時常用的一些 API,后續的文章會帶來 Node 常用的一些三方包。

參考資料

[1]

官方文檔: https://nodejs.org/dist/latest-v14.x/docs/api/

[2]

DefinePlugin: https://webpack.js.org/plugins/define-plugin

[3]

https://nodejs.org/dist/latest-v14.x/docs/api/fs.html: https://nodejs.org/dist/latest-v14.x/docs/api/fs.html


最近組建了一個江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你進群。



·················?若川出品?·················

今日話題

去年清明假期開通了第二個微信號?ruochuan12,昨天突破2000好友了。清明假期打算完稿vuex4源碼文章,可惜,我是沒有完成,錯誤的預估了工作量,和自己的惰性...我可能可以封為資深拖稿專家了。

一個愿景是幫助5年內前端人走向前列的公眾號

可加我個人微信 ruochuan12,長期交流學習

推薦閱讀

我在阿里招前端,我該怎么幫你?(現在還能加我進模擬面試群)

如何拿下阿里巴巴 P6 的前端 Offer

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

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

相關文章

vue-cli3插件初體驗

vue-cli3發布自2018年8月&#xff0c;距離現在還不是特別久&#xff0c;最好搭建項目剛好用到&#xff0c;所以寫下這篇文章&#xff0c;記錄一下踩坑經歷。vue的作者說過&#xff0c;vue-cli的本質是模版的拉取&#xff0c;太多的配置導致了模版的難以維護&#xff0c;所以重構…

ios設計登錄功能_親愛的產品設計師,這是iOS 14的新功能

ios設計登錄功能On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some changes you should know about as a product designer like widgets, pickers, app clips, permissions and more.2020年6月22日&#xff0c;Apple首次預覽iOS 1…

c++ int 轉 short_C/C++結構體內存對齊

在面試或工作中&#xff0c;經常會遇到內存對齊的問題。這里結合我的理解談一談對內存對齊的理解。1. 為什么要內存對齊&#xff0c;不對齊會怎么樣&#xff1f;內存中存放數據是為了給CPU使用&#xff0c;CPU訪問內存數據時會受到地址總線寬度的限制&#xff0c;也就是一次能從…

對于日訪問量達到1W IP的處理方法

轉自&#xff1a;http://www.java123.net/56026-2.html 對于日訪問量達到1W IP的處理方法 一、1萬ip真是不高&#xff1a; 1.常用數據用緩存&#xff0c;減輕數據庫壓力。 2.詳細頁數據生成靜態頁面。 二、10000算是相當小的了,不需要什么特殊的處理機制,只要符合最一般的…

數據契約(DataContract)

WCF第一要素就是契約: 服務契約用于聲明可用于遠程訪問的類型。在Interface或class開始處使用服務契約標簽. [ServiceContract] Public interface Iservice { } 接口調用契約的好處: 1. 同一服務類型可以實現多個不相干的服務契約. 2. 有利于版本升級 3. 按照…

jakob slam_Jakob Nielsen針對用戶界面設計的第二種可用性啟發法

jakob slamIn the pursuit of providing great user experiences, it’s imperative that digital products are evaluated. A 為了提供出色的用戶體驗&#xff0c;必須對數字產品進行評估。 一個 heuristic evaluation is essential to delivering great user experiences. I…

微軟Office 365正式上架Mac App Store

今天&#xff0c;Office 365正式在Mac App Store上架&#xff0c;Mac用戶可以輕松下載Word&#xff0c;Outlook&#xff0c;Excel&#xff0c;PowerPoint&#xff0c;OneNote以及整套微軟的熱門應用程序。用戶還可以從應用程序內訂購Office 365。蘋果全球開發者關系高級主管Sha…

一文搞懂瀏覽器原理

大家好&#xff0c;我是若川。最近這幾年&#xff0c;云計算的普及和 HTML5 技術的快速發展&#xff0c;越來越多的應用轉向了瀏覽器 / 服務器&#xff08;B/S&#xff09;架構&#xff0c;這種改變讓瀏覽器的重要性與日俱增&#xff0c;視頻、音頻、游戲幾大核心場景也都在逐漸…

python處理excel可視化_python如何將excel數據處理可視化

python將excel數據處理可視化的方法&#xff1a;首先安裝xlrd與xlwt庫&#xff0c;進行表格讀取&#xff1b;然后使用pyecharts生成Echarts圖表的類庫&#xff1b;最后安裝Echarts讀取Excel數據及顯示即可。python將excel數據處理可視化的方法&#xff1a;Excel表操作python操作…

dataframe中將一列數據切分成多列

為什么80%的碼農都做不了架構師&#xff1f;>>> 原sheet中數據 目的 將【備注】列切分成【key】列和【value】列 Python sheet[key] sheet[備注].str.extract(r(_.*(?\u503c))) sheet[value] sheet[備注].str.extract(r((?<).*))結果 參考 pandas.Series.st…

matplotlib可視化_EDA:Geopandas,Matplotlib和Bokeh中的可視化

matplotlib可視化Nowadays, everyone is immersed with plenty of data from news sources, cellphones, laptops, workplaces, and so on. Data conveys with tons of information from different data variables like date, string, numeric, and geographical format. How t…

(轉)結婚那天,媽問我:坐在角落里象兩個要飯模樣的人是誰?

人人看到的文章 很感人~~~~結婚那天&#xff0c;媽問我&#xff1a;坐在角落里象兩個要飯模樣的人是誰&#xff1f; 我看過去的時候&#xff0c;有個老頭正盯著我&#xff0c;旁邊還有個老太太&#xff0c;發現我看著他們時趕忙低下頭。我不認識他們但也不象要飯的&#xff0c;…

nginx-1.13.x源碼安裝

Nginx 安裝配置【依賴庫】[ zlib ]&#xff08;下載&#xff09;http://download.chinaunix.net/download.php?id24013&ResourceID12241 [ pcre ]apt-get install libpcre-dev[ openssl ]&#xff08;下載&#xff09;http://download.chinaunix.net/download.php?id3937…

小技巧!CSS 整塊文本溢出省略特性探究

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天的文章很有意思&#xff0c;講一講整塊文本溢出省略打點的一些有意思的細節。點擊下方卡片關注我&#xff0c;或者查看源碼系列文章。文本超長打點我們都知道&#xff0c;到今天&#xff08…

linux配置ip地址 suse_SUSE Linux下設置IP的兩種方法

第一種SUSE Linux IP設置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168.1.2釋義&#xff1a;#IP配置&#xff0c;包括子網掩碼,看情況修改eth0和192.168.1.22#網關修改 ,看情況修改192.168.1.2第二種SUSE Linux IP設置方法在suse操作系…

寒假作業3:抓老鼠啊

7-1 抓老鼠啊~虧了還是賺了&#xff1f; &#xff08;20 分&#xff09; 某地老鼠成災&#xff0c;現懸賞抓老鼠&#xff0c;每抓到一只獎勵10元&#xff0c;于是開始跟老鼠斗智斗勇&#xff1a;每天在墻角可選擇以下三個操作&#xff1a;放置一個帶有一塊奶酪的捕鼠夾(T)&…

筆記本移交_創建完美的設計移交

筆記本移交重點 (Top highlight)Design specifications (specs) are guidelines that developers will use to implement a design. Think of an architect providing building blueprints to the construction team. Many designers think of specs as mindless zombie work. …

大手筆,送¥1599的Apple AirPods Pro和獨家禮物等

大家好&#xff0c;我是若川。為感謝公眾號讀者們長久以來的支持&#xff0c;本次我聯合幾位前端界大佬給大家送超級福利了。除了聯合福利之外&#xff0c;每位前端大佬還帶了專屬禮品送給大家&#xff0c;所有抽獎均可重復參與、可重復中獎&#xff0c;詳情見下文每個公眾號的…

jQuery1.4新特性

1. 傳參給 jQuery(…) 之前&#xff0c;jQuery可以通過 attr 方法設置元素的屬性&#xff0c;既可傳屬性的名和值&#xff0c;也可以是包含幾組特定 屬性名值對 的 對象。在 jQuery 1.4 中&#xff0c;你可以把一個參數對象作為第二個參數傳給 jQuery 函數本身&#xff0c;同時…

python pack unpack_golang 仿python pack/unpack

package includesimport ("bytes""encoding/binary""fmt"_"os""strconv""strings")type Protocolstruct{Format []string}//封包func (p *Protocol) Pack(args ...interface{}) []byte{la :len(args)ls :len(p.Fo…