開發一個天氣預報 npm 包

新建項目

使用 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 linkhappyday 這個字段複製到 npm 的全局模塊安裝文件夾 node_modules 內,並建立符號連接(symbolic link,軟連接),也就是將 index.js 的路徑加入環境變量 PATH 中去ios

運行 happydaygit

能夠看到咱們已經成功打印出 Happy everyday!,如今咱們能夠開始開發 npm 包了github

解析命令行參數

安裝 tj 大神的commander: npm i commander -Sshell

The complete solution for node.js command-line interfaces, inspired by Ruby's commander.npm

安裝 chalk 使得你的命令行更漂亮: npm i chalk -Sjson

如今讓咱們寫一下 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 ;)

這樣第一步就完成了,能夠正式開發咱們的 天氣預報 小玩具了

使用百度地圖 API 獲取天氣預報

先在百度開發者中心註冊一個 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)

這樣,咱們的小玩具初步成型

happyday

然而... 百度地圖 API 只支持國內的天氣預報,因此像咱們這些海外黨仍是須要一些其餘的手段

獲取海外城市天氣預報

我選擇的是 Yahoo Weather API,由於很好奇他們家大名鼎鼎的 YQL ...

引入 lodashinquireryql 這三個庫

先上代碼

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

happyday

發佈 npm 包

這個很簡單啦

一步一步來:

  • 在 npm 官網上 註冊一個帳號
  • bash 中輸入 npm login 登陸
  • npm publish 一個回車鍵搞定(每次 publish 以前都須要改一下包的版本號,否則報錯)

就這樣咱們就擁有了本身的第一個 npm 包

本文代碼均在 https://github.com/HuangXiZhou/happyday 歡迎各位 Star

使用 happyday

npm i happyday -g && happday w 便可

相關文章
相關標籤/搜索