用node开发并发布一个cli工具的方法步骤


Posted in Javascript onJanuary 03, 2019

cli本质是一种用户操作界面,根据一些指令和参数来与程序完成交互并得到相应的反馈,好的cli还提供帮助信息,我们经常使用的vue-cli就是一个很好的例子。本文将使用nodejs从头开发并发布一款cli工具,用来查询天气。

项目效果图如下:

用node开发并发布一个cli工具的方法步骤 

配置项目

初始化一个项目: npm init -y 编写入口文件index.js:

module.exports = function(){ 
	console.log('welcome to Anderlaw weather') 
}

创建bin文件

bin目录下创建index:

#!/usr/bin/env node
require('../')()

package.json配置bin信息

{
 "name": "weather",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "bin": {
 "weather": "bin/index"
 }
}

然后在根目录(package.json同级)运行 npm link ,该操作会将该项目的模块信息和bin指令信息以软链接的形式添加到npm全局环境中:

  • C:\Users\mlamp\AppData\Roaming\npm\node_modules 下多了一个模块链接
  • C:\Users\mlamp\AppData\Roaming\npm 下多了个名为 weather 的cmd文件。

好处是可以更方便地进行本地调试。 然后我们打开终端输入: weather 就会看到 welcome to Anderlaw weather 的log信息

解析命令与参数

此处我们使用 minimist 库来解析如:npm --save ,npm install 的参数。

安装依赖库 npm i -S minimist

使用 process.argv 获取完整的输入信息

使用 minimist 解析,例如:

weather today === args:{_:['today']}
weather -h === args:{ h:true }
weather --location 'china' === args:{location:'china'}

首先我们要实现查询今天和明天的天气,执行 weather today[tomorrow]

const minimist = require('minimist');
module.exports = ()=>{
 const args = minimist(process.argv.slice(2));//前两个是编译器相关路径信息,可以忽略
 let cmd = args._[0];
 switch(cmd){
 	case 'today':
 	console.log('今天天气不错呢,暖心悦目!');
 	break;
 	case 'tomorrow':
 	console.log('明天下大雨,注意带雨伞!');
 	break;
 }
}

以上,如果我们输入 weather 就会报错,因为没有取到参数.而且还没添加版本信息,因此我们还需要改善代码

const minimist = require('minimist')
const edition = require('./package.json').version
module.exports = ()=>{
 const args = minimist(process.argv.slice(2));//前两个是编译器相关路径信息,可以忽略
 let cmd = args._[0] || 'help';
 if(args.v || args.version){
		cmd = 'version';//查询版本优先!
	}
 switch(cmd){
 	case 'today':
 	console.log('今天天气不错呢,暖心悦目!');
 	break;
 	case 'tomorrow':
 	console.log('明天下大雨,注意带雨伞!');
 	break;
 	case 'version':
 	console.log(edition)
 	break;
 	case 'help':
 	console.log(`
  	weather [command] <options>
 
		  today .............. show weather for today
		  tomorrow ............show weather for tomorrow
		  version ............ show package version
		  help ............... show help menu for a command
		`)
 }
}

接入天气API

截止目前工作顺利进行,我们还只是手工输入的一些mock信息,并没有真正的实现天气的查询。 要想实现天气查询,必须借助第三方的API工具,我们使用心知天气提供的免费数据服务接口。

需要先行注册,获取API key和id 发送请求我们使用axios库(http客户请求库)

安装依赖: npm i -S axios 封装http模块

///ajax.js
const axios = require('axios')
module.exports = async (location) => {
 const results = await axios({
 method: 'get',
 url: 'https://api.seniverse.com/v3/weather/daily.json',
 params:{
  key:'wq4aze9osbaiuneq',
  language:'zh-Hans',
  unit:'c',
  location
 }
 })
 return results.data
}

该模块接收一个 地理位置 信息返回今天、明天、后台的天气信息。

例如查询上海今天的天气: weather today --location shanghai

修改入口文件,添加 async标志

