node 基础包 chalk、cross-spawn、yargs-parser、which、fs-extra、Buffer、net 学习

319 阅读5分钟

以下是各个包的具体使用示例

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,网络通信等需要处理二进制数据的场景。

  1. 创建 Buffer

    1. const buffer = Buffer.alloc(10)
    2. const buffer = Buffer.from('hello buffer')
    3. const buffer = Buffer.from([10, 20]);
  2. 写入数据

    1. buffer.write('hello', 0, 5, 'utf-8'); // 在 buffer 的前五个字节中写入 hello
  3. 读取数据

    1. buffer.toString(0, 5, 'utf-8'); // 从第 0 个字节开始读取 5 个字节
  4. 拷贝数据

    1. buffer1.copy(buffer2, 0, 0, 5); // 将 buffer1 的前五个字节拷贝到 buffer2 的前五个字节
  5. 切片

    1. buffer.slice(0, 5)
  6. 网络通信中的使用

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:

文件操作

  1. 检查目录是否存在 fsExtra.exists(path: string, callback?:(exists: boolean) => void)): boolean;
  2. 同步检查文件是否存在 fsExtra.existsSync(path: string): boolean
  3. 读取文件内容 fsExtra.readFile(path: string, options?: { encoding?: string, flag?:string }, callback?:(err: NodeErrnoException | null, data: string | Buffer) => void): void
  4. 同步读取文件内容 fsExtra.readFileSync(path: string, options?: { encoding?:string, mode?:string, flag?: string }): string | Buffer
  5. 写入文件 fsExtra.write(file: string, data: any, options?: { encoding?: string, mode?: number, flag?: string }, callback?: (err: NodeErrnoExpetion | null) => void): void
  6. 同步写入文件 fsExtra.writeSync(file: string, data: any, options?: { encoding?: string, mode?: number, flag?: string }):void
  7. 追加文件内容 fsExtra.appendFile()
  8. 同步追加文件内容 fsExtra.appendFileSync()
  9. 删除文件 fsExtra.unlink(path: string, callback?: (err: NodeErrnoException | null) => void): void;
  10. 同步删除文件 fsExtran.unlinkSync(path: string): void

目录操作

  1. 创建目录 fsExtra.mkdir(path: string, options?: { recursive?: boolean, mode?: number }, callback?:() => void): void
  2. 同步创建目录 fsExtra.mkdirSync()
  3. 读取目录 fsExtra.readdir(path: string, options?: { encoding?: string, withFileTypes?: boolean }, callback?:(err: NodeErrnoExpection | null, file: string[] | Buffer[] | Dirent[]) => void): void
  4. 同步读取目录 fsExtra.readdirSync()
  5. 删除目录 fsExtra.rmdir(path: string, options?: { recursive?: boolean }, callback?: () => void): void
  6. 同步删除目录 fsExtan.rmdirSync();

文件复制和移动

  1. 复制文件或目录 fsExtra.copy(src: string, dest: string, options?: CopyOptions, callback: () => void)
  2. copySync move moveSync

文件和目录其他操作

  1. 读取 json fsExtra.readJson(file: string, options?: { throw?: boolean }, callback?:() => void): void
  2. readJsonSync
  3. 写入 json fsExtra.writeJson(file: string, object: any, options: { spaces?: number, EOL?:string }, callback?:() => void)
  4. writeJsonSync
  5. 清空目录 emptyDir(dir: string, callback?:() => void)
  6. emptyDirSync

一些类型解释 mode、flag、recursive、EOL、spaces、encoding、withFileTypes、dirent、dest

  1. encoding 用于指定文件内容的编码方式,可以确保文以正确格式处理

    1. utf8: UTF-8 编码,支持多语言字符
    2. ascii 支持 7 位 ASCII 编码
    3. base64 用于将二进制编码成文本
    4. hex 用于将二进制编码转成十六进制字符串
    5. binary 将文件当成二进制编码处理
    6. utf16le UTF-16 编码,小端字节序
  2. mode 用于指定文件的权限模式,权限是一个八进制数,表示文件读写和执行权限

    1. 0o666 默认权限,文件所有者、组用户和其他用户都有读写权限
    2. 0o755 文件所有者有读写执行权限,组用户和其他有读执行权限
    3. 0o644 文件所有者有读写,组用户和其他只读
  3. flag 用于指定文件的打开方式

    1. r 读取文件。文件不存在,会抛出错误
    2. r+ 读写文件。文件不存在,会抛出错误
    3. w 写入文件。如果文件不存在,会创建文件;如果文件存在,会截断文件
    4. w+ 读写文件。如果文件不存在,会创建文件;如果文件存在,会截断文件
    5. a 追加文件。如果文件不存在,会创建新文件
    6. a+ 读写追加文件。如果文件不存在,会创建新文件
  4. withFileTypes 用于指定 fs.readdir 和 fs.readdirSync 方法是否返回 Dirent 对象,而不是字符串,Dirent 对象包含的信息可以区分文件和目录

  5. recursive 用于是否递归创建或者删除目录

  6. Dirent 类型表示目录条目,包含文件的类型信息,对象有以下方法:

    1. isDirectory()
    2. isFile()
    3. isBlockDevice() 块设备
    4. isCharacterDevice() 字符设备
    5. isFIFO()
    6. isSocket()
    7. isSymboliclink() 符号链接
  7. EOL 表示行结束符,用于在不同操作系统设置相同的结束符

  8. spaces 用于指定 json 文件缩进空格数