前言
在大家的支持下,今年参加掘金的人气作者排行榜,最后获得了2021年度人气作者第7
的成绩,再次感谢各位朋友们的鼎力支持。但没想到最后被狠狠的恶心了一把,除了排名揭晓时当天的直播外,官方至今没有再推送人气排行榜的任何信息。
所以我特别生气,一怒之下写了篇文章表达不满
不过,过去的事就不再啰嗦了,反正不爱了。
这篇文章主要是介绍一下我写的一个小插件juejin-posts-backup
,可以一键备份下载某用户全部的掘金文章为markdown文件。
另外也想通过这篇文章,来分享一下如何发布一个自己的npm包 或基于node的命令行工具。
获取参数
首先你当然要实现自己这个应用的逻辑,当用户在使用你工具的时候,可以通过下面的方式来获得参数
代码语言:javascript复制node index.js 123213213
然后你在代码中通过
代码语言:javascript复制process.argv.slice(2)
就能获取到传参的内容,不过本文里我要分享一个inquirer.js
的插件,它可以帮助我们的应用在node命令行中实现用户交互,比如可以等待用户输入,可以引导用户选择一些选项。就像vuecli
一样
我分享一下我代码中的用法,其他用法大家自己去看它的文档吧,非常简单
inquirer.js
文档:https://github.com/sboudrias/Inquirer.js
async function letUserInput(){
let jj_userid,jj_username;
//第一个等待用户输入的问题
await inquirer.prompt([
{
name:"输入要备份的掘金用户ID",
type:"number",//仅限输入数字
required:true,//必填
validate: function (input) {//校验输入
var done = this.async();
//我这里的校验是去获取掘金的用户信息,能获取到代表输入没问题
getUserInfo(input,(res)=>{
if(res.err_no!=0){
done(res.err_msg);
}else if(res.data.user_name){
jj_userid = input;
jj_username = res.data.user_name;
done(null, true);
}else done('没有找到对应用户');
})
}
}
]);
//第二个等待用户输入的问题,这是一个confirm形式的问题,需要用户输入y/n
const res = await inquirer.prompt([
{
name:"确定要备份 " jj_username " 的全部文章吗?",
type:"confirm",
default:true
}
]);
//获取用户最后输入的结果
if(Object.values(res)[0])getArticlesAfter(jj_userid);
}
忽略配置
添加 .npmignore
来忽略一些目录下的项目,和 .gitignore
一样
全局包的配置和调试
最终我们希望用户通过全局命令来使用,所以我们要在package.json
中添加
"bin": {
"jjbackup": "index.js"
}
这段配置代表了最终会生成一个名为jjbackup
的bin文件,实际执行的node代码文件为index.js
index.js文件的第一行要加入
代码语言:javascript复制#!/usr/bin/env node
这一行的意思是这个bin文件使用node来执行
接着使用npm link
命令,将本地代码软链到系统命令中来模拟用户全局安装。
完成后你就可以使用jjbackup
命令来试试看。
发布NPM包
测试都没问题后,你就可以准备发布你的npm包了。
- 注册npm账户(https://www.npmjs.com/)
- 使用
npm login
命令在终端中登录你的账户 - 使用
npm publish
发布的插件
在发布时,你可能会遇到一些问题。一般百度或Google都能找到解决方案。
但下面这个问题真是让我挠头了很久,后来在https://www.npmjs.com/ 账号里重新绑定一个新的邮箱,并完成邮箱的验证后就解决了。