手把手教你创建一个cli(2)

127 阅读3分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

前言

上一篇文章中我们运用 node 提供的 process.argv 加上 commander 实现了一个简单的能读取命令行输入的cli,今天就来优化这个cli,我们要来实现将输入的字符串转为好看的艺术字。

根据不同的命令来动态引用不同模块

上一篇结尾,我们的create命令只能调用一句简单的 console.log 命令,接下来我们要获取到命令并且根据不同的命令去引用不同的模块,并且将参数传递过去。 将之前的 console.log(action); 替换成如下代码,截取命令并且相对应模块传递参数。

// 截取命令
// wordart-line create xxx 
require(path.resolve(__dirname, action))(...process.argv.slice(3));

这里引入 node 的 path 用来拼接路径让我们能够获取到目录下的 action 模块,当然,现在我们的action模块只有一个 create 。并且通过 slice 分隔,将命令之后的参数传递给 creat 模块。

接着我们要创建create.js模块,先简单的在其中输出用户传递给我们的参数。

image.png

// 创建create.js
module.exports = async (projectName) => {
    console.log("我是create里的:",projectName);
};

成功在命令行输出:

PS D:\wordArt-line> wordart-line c a 
我是create里的: a

这样就成功引用了 create 模块,并且这样的写法方便我们日后去扩展除了 create 以为的其他功能

figlet的基础使用

通过官方的基本使用教程,我们先简单的使用一下 figlet 。先是安装需要的依赖:

npm install figlet

然后引入 figlet

var figlet = require('figlet');

最后通过官方的使用介绍,我们先来简单的输出一下 “hello world”,在 module.exports 中加上:

figlet('Hello World!!', function(err, data) {
    if (err) {
        console.log('Something went wrong...');
        console.dir(err);
        return;
    }
    console.log(data)
});

然后运行我们的cli:

image.png

可以看到这里我们已经可以将“hello world”打印出来了,接下去我们只需要将用户的输入动态的传给figlet。

image.png 就可以实现通过命令行输入打印了

动态配置figlet

我们现在命令只能生成最简单的figlet,但是figlet官方提供了很多很好玩的参数可以用来配置我们生成的字体的样子,这里就说一下思路:

  1. 我们可以通过配置不同的 flag 并且在引用create的时候把flag也传入进去,用于定义样式。
  2. 或者可以在项目中去读取用户自定义的config配置文件,里面可以配置相关的参数。

总结

其实写一个属于自己的cli主要就是去读取配置或者命令行输入,尽可能的扩展自己的cli,让它能接受更多的参数配置,这样才能给用户带来更好的体验。至于我们功能的实现,上面的字体log只是一个小例子,实际中遇到的需求,我们可以拆分成多个子任务,对应的去查找每个子任务的第三方开源库或者自己手动实现,运用这种拆分的思想就会发现最后的实现只不过是去组装每一个小功能罢了。