引言

2020 年 5 月 13 日,可能是前端开发史上又一个里程碑式的一天,因为一个名为 Deno 1.0 版本正式发布了。

那么问题来了,Deno 是什么?为什么说是里程碑?它和 Node 有什么关系?和我又有什么关系?

带着疑问,跟着我一起来初窥 Deno 1.0 的神秘面纱吧。

背景

Deno 是 Ryan Dahl 在 2017 年开始的一个项目。从那时候开始,就有不少人开始关注这个项目了,为什么?这要从 Ryan Dahl 这个人说起。

Ryan Dahl ,2009 年创造了现在火遍全球技术圈的 Node.js ,被誉为 Node 之父。但是遗憾的是,他后来把 Node 移交给了其他开发者,转而研究人工智能,不再过问了。直到后来他再回过头捡起 Node 的时候,才发现这个项目已经背离了他的初衷,有一些无法忽视的问题。

于是就有了这样一件事,在 2018年一次公开的演讲中,Ryan Dahl 发表了一次让人意外的演讲,演讲的主题是 “Design Mistakes in Node”,翻译为中文则是“Node 的设计失误”,基本上把 Node 全部否定了,包括安全性、构建系统、package.json、node_modules、index.js 等等,并表示 Node 存在的种种不足导致有许多严重 bug 问题且不可回避。

形象生动的揭示了node_modules带来的问题

由于上面这些原因,Ryan Dahl 决定放弃 Node,从头写一个替代品,彻底解决这些问题,那便是 Deno。

《Design Mistakes in Node》PPT:https://tinyclouds.org/jsconf2018.pdf

什么是Deno

Deno 目前有两种发音,"德诺"和"蒂诺"。之前看了阮一峰老师一篇关于 Deno 的文章之后,倾向于"蒂诺"这个发音。

Deno 的标志是一只恐龙,恐龙(dinosaur)的英文缩写正是 dino。    ——摘自《Deno 运行时入门教程:Node.js 的替代品》

Deno 这个名字取得就很有趣了,细心的朋友可能会发现,Deno这个名字就是来自 Node 的字母重新组合(Node = no + de),它的意思是"消灭 Node.js"(de = destroy, no = Node.js)。另外一种解释是颠倒 Node 字母的寓意就是说要颠覆 Node ,这两种意思其实也差不多。

实现

Node 的开发语言是 C++,而 Deno 却不一样。Deno 的开发一开始使用的是 Go 语言,后来换成了 Rust。

或许你会有疑问,为啥不是 C++、Go,为什么是 Rust ?

主要原因是 Rust 提供了很多现成的模块,对 Deno 项目来说,可以节约很多开发时间。如果使用 C++,就意味着一切东西都需要从头开始构建,这样的话就太浪费时间了。

优势

  • Deno 基于最新的 JavaScript 语言;
  • Deno 具有覆盖面广泛的标准库;
  • Deno 以 TypeScript 为核心,配以更多独特的方式从而带来了巨大的优势,其中包括一流的 TypeScript 支持(Deno 自动编译 TypeScript 而无需你单独编译);
  • Deno 大力拥抱 ES 模块标准;
  • Deno 没有包管理器;
  • Deno 具有一流的 await 语法支持;
  • Deno 内置测试工具;
  • Deno 旨在尽可能地与浏览器兼容,例如通过提供内置对象 fetch 和全局 window 对象

劣势

有一种“家庭背景”叫做生态,就凭这一点,目前的 Deno 完全是望尘莫及。很多优秀的东西没有流行起来,不是说它不够优秀,而是缺乏相关的生态。就像华为想搞自己的鸿蒙系统,即使真的能比安卓优秀,但是安卓巨大的生态就足够领先很多年。生态这东西不是一两年就能搞起来的,需要长年累月的维护、开发以及拓展。

Ryan Dahl 也说了,Deno 现在不打算对 Node 做兼容处理,也就是说很多东西在 Node 能用但是在 Deno 上用不了。所以对于 Deno 来说,还有很长的路要走。

Deno VS Node

Deno和Node对比(表格数据更新于2020.5.29)
  Deno Node
版本 v1.0.2 v14.3.0
github star 61.1k 70.5k
API 引用方式 全局对象 模块导入
模块系统 ES Module 浏览器实现 CommonJS & 新版 node 实验性 ES Module
安全 默认安全 无安全限制
Typescript 原生支持 第三方,如通过 ts-node 支持
包管理 原生支持 npm + node_modules
异步操作 Promise 回调
包分发 去中心化 import url 中心化 npmjs.com
入口 import url 直接引入 package.json 配置
打包、测试、格式化 原生支持 第三方如 eslint、gulp、webpack、babel 等

