使用 npm init
快速生成一個 package.json
來建立一個新的 npm
項目:javascript
{ "name": "happyday", "version": "1.0.5", "description": "Happy every day", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "Nodejs", "JavaScript", "bash", "shell" ], "repository": { "type": "git", "url": "git+https://github.com/HuangXiZhou/happyday.git" }, "author": "xizhouh@gmail.com", "license": "MIT" }
新建一個 index.js
包含咱們的腳本java
#!/usr/bin/env node // 說明這是一個可執行的應用 console.log('Happy everyday!')
在 package.json
中新建 bin
字段,用於存放一個可執行文件node
"bin": { "happyday": "./index.js" }
接着執行 npm i -g && npm link
把 happyday
這個字段複製到 npm
的全局模塊安裝文件夾 node_modules
內,並建立符號連接(symbolic link,軟連接),也就是將 index.js
的路徑加入環境變量 PATH
中去ios
運行 happyday
git
能夠看到咱們已經成功打印出 Happy everyday!
,如今咱們能夠開始開發 npm
包了github
安裝 tj 大神的commander
: npm i commander -S
shell
The complete solution for node.js command-line interfaces, inspired by Ruby's commander.npm
安裝 chalk
使得你的命令行更漂亮: npm i chalk -S
json
如今讓咱們寫一下 demo 測試一下:axios
#! /usr/bin/env node const program = require('commander') const chalk = require('chalk') program .command('weather') // 命令行指令 .alias('w') // 定義別名 .description(chalk.green('Get weather forecast ;)')) // 這行文字變綠~ // 註冊一個 `callback` 函數 .action(option => { console.log('biubiubiu~') }) // 生成幫助信息 .on('--help', () => { console.log(' Examples:') console.log('') console.log('$ happyday weather') console.log('$ happyday w') }) program.parse(process.argv) // 解析命令行
執行一下 happyday -h
Usage: happyday [options] [command] Options: -h, --help output usage information Commands: weather|w Get weather forecast ;)
這樣第一步就完成了,能夠正式開發咱們的 天氣預報 小玩具了
先在百度開發者中心註冊一個 KEY
由於懶... 因此我直接引入 axios
實行 GET
請求:
const URL_IP = 'http://api.map.baidu.com/location/ip' const KEY = { ak: '...' } ... .action(option => { axios.get(URL_IP, { params: KEY }) .then(res => { console.log(res) }) .catch(error => { console.log(chalk.red('emmmmm... I don\'t know what happened.')) }) }) ...
先獲取用戶所在城市,再根據所在城市獲取用戶所在地的天氣預報
const URL_FORECAST = 'http://api.map.baidu.com/telematics/v3/weather' const KEY = { ak: '...' } let getweatherModel = { location: '', output: 'json', ak: KEY.ak, } ... getweatherModel.location = res.data.content.address_detail.city axios.get(URL_FORECAST, { params: getweatherModel }) .then(res => { if(res.status !== 200) { console.log(chalk.red('Whoops!!! There is something wrong with your network.')) } else { let resource = res.data if(resource.status !== 'success') { console.log(chalk.red('emmmmm... I don\'t know what happened.')) } else { console.log(resource) } } }) .catch(error => { console.log(chalk.red('emmmmm... I don\'t know what happened.')) }) ...
獲取到數據以後,讓咱們處理一下數據
`城市: ${chalk.green(resource.results[0].currentCity)} ❤️`
打印天氣預報
resource.results[0].weather_data.forEach(item => { console.log( `${item.date.slice(0, 2)}: ${chalk.green(item.weather)} | ${chalk.green(item.temperature)}` ) }, this)
這樣,咱們的小玩具初步成型
然而... 百度地圖 API 只支持國內的天氣預報,因此像咱們這些海外黨仍是須要一些其餘的手段
我選擇的是 Yahoo Weather API,由於很好奇他們家大名鼎鼎的 YQL ...
引入 lodash
,inquirer
, yql
這三個庫
先上代碼
let config = _.assign({ cityName: '' }, option) let promps = [] if(config.cityName !== 'string') { promps.push({ type: 'input', name: 'cityName', message: 'Input your cityname:', validate: input => { if(!input) { return chalk.red('You should input something here...') } return true } }) } inquirer.prompt(promps).then(answers => { var query = new YQL(`select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="${answers.cityName}")`) query.exec((err, data) => { if(err) { console.log(chalk.red('emmmmm... I don\'t know what happened.')) } else { if(!data.query.count) { console.log(chalk.red('Please... Enter the correct city name.')) } else { console.log(data) } } }) })
先來講說 inquirer
這個庫
功能簡介:
- input–輸入
- validate–驗證
- list–列表選項
- confirm–提示
- checkbox–複選框等等
YQL
可謂是有些驚人,它能夠像 SQL
那樣設計,而後整合至 URL
上,確實有點奇葩
這樣,咱們海外黨就也可使用 happyday
了
這個很簡單啦
一步一步來:
bash
中輸入 npm login
登陸npm publish
一個回車鍵搞定(每次 publish 以前都須要改一下包的版本號,否則報錯)就這樣咱們就擁有了本身的第一個 npm 包
本文代碼均在 https://github.com/HuangXiZhou/happyday 歡迎各位 Star
使用 happyday
:
npm i happyday -g
&& happday w
便可