首发于公众号《前端全栈开发者》,第一工夫浏览最新文章,会优先两天发表新文章。关注后私信回复:大礼包,送某网精品视频课程网盘材料,准能为你节俭不少钱!

在本文中,咱们将通过装置Deno运行时,并创立一个命令行天气程序,该程序将把一个城市名称作为参数,并返回将来24小时的天气预报。

要为Deno编写代码,我强烈建议将Visual Studio Code与官网的Deno插件一起应用。为了使事件更乏味,咱们将应用TypeScript编写应用程序。

装置Deno

首先,让咱们把Deno装置到本地,这样咱们就能够开始编写脚本了。这个过程很简略,因为三大操作系统都有装置脚本。

Windows

在Windows上,你能够从PowerShell装置Deno:

iwr https://deno.land/x/install/install.ps1 -useb | iex

Linux

在Linux终端上,能够应用以下命令:

curl -fsSL https://deno.land/x/install/install.sh |  sh

macOS

在Mac上,能够将Brew与Deno一起装置:

brew install deno

装置后

装置过程实现后,你能够通过运行以下命令查看Deno是否正确装置。

deno --version

你当初应该看到相似以下内容:

deno 1.2.0v8 8.5.216typescript 3.9.2

让咱们为咱们的新我的项目创立一个文件夹(在你的home文件夹内,或者任何你喜爱保留代码我的项目的中央)并增加一个 index.ts 文件。

mkdir weather-appcd weather-appcode index.ts
留神:正如我下面提到的,我在本教程中应用VS Code。如果你应用的是不同的编辑器,请替换下面最初一行。

获取用户输出

咱们的程序将检索给定城市的天气预报,因而在运行该程序时,咱们须要承受城市名称作为参数。提供给Deno脚本的参数以 Deno.args 的模式存在。让咱们把这个变量记录到控制台,看看它是如何工作的。

console.log(Deno.args);

当初,应用以下命令运行脚本:

deno run index.ts --city 杭州

你应该看到以下输入:

[ "--city", "杭州" ]

只管咱们能够本人解析此参数数组,但Deno的规范库包含一个名为flags的模块,它将为咱们解决这一问题。要应用它,咱们要做的就是在文件顶部增加一个 import 语句:

