文件系統
這些工具包的功能就是在 Node 本身的 fs 模塊基礎上提供更加方便的文件系統操作 API。
glob
一句話介紹
glob 是一種文件匹配模式,起源於 Unix,比如我們常見 *.js 匹配所有 js 文件就是使用了 glob 模式。
GitHub 地址:https://github.com/isaacs/node-glob
使用方法
glob(pattern, [options], callback),glob 方法接收三個參數:
- pattern: 匹配規則字符串
- options: 配置項(可選)
- callback: 回調函數
(error, files) => {} - error: 錯誤信息,如果不存在則為成功
- matches: 匹配文件數組
其中 options 是可選項,可以不傳,直接將回調函數放在第二個參數。
如果不想使用回調的方式,可以使用同步方法 glob.sync(pattern, options),用法一致,返回值即是匹配文件數組。
舉例
當前文件目錄如下:
.
├── a
│ ├── a.css
│ ├── a.js
├── .eslintrc.js
│ └── b
│ ├── b.css
│ └── b.js
├── index.js
├── package.json
index.js 代碼如下:
const glob = require("glob")
glob("a/**/*.js", (error, matches) => {
if (!error) {
console.log(matches);
}
});
try {
const files = glob.sync("a/**/*.js");
console.log(files);
} catch (e) {}
輸出如下:
[ 'a/a.js', 'a/b/b.js' ]
是不是發現 .eslintrc.js 文件並沒有被匹配到。默認情況下,glob 不會匹配以 . 開頭的文件,需要我們在配置項中打開:
const glob = require("glob")
glob("a/**/*.js", { dot: true }, (error, matches) => {
if (!error) {
console.log(matches);
}
});
// [ 'a/.eslintrc.js', 'a/a.js', 'a/b/b.js' ]
globby
一句話介紹
globby 是增強型的 glob,提供了 Promise 的封裝。最終要的是它支持多模式匹配,相比於 glob 只能傳入一個 pattern 字符串,globby 支持傳入一個 pattern 數組。
GitHub 地址:https://github.com/sindresorhus/globby
使用方法
globby(patterns, options?),globby 接收兩個參數,返回 Promise:
- patterns: 匹配規則數組
- options: 配置項
舉例
當前文件目錄如下:
.
├── a
│ ├── a.css
│ ├── a.js
├── .eslintrc.js
│ └── b
│ ├── b.css
│ └── b.js
├── index.js
├── package.json
index.js 代碼如下:
const globby = require('globby');
(async () => {
const files = await globby(['a/**/*.js', 'a/**/*.css'], { dot: true });
console.log(files);
})();
輸出如下:
[ 'a/.eslintrc.js', 'a/a.js', 'a/b/b.js', 'a/a.css', 'a/b/b.css' ]
fs-extra
一句話介紹
Node 內置了 fs 模塊供開發者和文件系統交互,但是用過的同學都知道,它的能力還是挺有限的。所以,在 fs 的基礎上,社區提供了 fs-extra 工具包增強文件系統交互,並且提供了 Promise 的調用方式。
GitHub 地址:https://github.com/jprichardson/node-fs-extra
舉例
這里介紹幾個最常見的:
const fse = require('fs-extra');
(async () => {
// 確認目錄是否存在,如果不存在會創建目錄
await fse.ensureDir('./a');
// 復制文件
await fse.copy('./a/a.js', './a/aa.js');
// 讀 JSON 文件
const aJSON = await fse.readJSON('./a/a.json');
console.log(typeof aJSON, aJSON);
// 寫 JSON 文件
await fse.writeJSON('./a/aa.json', { a: 1 }, { spaces: 2 });
// 寫 JSON 文件,如果目錄不存在會創建
await fse.outputJson('./c/aa.json', { a: 1 }, { spaces: 2 });
// 刪文件
await fse.remove('./a/aa.json');
})();
執行命令
這幾個 NPM 包的功能主要就是會用於執行一些系統命令,比如 npm install、git clone 等等。
shelljs
一句話介紹
這個包的作用就和它的名字一樣,用 js 來實現 shell 命令。
GitHub 地址:https://github.com/shelljs/shelljs
使用方法
可以通過 shelljs 提供的 exec 命令同步地執行任意的 shell 命令,返回值中的 code 標識是否成功執行,比如:
const shell = require('shelljs');
if (shell.exec('git init .').code === 0) {
console.log('Git 初始化成功');
}
除了 exec 之外,shelljs 也提供了一些常用 shell 命令的包裝,比如 which、echo 等,比如:
const shell = require('shelljs');
shell.echo('Hello Shelljs');
舉例
來看兩個 shelljs 的常見用法。
const shell = require('shelljs');
// 判斷是否有相關開發環境
function hasGitNpm() {
if (!shell.which('git')) {
console.log('Sorry, this script requires git');
shell.exit(1);
}
if (!shell.which('npm')) {
console.log('Sorry, this script requires npm');
shell.exit(1);
}
}
hasGitNpm();
// 安裝 npm 包
function installPkg(pkg, type) {
const npm = shell.which('npm');
if (!npm) {
console.log('請先安裝 npm');
return;
}
const { code } = shell.exec(
`${npm.stdout} install ${pkg} ${type || '--save'}`
);
if (code) {
console.log(`安裝 ${pkg} 失敗,請手動安裝`);
}
}
installPkg('lodash');
cross-spawn
一句話介紹
在 Node 中,可以通過 child_process 模塊來創建子進程,並且通過 child_process.spawn 方法來使用指定的命令行參數創建新進程,執行完之后返回執行結果。而 cross-spawn 包就是提供了關於 spawn 函數的跨平台寫法,不用開發者處理跨平台的邏輯。
GitHub 地址:https://github.com/moxystudio/node-cross-spawn
使用方法
用法和 child_process.spawn(command[, args][, options]) 保持一致:
const spawn = require('cross-spawn');
const child = spawn('npm', ['install'], { stdio: 'inherit' });
舉例
看一個比較常見的 cross-spawn 用法:
const spawn = require('cross-spawn');
// 安裝全部依賴
spawn.sync('npm', ['install'], { stdio: 'inherit' });
// 安裝指定依賴
spawn.sync('npm', ['install', 'lodash', '--save'], { stdio: 'inherit' });
rimraf
一句話介紹
相當於在命令行中執行了 rm -rf,咳咳,是不是有點危險啊。
GitHub 地址:hhttps://github.com/isaacs/rimraf
使用方法
rimraf(f, [opts], callback),rimraf 方法接收三個參數:
- f: glob 匹配規則
- opts: 配置項,可選
- callback: 回調函數
當然,也可以使用 rimraf.sync 同步方法。
const rimraf = require('rimraf');
rimraf('./a/aa.js', error => {
if (!error) {
console.log('刪除成功');
}
});
除了在 Node 中用,在 package.json 的 scripts 中也會經常看到這個工具,比如:
{ "scripts": { "build": "rimraf build && npm run build" } }
網絡請求
這里主要列了兩個目前正在用的網絡請求的包。
node-fetch
一句話介紹
相當於在 Node 上使用 Fetch。
GitHub 地址:https://github.com/node-fetch/node-fetch
使用方法
就舉個簡單例子,其它的看文檔就好了:
const fetch = require('node-fetch');
const response = await fetch('https://api.github.com/users/github');
const data = await response.json();
console.log(data);
axios
一句話介紹
axios 就不用介紹了,寫前端的同學都知道,用起來也很方便。
GitHub 地址:https://github.com/axios/axios
使用方法
const axios = require('axios');
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
小工具
這里就列一堆用得上的小工具吧,按需用。
open
一句話介紹
open 包可以讓你在代碼中打開網頁、圖片等等。比如你經常 npm start 啟動項目的時候,是不是會自動喚起瀏覽器打開一個 localhost 的頁面,就是通過 open 包實現的。
GitHub 地址:https://github.com/sindresorhus/open
使用方法
const open = require('open');
await open('http://localhost:8080');
http-server
一句話介紹
http-server 包一般安裝在全局使用,可以在本地任意目錄 0 配置啟動一個 HTTP 服務,一般在本地開發和測試的時候會經常用到。比如,使用 npm build 打包構建出構建產物之后,可以本地執行 http-server build 啟動一個服務。
GitHub 地址:https://github.com/http-party/http-server
path-to-regexp
一句話介紹
顧名思義,path-to-regexp 是將指定 path 轉換成一個正則表達式的工具,一般在接口路徑匹配的時候會用到。
GitHub 地址:https://github.com/pillarjs/path-to-regexp
使用方法
比如我們的 API 的路徑有很多,其中有一部分是對外開放的 API,它的路徑是 /openapi/* 的,可以這樣匹配:
const { pathToRegexp } = require('path-to-regexp');
console.log(pathToRegexp('/openapi/:key'));
輸出結果為:
/^\/openapi(?:\/([^\/#\?]+?))[\/#\?]?$/i
url-join
一句話介紹
用 url-join 包可以非常方便地操作一個 url,拼接任意參數。
GitHub 地址:https://github.com/jfromaniello/url-join
使用方法
假設我們需要動態地拼接參數,可以這樣:
const urlJoin = require('url-join');
console.log(urlJoin('http://www.google.com', 'a', '/b/cd', '?foo=123'));
輸出結果為:
http://www.google.com/a/b/cd?foo=123
semver
一句話介紹
NPM 的 semver 規范相關的工具包,判斷版本啥的。
GitHub 地址:https://github.com/npm/node-semver
使用方法
const semver = require('semver')
// 判斷是否符合規范
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
// 判斷 a 版本是否比 b 版本高
semver.gt('1.2.3', '9.8.7') // false
// 判斷 a 版本是否比 b 版本低
semver.lt('1.2.3', '9.8.7') // true
// 判斷符合某個版本范圍的最低版本
semver.minVersion('>=1.0.0') // '1.0.0'
CLI 相關
見之前的文章:實現 CLI 常用工具包 - 終端交互相關(問卷、彩色文字、loading、進度條)
總結
這篇文章到這里就結束了,本文整理了一些在 Node 開發時常用的 NPM 包,希望能夠幫到你。但是社區之大,功能強大的 NPM 包遠不止這些,可以自行探索。
需要使用某個功能的 NPM 包時,可以在 NPM 官網或者 GitHub 上搜索:
