以下是各个包的具体使用示例
which
which 是一个用于查找命令路径的工具。它可以帮助你确定某个命令是否存在于系统的 PATH 中,并返回其完整路径。
import which from 'which';
try {
const nodePath = which.sync('node');
console.log('Node.js 路径:', nodePath);
} catch (error) {
console.error('Node.js 未安装或不在 PATH 中:', error);
}
cross-spawn
spawn 是 cross-spawn 中一个模块方法,用于在 Node.js 中创建子进程。cross-spawn 是跨平台的 spawn 的封装,确保在不同操作系统中能正常工作
import * as spawn from 'cross-spawn';
const child = spawn('npm', ['run', 'lint'], { stdio: 'inherit' });
child.on('close', (code: number) => {
if (code === 0) {
console.log('Lint 检查成功');
} else {
console.error('Lint 检查失败');
}
});
chalk
chalk 是一个用于在控制台输出带颜色文本的库
import chalk from 'chalk';
console.log(chalk.red('这是一个红色的错误消息'));
console.log(chalk.green('这是一个绿色的成功消息'));
console.log(chalk.yellow('这是一个黄色的警告消息'));
yargs-parser
yargs-parser 是一个用于解析命令行参数的库,它可以帮你把命令行参数解析成一个对象
import yargsParser from 'yargs-parser';
const argv = yargsParser('npm run build -- --env production --config path/to/config.json');
console.log('解析后的参数:', argv);
// 输出:
// {
// _: [ 'npm', 'run', 'build' ],
// env: 'production',
// config: 'path/to/config.json'
// }
Buffer
Buffer 是一个可以处理二进制数据的类,它提供了一种在 js 中可以处理原始数据的方法。在 Node.js 中,Buffer 通常用于处理文件 I/O,网络通信等需要处理二进制数据的场景。
-
创建 Buffer
- const buffer = Buffer.alloc(10)
- const buffer = Buffer.from('hello buffer')
- const buffer = Buffer.from([10, 20]);
-
写入数据
- buffer.write('hello', 0, 5, 'utf-8'); // 在 buffer 的前五个字节中写入 hello
-
读取数据
- buffer.toString(0, 5, 'utf-8'); // 从第 0 个字节开始读取 5 个字节
-
拷贝数据
- buffer1.copy(buffer2, 0, 0, 5); // 将 buffer1 的前五个字节拷贝到 buffer2 的前五个字节
-
切片
- buffer.slice(0, 5)
-
网络通信中的使用
import net from 'net';
const server = net.createServer((socket) => {
socket.on('data', (data) => {
const buffer = data;
console.log('收到的数据 Buffer:', buffer);
const str = buffer.toString('utf8'); // 将 Buffer 转换为字符串
console.log('收到的数据:', str);
const response = Buffer.from('Hello, Client!');
socket.write(response);
});
socket.on('end', () => {
console.log('连接关闭');
});
});
server.listen(8080, () => {
console.log('服务器启动,监听 8080 端口');
});
fs-extra
fs-extra 提供了很多方便的方法,以下是一些常用的 API:
文件操作
- 检查目录是否存在
fsExtra.exists(path: string, callback?:(exists: boolean) => void)): boolean; - 同步检查文件是否存在
fsExtra.existsSync(path: string): boolean - 读取文件内容
fsExtra.readFile(path: string, options?: { encoding?: string, flag?:string }, callback?:(err: NodeErrnoException | null, data: string | Buffer) => void): void - 同步读取文件内容
fsExtra.readFileSync(path: string, options?: { encoding?:string, mode?:string, flag?: string }): string | Buffer - 写入文件
fsExtra.write(file: string, data: any, options?: { encoding?: string, mode?: number, flag?: string }, callback?: (err: NodeErrnoExpetion | null) => void): void - 同步写入文件
fsExtra.writeSync(file: string, data: any, options?: { encoding?: string, mode?: number, flag?: string }):void - 追加文件内容
fsExtra.appendFile() - 同步追加文件内容
fsExtra.appendFileSync() - 删除文件
fsExtra.unlink(path: string, callback?: (err: NodeErrnoException | null) => void): void; - 同步删除文件
fsExtran.unlinkSync(path: string): void
目录操作
- 创建目录
fsExtra.mkdir(path: string, options?: { recursive?: boolean, mode?: number }, callback?:() => void): void - 同步创建目录
fsExtra.mkdirSync() - 读取目录
fsExtra.readdir(path: string, options?: { encoding?: string, withFileTypes?: boolean }, callback?:(err: NodeErrnoExpection | null, file: string[] | Buffer[] | Dirent[]) => void): void - 同步读取目录
fsExtra.readdirSync() - 删除目录
fsExtra.rmdir(path: string, options?: { recursive?: boolean }, callback?: () => void): void - 同步删除目录
fsExtan.rmdirSync();
文件复制和移动
- 复制文件或目录
fsExtra.copy(src: string, dest: string, options?: CopyOptions, callback: () => void) copySync move moveSync
文件和目录其他操作
- 读取 json
fsExtra.readJson(file: string, options?: { throw?: boolean }, callback?:() => void): void readJsonSync- 写入 json
fsExtra.writeJson(file: string, object: any, options: { spaces?: number, EOL?:string }, callback?:() => void) writeJsonSync- 清空目录
emptyDir(dir: string, callback?:() => void) emptyDirSync
一些类型解释 mode、flag、recursive、EOL、spaces、encoding、withFileTypes、dirent、dest
-
encoding用于指定文件内容的编码方式,可以确保文以正确格式处理- utf8: UTF-8 编码,支持多语言字符
- ascii 支持 7 位 ASCII 编码
- base64 用于将二进制编码成文本
- hex 用于将二进制编码转成十六进制字符串
- binary 将文件当成二进制编码处理
- utf16le UTF-16 编码,小端字节序
-
mode用于指定文件的权限模式,权限是一个八进制数,表示文件读写和执行权限- 0o666 默认权限,文件所有者、组用户和其他用户都有读写权限
- 0o755 文件所有者有读写执行权限,组用户和其他有读执行权限
- 0o644 文件所有者有读写,组用户和其他只读
-
flag用于指定文件的打开方式- r 读取文件。文件不存在,会抛出错误
- r+ 读写文件。文件不存在,会抛出错误
- w 写入文件。如果文件不存在,会创建文件;如果文件存在,会截断文件
- w+ 读写文件。如果文件不存在,会创建文件;如果文件存在,会截断文件
- a 追加文件。如果文件不存在,会创建新文件
- a+ 读写追加文件。如果文件不存在,会创建新文件
-
withFileTypes用于指定 fs.readdir 和 fs.readdirSync 方法是否返回 Dirent 对象,而不是字符串,Dirent 对象包含的信息可以区分文件和目录 -
recursive用于是否递归创建或者删除目录 -
Dirent类型表示目录条目,包含文件的类型信息,对象有以下方法:- isDirectory()
- isFile()
- isBlockDevice() 块设备
- isCharacterDevice() 字符设备
- isFIFO()
- isSocket()
- isSymboliclink() 符号链接
-
EOL表示行结束符,用于在不同操作系统设置相同的结束符 -
spaces用于指定 json 文件缩进空格数