const minimist = require('minimist')
const ajax = require('./ajax.js')
const edition = require('./package.json').version
module.exports = async ()=>{
 const args = minimist(process.argv.slice(2));//前两个是编译器相关路径信息,可以忽略
 let cmd = args._[0] || 'help';
 if(args.v || args.version){
		cmd = 'version';//查询版本优先!
	}
 let location = args.location || '北京';
 let data = await ajax(location);
 data = data.results[0];
	let posotion= data.location;
 let daily = data.daily;
 switch(cmd){
 	case 'today':
 	//console.log('今天天气不错呢,暖心悦目!');
 	console.log(`${posotion.timezone_offset}时区,${posotion.name}天气,${posotion.country}`)
  console.log(`今天${daily[0].date}:白天${daily[0].text_day}夜晚${daily[0].text_night}`)
 	break;
 	case 'tomorrow':
 	//console.log('明天下大雨,注意带雨伞!');
 	console.log(`${posotion.timezone_offset}时区,${posotion.name}天气,${posotion.country}`)
  console.log(`今天${daily[1].date}:白天${daily[1].text_day}夜晚${daily[1].text_night}`)
 	break;
 	case 'version':
 	console.log(edition)
 	break;
 	case 'help':
 	console.log(`
  	weather [command] <options>
 
		  today .............. show weather for today
		  tomorrow ............show weather for tomorrow
		  version ............ show package version
		  help ............... show help menu for a command
		`)
 }
}

我们输入 weather today --location shanghai ,发现有结果了:

用node开发并发布一个cli工具的方法步骤 

修修补补,添加loading提示和默认指令

截止当前,基本完成了功能开发,后续有一些小问题需要弥补一下,首先是一个进度提示,使用起来就更加可感知,我们使用 ora 库.

其次我们需要当用户输入无匹配指令时给予一个引导,提供一个默认的log提示。

安装依赖 npm i -S ora

编写loading模块:

const ora = require('ora')
module.exports = ora()
// method start and stop will be use

修改入口文件

const minimist = require('minimist')
const ajax = require('./ajax.js')
const loading = require('./loading')
const edition = require('./package.json').version
module.exports = async ()=>{
 const args = minimist(process.argv.slice(2));//前两个是编译器相关路径信息,可以忽略
 let cmd = args._[0] || 'help';
 if(args.v || args.version){
		cmd = 'version';//查询版本优先!
	}
 let location = args.location || '北京';
 loading.start();
 let data = await ajax(location);
 data = data.results[0];
	let posotion= data.location;
 let daily = data.daily;
 switch(cmd){
  case 'today':
 	//console.log('今天天气不错呢,暖心悦目!');
 	console.log(`${posotion.timezone_offset}时区,${posotion.name}天气,${posotion.country}`)
  console.log(`今天${daily[0].date}:白天${daily[0].text_day}夜晚${daily[0].text_night}`)
  loading.stop();
  break;
  case 'tomorrow':
  
 	//console.log('明天下大雨,注意带雨伞!');
 	console.log(`${posotion.timezone_offset}时区,${posotion.name}天气,${posotion.country}`)
  console.log(`今天${daily[1].date}:白天${daily[1].text_day}夜晚${daily[1].text_night}`)
  loading.stop();
 	break;
  case 'version':
  
  console.log(edition)
  loading.stop();
 	break;
 	case 'help':
 	console.log(`
  	weather [command] <options>
 
		  today .............. show weather for today
		  tomorrow ............show weather for tomorrow
		  version ............ show package version
		  help ............... show help menu for a command
  `)
  loading.stop();
  default:
  console.log(`你输入的命令无效:${cmd}`)
  loading.stop();
 }
}

发布

发布至npm仓库之后 可以直接以npm i -g weather全局方式安装我们发布的cli,并在任何地方输入weather命令查询天气了哟!

如果不清楚如何发布可查看我的另一篇文章发布一款npm包帮助理解npm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
疯掉了,尽然有js写的操作系统
Apr 23 Javascript
js内置对象 学习笔记
Aug 01 Javascript
JS Replace()的高级使用方法介绍
Jun 29 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
Jan 05 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
VueJs使用Amaze ui调整列表和内容页面
Nov 30 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
Apr 09 Javascript
vue实现几秒后跳转新页面代码
Sep 09 Javascript
js实现纯前端压缩图片
Nov 16 Javascript
react项目从新建到部署的实现示例
Feb 19 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
Jan 03 #Javascript
Vue2 添加数据可视化支持的方法步骤
Jan 02 #Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 #Javascript
如何使用less实现随机下雪动画详解
Jan 02 #Javascript
详解Vue2 添加对scss的支持
Jan 02 #Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
Jan 02 #Javascript
JS中数据结构之栈
Jan 01 #Javascript
You might like
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php rsa加密解密使用详解
2015/01/14 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
Python文件去除注释的方法
2015/05/25 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
校园达人秀策划书
2014/01/12 职场文书
趣味体育活动方案
2014/02/08 职场文书
建议书标准格式
2014/03/12 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python