未加星标

用node开发并发布一个cli工具

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二03 | 时间 2019 | 作者 红领巾 ] 0人收藏点击收藏

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(); } } 复制代码

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

代码区博客精选文章
分页:12
转载请注明
本文标题:用node开发并发布一个cli工具
本站链接:https://www.codesec.net/view/627817.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(45)