脚手架系列-minimist、leven、slash

minimist

一个做参数解析的工具包,这个工具可以用来解析process.argv的参数。在vue的cli脚手架里面它主要用来判断用户输入的参数个数。

举个例子,你在使用vue create命令时,官方的要求是create后面只能接一个参数,也就是app的名字,如果你输入过多参数,cli就会把之后多输入的给过滤掉并给出提示,这儿给大家符上vue cli的源码看看

if (minimist(process.argv.slice(3))._.length > 1) {
  console.log(chalk.yellow('\n Info: You provided more than one argument. The first one will be used as the app\'s name, the rest are ignored.'))
}
复制代码

minimist使用方法

本次教程使用的版本为:1.2.5

官方地址:github.com/substack/mi…

这儿我结合commander一起使用,来看看minimist做的解析结果,先上一段代码:

const { program } = require('commander');

const minimist = require('minimist');

program
  .version('1.0.0', '-v, --vers')
  .command('start <name> [options...]')
  .description('Test a whole commander order')
  .option('-e --extra [exargs]', 'Test a options')
  .action((name, startOptions, cmd) => {
    console.log(cmd);
  });

program.parse(process.argv);
console.log(process.argv);

let args = minimist(process.argv);

console.log(args);
复制代码

我们运行这个脚本node xxx.js start app dev -e selected,输出结果如下

// console.log(process.argv);对应的输出
[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\LEE\\Desktop\\cli-study\\tools-study\\minimist-test\\minimist-practice.js',
  'start',
  'app',
  'dev',
  '-e',
  'selected'
]
// console.log(args);对应的输出
{
  _: [
    'C:\\Program Files\\nodejs\\node.exe',
    'C:\\Users\\LEE\\Desktop\\cli-study\\tools-study\\minimist-test\\minimist-practice.js',
    'start',
    'app',
    'dev'
  ],
  e: 'selected'
}
复制代码

大家可以看到,minimistprocess.argv对应的数组数据规范化了,更加方便我们取到对应的值。把命令和参数对应放到了一个单独的数组里面,选项对应的解析成了键值对对象。

这里大家大概知道minimist做的事情了。

minimist参数

minimist()这个方法对应可以传两个参数,minimist(args, opts={})

const minimist = require('minimist');

let argv = minimist(args, opts={})
复制代码
  • args,需要解析的数组,必填
  • opts,额外传给minimist的参数选项,可选

argv._输出一个数组,包含我们的命令参数。

当你执行脚本时在,我们在选项的后面不跟任何参数的话,minimist解析对应的时boolean值,除了你指定opts.string或opts.boolean的参数

以上面代码为例子,我们执行脚本node minimist-practice.js start app 500 --extra 23,解析过后,extra对应的值是23,执行 node minimist-practice.js start app 500 --extra lala,解析后,extra对应的值是lala,执行node minimist-practice.js start app 500 --extra解析后,extra对应的值是true。

如果我们给脚本的minimist加上opts参数,如下面代码

let args = minimist(process.argv, {
  string: 'extra' // 这个地方指定你要解析的选项,如果要解析多个选项,请传入对应的数组即可,如['erxta1', 'extra2']
});

console.log(args);
复制代码

执行命令 node minimist-practice.js start app 500 --extra,解析后,extra对应的值是”空字符串。执行node minimist-practice.js start app 500 --extra 23解析后,extra对应的值是’23’字符串类型。依次类推。

如果你执行脚本时最后以--结束,那么后面对应的输入全部写进args._数组里面

比如你执行node minimist-practice.js start app 500 --extra lala -- haha yaya,最终args的结果如下

{
  _: [
    'C:\\Program Files\\nodejs\\node.exe',
    'C:\\Users\\LEE\\Desktop\\cli-study\\tools-study\\minimist-test\\minimist-practice.js',
    'start',
    'app',
    500,
    'haha',
    'yaya'
  ],
  extra: 'lala'
}
复制代码

opts还有对应的其他选项可以设置,本文只是介绍minimist的基本用法,这儿就不再赘述,大家可以参考官方文档的选项设置方法。

leven

leven,一个借助编辑距离算法实现的测量两个字符串之间的差异的工具库。

编辑距离算法:blog.csdn.net/www_hellowo…

leven使用方法

本次教程使用的版本为:3.1.0

官方地址:github.com/sindresorhu…

使用方法很简单,直接代码展示:

// 参数为两个字符串,返回值为字符串里面字母差异的个数
const leven = require('leven');

console.log(leven('hello', 'hello')); // 0
console.log(leven('hello', 'hella')); // 1
console.log(leven('hello', 'aelii')); // 3
console.log(leven('hello', 'hello world')); // 6
复制代码

slash

slash,这个工具库可以将Windows上的反斜杠转换成正正斜杠。

slash使用方法

本次教程使用的版本为:3.0.0

官方地址:github.com/sindresorhu…

使用方法很简单,直接代码展示:

// 参数为路径,类型接受一个字符串
const slash = require('slash');

console.log(process.cwd()); // D:\PROJ\cli-study\tools-study\slash-test
console.log(slash(process.cwd())); // D:/PROJ/cli-study/tools-study/slash-test
复制代码

validate-npm-package-name

validate-npm-package-name,给一个名字,这个工具可以帮你判断你的命名是不是一个合法的npm包命名。

validate-npm-package-name使用方法

本次教程使用的版本为:3.0.0

官方地址:github.com/npm/validat…

代码演示:

const validatePackage = require('validate-npm-package-name');

console.log(validatePackage('haha')); // { validForNewPackages: true, validForOldPackages: true }
console.log(validatePackage('@vue/cli')); // { validForNewPackages: true, validForOldPackages: true }
console.log(validatePackage('$%$%sS'))
// {
//   validForNewPackages: false,
//   validForOldPackages: false,
//   warnings: [ 'name can no longer contain capital letters' ],
//   errors: [ 'name can only contain URL-friendly characters' ]
// }
复制代码

返回值里面有两个属性validForNewPackagesvalidForOldPackages。validForOldPackages这个主要是针对老的npm命名,按官方文档的说法:在npm的旧时代,包名很疯狂。可以是大写字母。它们可能会很长。它们可以是节点核心中现有模块的名称。

In the old days of npm, package names were wild. They could have capital letters in them. They could be really long. They could be the name of an existing module in node core.

所以当你输入一下的包名时(比如包含大写字母),输出的结果是这样的:

const validatePackage = require('validate-npm-package-name');
console.log(validatePackage('SS-ada_da'));
// 输出结果
{
  validForNewPackages: false,
  validForOldPackages: true,
  warnings: [ 'name can no longer contain capital letters' ]
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享