API 引用方式

Node 内置 API 通过模块导入的方式引用,例如:

const fs = require("fs");
fs.readFileSync("./node.txt");

而 Deno 则是一个全局对象 Deno 的属性和方法:

Deno.readFileSync("./deno.txt");

模块系统

Node 采用的是 CommonJS 规范,而 Deno 则是采用的 ES Module 的浏览器实现。

对于  Deno 来说:

// 支持
import * as fs from "https://deno.land/std/fs/mod.ts";
import { deepCopy } from "./deepCopy.js";
import foo from "/foo.ts";// 不支持
import foo from "foo.ts";
import bar from "./bar"; // 必须指定扩展名

安全

Deno 默认安全,通过权限控制提供了一个安全的沙箱环境,程序只能访问由用户设置为可执行标志的文件。外部代码没有文件系统、网络、环境的访问权限,除非显式开启。而 Node 程序可以直接访问用户足以访问的任何内容。

支持 Typescript

Deno 支持开箱即用的 TypeScript 的环境,不需要任何配置文件就能在 Deno 中轻易地使用 TypeScript 。

包管理

Node 有一个官方的软件包管理器,称为 NPM。Deno 没有,而是允许你从 URL 导入任何 ES 模块。这使得 Deno 非常灵活,我们可以直接创建软件包而无需在 NPM 这样的存储库中发布它们。 Deno 下载模块以后,依然会有一个总的目录,在本地缓存模块,因此可以离线使用。

// index.js
import { white, bgRed } from "https://deno.land/std/fmt/colors.ts";console.log(bgRed(white("hello world!")));
> deno run index.js
Download https://deno.land/std/fmt/colors.ts
Compile https://deno.land/std/fmt/colors.ts
hello world!

异步操作

Node 用回调的方式处理异步操作,而 Deno 则采用 Promise。

包分发

对于 www.npmjs.com 我们肯定都不陌生,它是推动 Node 蓬勃发展的重要支点。而 Deno 并没有一个像 npmjs.com 的仓库,通过 import url 的方式将互联网任何一处的代码都可以引用。

入口

我们知道 npm 包必须有 package.json 文件,里面不仅需要指明 main 或 module 或 browser 等字段来标明入口文件,还需要指明 name 、license 、description 等字段来说明这个包。在 Deno 中,其模块不需要任何配置文件,直接是 import url 的形式。

打包、测试、格式化

使用过 Node 的一定有这样的体会,我们需要经常引入一些其他工具或者插件,例如用 eslint 做代码格式校检、用 webpack 打包和构建项目、用 babel 做转化等等。而 Deno 通过内置了一些类似的工具,不需要我们再额外去引入,给我们的开发带来了不少的方便。

Deno 有一个内置的测试器,可以用来测试 JavaScript 或 TypeScript 代码。

Deno.test("hello world", () => {const x = 1 + 2;if (x !== 3) {throw Error("x should be equal to 3");}
});

Deno 有着内置的格式化工具,能够格式化 TypeScript 和 JavaScript 代码。

// 格式化当前目录和子目录下的所有 JS/TS 文件
deno fmt
// 格式化特定的文件
deno fmt myfile1.ts myfile2.ts
// 检查当前目录和子目录下的所有 JS/TS 文件是否都已被格式化
deno fmt --check

Deno 内置了调试器,使用 Chrome Devtools 或其他支持该协议的客户端(比如 VSCode)能够调试 Deno 程序。除此之外,还有打包器、脚本安装器、依赖查看器等等。

小结

在 Ryan Dahl 的计划中,他并不会去预想 Deno 在短时间内能够发展成一个多大规模的平台。当然咯,把时间调回2009年,JavaScript 还是人人都能取笑的一个有些怪异的小语言,谁也没想到如今 JavaScript 成为了使用最广泛的开发语言之一。

虽然 Deno 是以 Destroy-Node 为己任而开发的,但就目前来讲,Deno 取代 Node 是不可能的,Node 的占有率太高了,生态也足够完善,而 Deno 目前仅仅处于发展的最初期。不过我相信,凭借着它与生俱来的设计优势,以及目前的关注度,随着其相关生态的建设,将来的 Deno 会比 Node 更具优势。

如果你对 Deno 未来的发展也感兴趣的话,那就去给它个 star 吧。

最后附上 Deno 传送门:https://github.com/denoland/deno

