初窥Deno 1.0面纱
引言
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 问题且不可回避。
由于上面这些原因,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 | |
---|---|---|
版本 | 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面纱相关推荐
- 初窥Linux神秘面纱(贰):基本指令讲解(中)及疑难解惑(精)
目录 mkdir指令: rmdir指令: rm指令: man指令 : cp指令: mv指令: cat与tac指令: more指令: less指令: head与tail指令 疑问解答: mkdir指令: ...
- 初窥Linux神秘面纱(壹):基本指令讲解(上)及疑难解惑(精)
目录 前情提要: ls指令: pwd指令: cd指令: whoami指令: touch指令: 疑问补充: 前情提要: 今天,我将开始新版块的书写---LInux窥境之路,神奇而又美丽的操作系统将在我的 ...
- OBJECT_METHOD初窥
一. 背景:Windows NT 的对象机制 Windows NT系统将各种资源以对象的方式进行组织和管理.虽然Windows NT内核使用C语言和汇编语言编写的,本身并未使用到C++中的面向对象机 ...
- 并发编程-01并发初窥
文章目录 引言 思维导图 基础知识构建 涉及的知识点一览 高并发处理思路与手段一览 并发初窥 概念 并发问题模拟 代码 引言 说来惭愧,一直没有系统的梳理过并发编程的知识,这次借着学习_Jimin_老 ...
- java aspectj_初窥AspectJ
AspectJ可以说是Java中当之无愧的黑魔法.说它是黑魔法,一方面是因为它很强大,能够解决一些传统编程方法论解决不了的问题,而另一方面,它也相当的晦涩,有着比较陡峭的学习曲线. 本文将带大家探索下 ...
- 初窥R(基本说明、获取帮助、工作空间、输入输出、包)
初窥R(基本说明.获取帮助.工作空间.输入输出.包) 本篇简要介绍使用R的一些基本概念,包括基本说明.获取帮助.工作空间.输入输出,每个知识点中都会通过一个例子来练习. 一.R基本情况说明 1.R是一 ...
- flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥
前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutte ...
- 【重点】初窥Linux 之 我最常用的20多条命令
[重点]初窥Linux 之 我最常用的20多条命令 玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我 ...
- 初窥Xcode4 -- Xcode4主题样式、快捷键等常用设置
今天晚上开始使用Xcode4,初窥历程如下. 一.下载安装Xcode4 因为我需要让Xcode4和老版本共存,在安装Xcode4时选择其他安装路径,安装成功后在xcode4安装目录下改名Xcode.a ...
- [基础] AHK函数对象初窥 ① _实例2_实际可用版
[基础] AHK函数对象初窥 ① _实例2_实际可用版 ;# 母文章 https://zhuanlan.zhihu.com/p/48977298;;;;;;;;;;;;;;;;;;;;;;;;;;;; ...
最新文章
- Java中的BigDecimal类你真的了解吗?
- 从Java到Spring为何独得青睐Spring Summit 2017不可不知的那些事儿
- RHEL6.4换CentOS源
- ×××的各种协议介绍
- java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?
- 168.167Excle表列整数字符和字符整数的互相转化
- python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式
- NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
- 数据库每日一题(易错)
- 矩池云上复现论文 Neural Graph Collaborative Filtering 环境复现
- JSP直接调用一个action定向到页面
- 测试可变字符序列stringBuilder
- windows server 2003 下载
- 最新版云铺购ds网系统全开源可运营程序源码
- OpenCV 之 角点检测
- 算法:中国象棋中马的最少步数走法和不重复周游走法的实现(利用图论算法中的BFS和DFS)
- AGU13-Save The Princess
- 行政区划代码2020(SQL)--(下)
- 特征锦囊:如何根据变量相关性画出热力图?
- 第四次作业——肖祥英
热门文章
- 怎样设置电脑桌面共享计算机,局域网共享设置,小编教你电脑怎么设置局域网共享...
- php mov格式转换,mov格式怎么转换成mp4 如何将mov转换成mp4
- 可以实现psd转png转换器有哪些?这些工具能让你轻松转换图片格式
- python-pyecharts雷达图
- 大型网站的SEO引爆点
- win7共享wifi自动获取不到ip地址的解决办法
- Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
- linux内核下载 ok6410,手把手教你移植linux内核---------OK6410(一)
- 帝国CMS二次开发会员注册激活后发送欢迎邮件方法
- 来自白菜【强烈推荐】最新淘宝零食店铺排行榜 零食控最爱逛的淘宝零食店