CLI 常用

inquirer

常用的命令行交互界面集合(package inquirer)。通过命令行的方式来进行书写。

  1. const inquirer = require('inquirer')
  2. const chalk = require('chalk')
  3. inquirer
  4. .prompt([
  5. /* Pass your questions in here */
  6. {
  7. type: 'input',
  8. name: 'name',
  9. message: '请输入你的姓名'
  10. },
  11. {
  12. type: 'list',
  13. name: 'sex',
  14. message: '请选择你的性别',
  15. choices: ['男', '女']
  16. }
  17. ])
  18. .then(answers => {
  19. // Use user feedback for... whatever!!
  20. const { name, sex } = answers
  21. })
  22. .catch(error => {
  23. if(error.isTtyError) {
  24. // Prompt couldn't be rendered in the current environment
  25. } else {
  26. // Something else went wrong
  27. }
  28. });

chalk

为终端的文字添加样式(package chalk)。

  1. const chalk = require('chalk')
  2. const log = console.log
  3. // ES2015 template literal
  4. log(`
  5. CPU: ${chalk.red('90%')}
  6. RAM: ${chalk.green('40%')}
  7. DISK: ${chalk.yellow('70%')}
  8. `);
  9. // ES2015 tagged template literal
  10. log(chalk`
  11. CPU: {red ${cpu.totalPercent}%}
  12. RAM: {green ${ram.used / ram.total * 100}%}
  13. DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
  14. `)

ora

显示终端的旋转 loading 动画(package ora)。

  1. // 封装
  2. const ora = require('ora');
  3. const chalk = require('chalk');
  4. const spinner = ora();
  5. const start = msg => {
  6. spinner.text = chalk.blue(msg);
  7. spinner.start();
  8. };
  9. const success = msg => {
  10. spinner.stopAndPersist({
  11. symbol: chalk.green('✔'),
  12. text: chalk.green(msg),
  13. });
  14. };
  15. const stop = () => {
  16. spinner.stop();
  17. };
  18. const error = msg => {
  19. spinner.fail(chalk.red(msg));
  20. };
  21. module.exports = {
  22. start,
  23. stop,
  24. success,
  25. error,
  26. };
  27. // 使用
  28. const spinner from './spinner';
  29. spinner.start('Loading...');
  30. setTimeout(() => {
  31. spinner.success('Load success');
  32. }, 2000);

commander

命令行界面解决方案。

minimist

解析参数选项。

progress estimator

在终端输出异步任务的进度条,它会根据每个任务的历史记录来估算这个任务需要的时间(pacakge progress)。能够较为准确的告知用户此次异步操作所需要的时间。

  1. const createLogger = require('progress-estimator');
  2. const chalk = require('chalk');
  3. const path = require('path');
  4. let _logger = null;
  5. const logger = (task, message, estimate) => {
  6. if (!_logger) {
  7. _logger = createLogger({
  8. storagePath: path.join(__dirname, '.progress-estimator'),
  9. });
  10. }
  11. return _logger(task, chalk.blue(message), {
  12. estimate,
  13. });
  14. };
  15. const task1 = new Promise(resolve => {
  16. setTimeout(() => {
  17. resolve({ success: true });
  18. }, 1200);
  19. });
  20. const task2 = new Promise(resolve => {
  21. setTimeout(() => {
  22. resolve({ success: true });
  23. }, 4200);
  24. });
  25. async function run() {
  26. const startTime = Date.now();
  27. console.log();
  28. console.log(chalk.blue('Some Tasks'));
  29. console.log();
  30. await logger(task1, 'Task 1', 1500);
  31. await logger(task2, 'Task 2', 600);
  32. const endTime = Date.now();
  33. const time = ((endTime - startTime) / 1000).toFixed(2);
  34. console.log();
  35. console.log(chalk.green(`✨ Done in ${time}s`));
  36. console.log();
  37. }
  38. run();

文件系统

glob

globby

fs-extra

shelljs

cross-spawn

rimraf

cross-env

网络请求

node-fetch

axios

小工具

open

http-server

path-to-regexp

url-join

semver