初窥Deno 1.0面纱相关推荐

  1. 初窥Linux神秘面纱(贰):基本指令讲解(中)及疑难解惑(精)

    目录 mkdir指令: rmdir指令: rm指令: man指令 : cp指令: mv指令: cat与tac指令: more指令: less指令: head与tail指令 疑问解答: mkdir指令: ...

  2. 初窥Linux神秘面纱(壹):基本指令讲解(上)及疑难解惑(精)

    目录 前情提要: ls指令: pwd指令: cd指令: whoami指令: touch指令: 疑问补充: 前情提要: 今天,我将开始新版块的书写---LInux窥境之路,神奇而又美丽的操作系统将在我的 ...

  3. OBJECT_METHOD初窥

    一.  背景:Windows NT 的对象机制 Windows NT系统将各种资源以对象的方式进行组织和管理.虽然Windows NT内核使用C语言和汇编语言编写的,本身并未使用到C++中的面向对象机 ...

  4. 并发编程-01并发初窥

    文章目录 引言 思维导图 基础知识构建 涉及的知识点一览 高并发处理思路与手段一览 并发初窥 概念 并发问题模拟 代码 引言 说来惭愧,一直没有系统的梳理过并发编程的知识,这次借着学习_Jimin_老 ...

  5. java aspectj_初窥AspectJ

    AspectJ可以说是Java中当之无愧的黑魔法.说它是黑魔法,一方面是因为它很强大,能够解决一些传统编程方法论解决不了的问题,而另一方面,它也相当的晦涩,有着比较陡峭的学习曲线. 本文将带大家探索下 ...

  6. 初窥R(基本说明、获取帮助、工作空间、输入输出、包)

    初窥R(基本说明.获取帮助.工作空间.输入输出.包) 本篇简要介绍使用R的一些基本概念,包括基本说明.获取帮助.工作空间.输入输出,每个知识点中都会通过一个例子来练习. 一.R基本情况说明 1.R是一 ...

  7. flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥

    前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutte ...

  8. 【重点】初窥Linux 之 我最常用的20多条命令

    [重点]初窥Linux 之 我最常用的20多条命令 玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我 ...

  9. 初窥Xcode4 -- Xcode4主题样式、快捷键等常用设置

    今天晚上开始使用Xcode4,初窥历程如下. 一.下载安装Xcode4 因为我需要让Xcode4和老版本共存,在安装Xcode4时选择其他安装路径,安装成功后在xcode4安装目录下改名Xcode.a ...

  10. [基础] AHK函数对象初窥 ① _实例2_实际可用版

    [基础] AHK函数对象初窥 ① _实例2_实际可用版 ;# 母文章 https://zhuanlan.zhihu.com/p/48977298;;;;;;;;;;;;;;;;;;;;;;;;;;;; ...

最新文章

  1. Java中的BigDecimal类你真的了解吗?
  2. 从Java到Spring为何独得青睐Spring Summit 2017不可不知的那些事儿
  3. RHEL6.4换CentOS源
  4. ×××的各种协议介绍
  5. java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?
  6. 168.167Excle表列整数字符和字符整数的互相转化
  7. python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式
  8. NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
  9. 数据库每日一题(易错)
  10. 矩池云上复现论文 Neural Graph Collaborative Filtering 环境复现
  11. JSP直接调用一个action定向到页面
  12. 测试可变字符序列stringBuilder
  13. windows server 2003 下载
  14. 最新版云铺购ds网系统全开源可运营程序源码
  15. OpenCV 之 角点检测
  16. 算法:中国象棋中马的最少步数走法和不重复周游走法的实现(利用图论算法中的BFS和DFS)
  17. AGU13-Save The Princess
  18. 行政区划代码2020(SQL)--(下)
  19. 特征锦囊:如何根据变量相关性画出热力图?
  20. 第四次作业——肖祥英

热门文章

  1. 怎样设置电脑桌面共享计算机,局域网共享设置,小编教你电脑怎么设置局域网共享...
  2. php mov格式转换,mov格式怎么转换成mp4 如何将mov转换成mp4
  3. 可以实现psd转png转换器有哪些?这些工具能让你轻松转换图片格式
  4. python-pyecharts雷达图
  5. 大型网站的SEO引爆点
  6. win7共享wifi自动获取不到ip地址的解决办法
  7. Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
  8. linux内核下载 ok6410,手把手教你移植linux内核---------OK6410(一)
  9. 帝国CMS二次开发会员注册激活后发送欢迎邮件方法
  10. 来自白菜【强烈推荐】最新淘宝零食店铺排行榜 零食控最爱逛的淘宝零食店