前言
不知不觉Deno正式版已经发布两个多月了,我也是看到它发布正式版后被它的亮点所吸引,第一时间就上手体验了。
本文将结合我两个月来的使用感受讲解Deno相对于前端而言的简单使用,欢迎各位感兴趣的开发者阅读本文。
初识Deno
2020年5月13日,日常沸点摸鱼,看到了deno发布的消息,点进去后才知道是node作者的又一新作,作者在设计node的时候因为犯了一些错误,包括安全性、构建系统、package.json、node_modules、index.js等等,并表示node存在的种种不足导致有许多严重bug问题且不可回避,现在JavaScript和周围的软件基础架构发生了巨大的变化,在原来的基础上去改,还不如重写,于是他重新设计了Deno这门脚本语言。
接下来我们来看下Deno都有哪些新特性,这里我们引用Deno官网的一句话。
Deno JavaScript和TypeScript的安全运行时
Deno是使用V8并内置于Rust的JavaScript和TypeScript的简单,现代且安全的运行时。
- 安全性,当在开发服务端程序时,除非显式启用,否则不能访问文件、网络或环境。
- 支持TypeScript的开箱即用,这一点也是我最喜欢的,也是唯一让我使用它的理由。
- 只发布一个可执行文件,即所有后端服务开发完成后,打包后他只是一个可执行文件,直接在服务器运行即可。
- 具有内置的实用程序,例如依赖项检查器(表示信息)和代码格式化程序(表示为fmt)。
上面就是Deno官网列出的一些特性,对我而言我能用到deno的地方就是它内置的TypeScript解析器,可以无痛运行ts代码。这也是我能了解到的前端唯一用得到它的地方。
当然如果你说他可以像node一样读写文件,有网络操作的api,可以开发接口,但是我并不觉得这属于前端范畴。
安装Deno
我开始学TypeScript也是因为Deno正式版的发布,之前一直对TypeScript是望而止步的,因为要想单独使用TypeScript需要安装很多东西做很多配置才行,正好我deno发布时候我在学数据结构和算法,于是脑子里产生了用TypeScript来实现数据结构的想法,这样一来数据结构学会了,TypeScript的使用也掌握了,两全其美的事情。
话不多说,接下来我们就来看看如何安装deno吧。
windows环境
- 在deno在github上的releases页面下载windows安装包
- 将下载到的压缩包解压,你会得到一个名为deno.exe的可执行文件
- 在C:\Program Files下新建deno文件夹,将deno.exe放进去
- 打开环境变量配置面板,在Path下新增一条名为deno的变量,路径就选择我们刚才存放deno.exe的路径
至此,你已经成功的安装了deno,接下来我们测试下是否安装成功。在windows终端或cmd执行deno -V,出现如下图所示的信息则安装成功。
MacOS环境
在Mac下安装比windows就有好多了,用brew直接一条命令即可安装。
- 打开mac的终端,执行下述命令
# 为了确保我们安装的deno是最新的,需要先更新下brew
brew update
# 安装deno
brew install deno
- 安装完成后,brew会自动为我们配置环境变量,我们只需要像windows一样在终端执行查看版本命令即可验证是否安装成功
使用Deno
前面我们搭建好了Deno的环境,接下来我们来看看如何使用它。
- 我们新建一个ts文件,写点ts代码进去。
export class Graph {
// 存储图的顶点
private vertices: (number | string)[] = [];
// 存储临接表
private adjList: Dictionary<string | number, (string | number)[]> = new Dictionary();
constructor(private isDirected: boolean = false) {
console.log("deno执行ts成功");
}
// 添加顶点
addVertex(v: string | number): void {
// 顶点不存在于图中
if (!this.vertices.includes(v)) {
// 将该顶点添加到顶点列表中
this.vertices.push(v);
// 在临接表中设置顶点v作为键,对应的字典值为一个空数组
this.adjList.set(v, []);
}
}
// 添加线,连接顶点
addEdge(v: string | number, w: string | number): void {
// 添加顶点之前需要验证顶点v和w是否在图中,不存在就追加
if (!this.adjList.get(v)) {
this.addVertex(v);
}
if (!this.adjList.get(w)) {
this.addVertex(w);
}
// 将w加入到v的临接表中,我们就得到了一条来自顶点v到顶点w的边
this.adjList.get(v)?.push(w);
if (!this.isDirected) {
// 如果是无向图则需要添加一条自w到v的边
this.adjList.get(w)?.push(v);
}
}
// 获取顶点列表
getVertices(): (string | number)[] {
return this.vertices;
}
// 获取临接表
getAdjList(): Dictionary<string | number, (string | number)[]> {
return this.adjList;
}
// 将图转为字符串
toString(): string {
let s = "";
for (let i = 0; i < this.vertices.length; i++) {
s += `${this.vertices[i]} -> `;
const neighbors = <Array<string | number>>this.adjList.get(this.vertices[i]);
for (let j = 0; j < neighbors.length; j++) {
s += `${neighbors[j]} `;
}
s += "\n";
}
return s;
}
}
- 新建一个js文件,导入我们刚才创建的ts文件,实例化Graph类
import { Graph } from "./lib/Graph.ts";
let graph = new Graph();
let vertices = ["A", "B", "C", "D", "E", "F", "G", "H", "I"];
for (let i = 0; i < vertices.length; i++) {
graph.addVertex(vertices[i]);
}
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("A", "D");
graph.addEdge("C", "D");
graph.addEdge("C", "G");
graph.addEdge("D", "G");
graph.addEdge("D", "H");
graph.addEdge("B", "E");
graph.addEdge("B", "F");
graph.addEdge("E", "I");
console.log("图的关系对应如下");
console.log(graph.toString());
- 在终端进入我们的刚才创建js文件的目录,使用deno run命令来执行我们刚才创建的js文件
deno run GraphTest.js
执行结果如下, 我们发现已经成功执行了我们在js中导入的ts文件中的方法。
更多使用方法
当然deno不只是用来运行ts的,它还有很多api可用于开发服务端应用,想了解更多有关服务端开发的开发者请移步deno官方文档。
编辑器添加Deno支持
上面我们使用deno时采用的是手动输入命令来执行的,这样太过于麻烦,因此我们需要安装插件来支持它。
因为我是webstorm的重度用户,在deno刚发布时,我去webstorm的插件商店搜了一下,没发现有deno的插件,但是隔壁vscode缺已经有了相关插件,但是我是个专一的人,是不会投向vscode阵营的。
我当时还掘金发沸点吐槽了下webstorm不支持deno,得到的掘友回复是正在开发。
好吧,那我就等,我在终端敲了一个月的deno run 命令,一个月后,deno的插件终于开发出来了,当时我很激动发了条沸点。
接下来就来分享下如何在webstorm中安装deno。
- 在插件商店中搜索 deno,如下图所示,他是由jet官方开发的,点击安装即可。
- 安装完成后,重启编辑器,我们在settings中搜索deno,如下图所示,勾选即可
- 我们打开一个js文件,在代码右键,就能发现 Run "Deno: xxx"的选项,点击就会运行。
- 当然,我们还可以调试ts文件,上图的右键菜单中在Run选项的下方还有个Debug,我们只需要在ts文件中打上断点,选择debug即可打开webstorm的调试视图
至此,编辑器添加deno的支持就完成了,细心的开发者应该已经发现我上图调试视图中,中文无法正常显示,发生了乱码的情况。
这也是我想吐槽的地方,他这个插件对windows平台很不友好,不仅中文乱码,而且调试也不能用,加了断点,它不会走。然而mac平台却是正常的,为此我也在这个插件的底部留言了,希望开发者能尽快修复这个bug吧。
我对Deno的看法
现在deno属于高速发展的阶段,如果用它来开发服务端的话,他是肯定竞争不过node的,因为node发展了这么久,已经有了它的生态,比如egg、koa等优秀的框架。
当然我写服务端应用肯定不会用node和deno的,毕竟他们在老牌服务端语言里算是后来者,在开发过程中遇到问题也会花大量的时间去填坑。
因为我是从Java入行的,所以更青睐于Java写服务端应用,毕竟它的生态很完善,有无数的前辈为我们踩坑。至于deno未来的发展怎么样,这就取决于国内外大公司肯不肯为了deno造轮子从而丰富其生态。
看到好多人讨论了deno干掉node之类的话题,至于最终deno和node哪个赢,就交给时间吧。在我看来这个市场本来就是优胜略汰的,落后就要挨打,对于我们开发者而言,优秀的东西可以节省开发时间,无非就是增加了学习成本,但是这些都问题不大。
写在最后
- 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
- 本文首发于掘金,未经许可禁止转载💌
评论区