import { parse } from  "https://deno.land/std@0.61.0/flags/mod.ts";
留神:规范库模块的文档中的例子会给你一个未版本化的URL(如https://deno.land/std/flags/m...,它将始终指向最新版本的代码。在你的导入中指定一个版本是一个很好的做法,以确保你的程序不会被将来的更新所毁坏。

让咱们应用导入的函数将参数数组解析为更有用的内容:

const args = parse(Deno.args);

咱们还将批改脚本来打印新的 args 变量,看看是什么样子的。所以当初你的代码应该是这样的:

import { parse } from  "https://deno.land/std@0.61.0/flags/mod.ts";const args = parse(Deno.args);console.log(args);

当初,如果应用与以前雷同的参数运行脚本,则应该看到以下输入:

Download https://deno.land/std@0.61.0/flags/mod.tsDownload https://deno.land/std@0.61.0/_util/assert.tsCheck file:///home/njacques/code/weather-app/index.ts{ _: [], city: "杭州" }

每当Deno运行脚本时,它都会查看新的import语句。任何近程托管的导入都将被下载,编译和缓存以备未来应用。parse 函数为咱们提供了一个对象,该对象具备蕴含咱们输出内容的 city 属性。

留神:如果你因为任何起因须要为一个脚本从新下载导入,你能够运行deno cache --reload index.ts。

咱们还应该减少对 city 参数的查看,如果没有提供城市参数,则以错误信息退出程序。

if (args.city === undefined) {  console.error("No city supplied");  Deno.exit();}

应用天气API

咱们将从 tianqiapi.com 获取预报数据。你须要注册一个收费账户,以取得一个API密钥。咱们将应用他们的业余七日天气接口,传递一个城市名称作为参数。

让咱们增加一些代码以获取天气预报并将其打印到控制台,以查看失去的后果:

import { parse } from  "https://deno.land/std@0.61.0/flags/mod.ts";const args = parse(Deno.args);if (args.city === undefined) {    console.error("No city supplied");    Deno.exit();}const appid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';const appsecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';const res = await fetch(`https://yiketianqi.com/api?version=v9&appid=${appid}&appsecret=${appsecret}`);const data = await res.json();console.log(data);

Deno尝试在可能的状况下反对许多浏览器API,因而在这里咱们能够应用 fetch 而不用导入任何内部依赖项。咱们还利用了对await的反对:通常,咱们必须将所有应用 await 的代码包装在 async 函数中,然而TypeScript并没有使咱们这样做,这使得代码变得更好了。

如果你当初尝试运行此脚本,则会遇到谬误音讯:

Compile file:///Users/zhangbing/github/CodeTest/Deno/weather-app/index.tserror: Uncaught PermissionDenied: network access to "https://yiketianqi.com/api?version=v9&appid=xxxxxxxx&appsecret=xxxxxxx", run again with the --allow-net flag    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)    at Object.sendAsync ($deno$/ops/dispatch_json.ts:98:10)    at async fetch ($deno$/web/fetch.ts:296:27)    at async file:///Users/zhangbing/github/CodeTest/Deno/weather-app/index.ts:13:13

默认状况下,所有Deno脚本都在平安的沙箱中运行:它们无权拜访网络,文件系统或诸如环境变量之类的货色。须要为脚本明确授予对其须要拜访的系统资源的权限。在这种状况下,谬误音讯将帮忙咱们理解所需的权限以及如何启用它。

让咱们再次调用脚本,并带有正确的标记:

deno run --allow-net index.ts --city 杭州

这次,咱们应该从API取回JSON响应:

{  cityid: "101210101",  city: "杭州",  cityEn: "hangzhou",  country: "中国",  countryEn: "China",  update_time: "2020-08-13 16:51:27",  data: [    {      day: "13日(星期四)",      date: "2020-08-13",      week: "星期四",      wea: "多云",      wea_img: "yun",      wea_day: "多云",      wea_day_img: "yun",      wea_night: "多云",      wea_night_img: "yun",      tem: "37",      tem1: "38",      tem2: "28",      humidity: "40%",      visibility: "暂缺",      pressure: "1002",      win: [ "西南风", "无继续风向" ],      win_speed: "4-5级转<3级",      win_meter: "小于12km/h",      sunrise: "05:24",      sunset: "18:43",      air: "35",      air_level: "优",      air_tips: "空气很好,能够外出流动,呼吸新鲜空气,拥抱大自然!",      alarm: {        alarm_type: "低温",        alarm_level: "橙色",        alarm_content: "杭州市气象台2020年8月13日9时05分公布低温橙色预警信号:受副热带低压管制,预计明天主城区和钱塘新区最高气温将达38℃左右,请留神做好防暑降温等工作。(预警信息起源:国家预警信息公布核心)"      },      hours: [        [Object], [Object],        [Object], [Object],        [Object], [Object],        [Object], [Object],        [Object], [Object],        [Object], [Object],        [Object], [Object],        [Object], [Object]      ],      index: [ [Object], [Object], [Object], [Object], [Object], [Object] ]    },    ... ...  ]}

返回字段的含意能够查看API文档。data 数组就是每日数据列表,1-7日,共7组。每个对象中蕴含气象预警(alarm)、小时预报(hours)、生存指数(index)、空气质量指数(aqi) 数据。

为了简略起见,咱们只获取几个简略的数据:日期、天气、实时温度空和空气质量等级四个数据,为此须要遍历数组:

const forecast = data.data.map((item) => [  item.day, // 日期  item.wea, // 天气  item.tem, // 实时温度  item.air_level, // 空气质量等级]);

如果咱们当初尝试运行脚本,咱们会失去一个编译谬误(如果你应用像VS代码这样的IDE,在键入代码时也会失去这个谬误):参数 ' item’ 隐式地具备一个 ‘any' 类型。

TypeScript要求咱们通知它该 item 是什么类型的变量,以便晓得咱们是否对它做了任何可能在运行时导致谬误的事件。让咱们增加一个接口,以形容 item 的构造:

interface forecastItem {  day: string;  wea: string;  tem: string;  air_level: string;}

让咱们将新类型增加到map回调中:

const forecast = data.data.map((item: forecastItem) => [  item.day, // 日期  item.wea, // 天气  item.tem, // 实时温度  item.air_level, // 空气质量等级]);

如果你应用的IDE反对TypeScript,它应该可能在你输出时主动实现 item 的类型,这要感激咱们提供的接口类型。

当初运行后果输出如下:

forecast [  [ "13日(星期四)", "多云转晴", "36", "优" ],  [ "14日(星期五)", "晴", "37", "" ],  [ "15日(星期六)", "晴", "37", "" ],  [ "16日(星期日)", "多云转晴", "37", "" ],  [ "17日(星期一)", "晴", "37", "" ],  [ "18日(星期二)", "晴", "37", "" ],  [ "19日(星期三)", "晴", "38", "" ]]

格式化输入

当初咱们有了所需的数据集,接下来让咱们来看一下如何格式化它以便显示给用户。让咱们应用 ascii_table 模块将其显示在整洁的小表中:

import AsciiTable from 'https://deno.land/x/ascii_table/mod.ts';...const table = AsciiTable.fromJSON({  title: `${args.city}七日天气预报`,  heading: [ '日期', '天气', '实时温度', '风', '空气质量', '天气预警'],  rows: forecast})console.log(table.toString())

保留并运行脚本,当初咱们应该曾经对接下来的7日内的所选城市进行了格式化并给出了预报:

残缺代码清单

这是一个紧凑的脚本,然而上面是残缺的代码清单,也可去咱们的 Github。

import { parse } from "https://deno.land/std@0.61.0/flags/mod.ts";import AsciiTable from "https://deno.land/x/ascii_table/mod.ts";const args = parse(Deno.args);if (args.city === undefined) {  console.error("No city supplied");  Deno.exit();}// 你本人的API密钥const appid = "xxxxxxxx";const apiKey = "xxxxxxxxx";const res = await fetch(  `https://yiketianqi.com/api?version=v9&appid=${appid}&appsecret=${apiKey}`,);const data = await res.json();interface forecastItem {  day: string;  wea: string;  tem: string;  air_level: string;}const forecast = data.data.map((item: forecastItem) => [  item.day, // 日期  item.wea, // 天气  item.tem, // 实时温度  item.air_level, // 空气质量等级]);const table = AsciiTable.fromJSON({  title: `${args.city}七日天气预报`,  heading: ["日期", "天气", "温度", "空气质量"],  rows: forecast,});console.log(table.toString());

总结

当初,你有了本人的正在运行的Deno命令行程序,该程序将为你提供接下来7日天气预报。通过遵循本教程,你当初应该相熟如何启动新程序,从规范库和第三方导入依赖项以及授予脚本权限。

那么,在尝到了为Deno编写程序的苦头之后,接下来你应该去哪里呢?你感觉Deno如何?


举荐浏览

  • EmailJS:5步应用JavaScript间接从前端发送电子邮件
  • 如何应用JavaScript拜访设施前后摄像头
  • 应用Typescript和ES模块公布Node模块
  • Javascript开发人员偏爱Deno而不是Node的5大起因
  • 如何应用CSS Paint API动态创建与分辨率无关的可变背景
  • 这9种Vue技术你把握了吗?不信你全晓得
  • 2020年的12个Vue.js开发技巧和诀窍
  • 在Vue.js编写更好的v-for循环的6种技巧
  • 实战:应用React Hook一步一步创立一个可排序表格组件
  • 实战 | HTML页面生成器:应用JavaScript和Node创立CLI
  • 实战 | 从零开始应用JavaScript制作本人的命令行(CLI工具)
  • 【实战】这个炫酷的播放粒子成果,你也能够学会!应用Web动画API制作