一、minimist (命令行参数解析)

gitHub

先了解下process.argv

// 假设有以下脚本:
process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`)
})
// 启动脚本:
node process-argv.js one two=three four
// 输出:
0: /usr/local/bin/node // process.execPath
1: /Users/mjr/work/node/process-args.js // 脚本文件的地址
2: one
3: two=three
4: four

process.arggithub永久回家地址v可以获取运行脚本时的命令行参数,数组词而之所以常用process.argv.slice(数组公式2),是因为一般第二个参数后才是我们数组和链表的区别需要的。
再来看minimist的用法及例子:

const args = require('minimist')(process.argv.slice(2))

举例:

node test.js -a a -b b
// args: {_: [], a: 'a', b: 'b'}
node test.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
// { _: [ 'foo', 'bar', 'baz' ],
// x: 3,
// y: 4,
// n: 5,
// a: true,
// b: true,
// c: true,
// beep: 'boop' }

minimist会解析参数,并放到一个对象中,方数组指针便在脚本中读取。特别要说明的是其中首apple个key是_,它的值是数组公式数组,包含的是所有没有关联选项的参数。

二、cha命令行快捷键lk(终端多色彩输出)

gitHub

用于终端显示多色彩输出

基本用法:

const chalk = require('chalk');
// 基础用法
console.log(chalk.red('red', 'red2'));
console.log(chalk.red('red'));
// 拼接
console.log(chalk.red('red') + 'middle' + chalk.blue('blue'));
// 多个样式
console.log(chalk.blue.bgRed.bold('hello world'));
// 组合
console.log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));

三、enquirer(终端交互)

gitHub

交互式询问用户输入

基本用法:

const { prompt } = require('enquirer');
// 1. 单次询问:
const options = {
    type: 'input',
    name: 'name',
    message: "What's your name?"
}
// 2. 多次询问:
const options = [
    {
      type: 'input',
      name: 'username',
      message: 'What is your username?'
    },
    {
      type: 'password',
      name: 'password',
      message: 'What is your password?'
    }
  ]
const res = await prompt(options);
console.log(res);

数组和链表的区别一种调用方法:

// 比如input类型:
const { Input } = require('enquirer');
const prompt = new Input({
  message: 'What is your username?',
  initial: 'jonschlinkert'
});
prompt.run()
  .then(answer => console.log('Answer:', answer))
  .catch(console.log);

每次询问都需要指定一个类型type,或引入一个Prompt类。常见的有:github

  1. Input: 普通输入,返回String类型
  2. Password: 密码输入,返回String类型
  3. Confirm: 确认,返回Boolean类型
  4. AutoCo数组和链表的区别mplete: 自动补全
  5. BasicAuth:基本认证(用户名、密码)
  6. Formgithub官网登陆入口表单
  7. In数组的定义visible:不可见信息
  8. MultiSelect: 选择多个
  9. Numeral: 数字

四、execa(执行命令)

gitHub

相当于我们在终端输入命令并执行

先看原生写法:

const util = require('util');
const exec = util.promisify(require('child_process').exec);
const res = await exec('ls');
// 1. 可以传入cwd参数指定执行的目录
const res = await exec('ls', {cwd: path.resolve(__dirname, '../../test')})
// 2. 另一种指定执行目录的方法是 process.chdir()
process.chdir('../../test');
const res = await exec('ls');

跟原生的exec的主要区别或优势:

  1. Promise支持
  2. 更高的最大缓冲区。100mb而不是200kb。
  3. 按名称执行本地安装的二进制文件。
  4. 在父进程appointment终止时清除派生的进Git程。
  5. 更具描述性的错误。

基本api及用法:

  1. execa(file, arguments?, options?)
const { stdout } = await execa('git', ['status']);
// 指定执行目录同样是传入cwd或者process.chdir();
const { stdout } = await execa('git', ['status'], {cwd: resolve('../demo')});
  1. execa.syncappstore(gitlabfile, arguments?数组和链表的区别, options?):同步执行文件
  2. execa.command(command, options?): 与execa()相同,只是文件github直播平台永久回家和参数都在数组排序单个命令字符串中指定
execa.command('git status');
  1. execa.命令行进入指定目录commandSync(command, optionsappstore?):与 execa.command()相同,但是是同步的。

五、fs-extra(操作文件)

gitHub

fs-extra是原生fs的降级,fs中的所有方法都附加到了fs-e命令行参数xtra中,并向fs添加了promise支持。如果没有传入回调,所有的fs方法都会返回p数组词romise 。

先回顾下原生fs的一些常用方法:

  1. 获取文件类型:
const resolve = p => path.resolve(__dirname, p);
const stat = fs.statSync(resolve('../../README.txt'));
console.log(stat.isDirectory()); // 是否是文件夹
console.log(stat.isFile()); // 是否是文件
  1. 文件或目录是否存在:
console.log(fs.existsSync(resolve('../fs/fs.js')));
  1. 获取目录下的所有文件名
fs.readdirSync(path.resolve(__dirname, '../fs'));
  1. 读写(复制文件)
const source = fs.readFileSync(resolve('./fs.js')); // 返回的是一个Buffer对象
fs.writeFileSync(resolve('./test.js'), source);
  1. 流读写
const readStream = fs.createReadStream(resolve('./1.png');
readStream.on('error', (err) => { // 监听error
   console.log('流读取失败:', err);
})
const writeStream = fs.createWriteStream('./2.png');
writeStream.on('error', (err) => {
   console.log('流写入失败:', err);
    })
writeStream.on('close', (data) => {
console.log('流写入完成', data);
 })
readStream.pipe(writeStream);
  1. 重命名
fs.renameSync(resolve('./old.js'),resolve('./new.js'));
  1. 创建文件/目录
fs.mkdirSync(resolve('./newDir');
// 写入文件(会覆盖之前的内容),文件不存在就创建
fs.writeFileSync(resolve('./new.js', 'console.log(1)');
  1. 删除文件/目录
fs.unlinkSync(resolve('./newDir/test.js')); // 删除文件
// 只能删空目录,要删除非空文件夹,需要先把文件夹里的文件删除,再删除空文件夹
fs.rmdirSync(resolve('./newDir'));
  1. 追加文件内容
const context = `console.log(111)`;
fs.appendFileSync(resolve('./new.js'), context);

再来看下fs-extra的一些常用API:

  1. c命令行窗口opy(src, dest[, options][, callback]):复制文件/文件夹
const fse = require('fs-extra');
// With a callback:
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
  if (err) return console.error(err)
  console.log('success!')
}) 
// copies file
fs.copy('/tmp/mydir', '/tmp/mynewdir', err => {
  if (err) return console.error(err)
  console.log('success!')
}) // copies directory, even if it has subdirectories or files
// With Promises:
fs.copy('/tmp/myfile', '/tmp/mynewfile')
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
// With async/await:
async function example () {
  try {
    await fs.copy('/tmp/myfile', '/tmp/mynewfile')
    console.log('success!')
  } catch (err) {
    console.error(err)
  }
}
example()
  1. emptyDir(dappreciateir[, callback]):清空目录

确保目录是空的。如果目录非空,删除目录下所有内容。如果目录不存在,创建一个空目录。

  1. ensureFile(file[, callback]): 创建文github永久回家地址

确保文件存在。如果被添加的文件所在的目录不存在,创建该目录。如果文件已经存在了,不进行操作。

  1. ensureDir(dir[,options][,callback]): 创建数组初始化目录

确保目录存在。如果不存在,则创建。github直播平台永久回家

  1. remove(path[, callback]):删除文件/目录github汤姆

可以删除有内容的目github下载录(这一点比fs优秀)。如果文件/目录存在,不进行任何操作。

本次只介绍几个常用的库的一些基本用法。这些工具库的用法还有很多,如果想更完整的了解,可以点击相应库的gitHub地址查看。