我最近在学习慕课网前端架构师课程,学习起来还是有很多东西不是很熟悉。于是准备把每一次学习的内容输出以下,今天是第一天。
背景:
文件夹下有两个包,分别是
simoon-test和simoon-test-lib,如图(1-1)。在simoon-test下,执行命令,解析参数解析。比如:node simoon-test init --name test和node simoon-test --version。
simoon-test-lib文件的作用是接受simoon-test文件中解析参数的接收方。主要代码如下:
module.exports = {
sum(a, b) {
return a + b
},
init({ option, param }) {
console.log('init')
console.log('执行init方法', option, param)
}
}
命令注册和参数解析
第一步:在simoon-test文件夹下,执行npm link simoon-test-lib
第二步:引入simoon-test-lib
在node中,require('process').argv,可以获取命令中的参数。
let argvs = require('process').argv;
console.log(argvs)
执行命令node bin/index.js init获得argvs的结果如下:
[
'/Users/mac/.nvm/versions/node/v10.15.3/bin/node',
'/Volumes/其他资料/learn/慕课架构课/第一周/simoon-test/bin/index.js',
'init',
'--name',
'test'
]
在这里,能看到参数的第三个就是init,后面的是参数。所以我需要把argvs截取一下,获得options。
let command = argvs[2];
const options = argvs.splice(3);
在这里做一个判断,如果options的长度大于1,则执行simoon-test-lib中的方法。内部需要做一些简单的处理:
- 从options中获取option和param
- 把option中的--去除(比如 --name 变成 name)
- 根据参数,执行simoon-test-lib中的方法
if (options.length > 1) {
let [option, param] = options;
option = option.replace('--', '');
if (command) {
if (lib[command]) {
lib[command]({ option, param })
} else {
console.log('无效的命令')
}
} else {
console.log('请输入命令')
}
}
全局命令解析
有一种情况,比如vue --version,这种情况下,第三个参数就是--开头的参数。这种称作全局选项globalOption。
在这种情况下需要单独处理。处理的方法如下:
let command = argvs[2];
if (command.startsWith('--') || command.startsWith('-')) {
const globalOption = command.replace(/--|-/g, '')
if (globalOption === 'version' || globalOption === 'V') {
console.log('当前版本号是:v1.0.0')
}
}
这里的意思是,如果发现argv的第三个参数是以--或者-开头的,将会替换掉--或者-。然后再做一些处理。
最后
今天就这么多,日拱一卒,不断精进(内卷)。