Deno 意味着什么?

死锁专家
• 阅读 3747
作者:Arek Nawo

翻译:疯狂的技术宅

原文:https://areknawo.com/deno-why...

未经允许严禁转载

如果你一直关注 Web 开发领域,那么最近可能已经听到了很多关于 Deno 的信息——一种新的 JavaScript 运行时,它可能也会被认为是 Node.js 的继承者。但是这意味着什么,我们需要“下一个 Node.js” 吗?

什么是 Deno?

要了解发生了什么,我们首先需要看一下 Deno 到底是什么。就像我前面说过的那样,这是一个新的 JavaScript 运行时,也就是要执行 JS 代码的环境。它最初是由 Ryan Dahl 创造的,他在之前曾经为我们把 Deno 与 Node.js 进行了比较。

Ryan在 JSConf EU 2018 演讲 上宣布了 Deno,标题为 “Node.js 的十大遗憾”。仅从那条信息中,你就可以知道进展情况。 Deno 是从头开始创建的,是当前对 Node.js 的更好的实现

但是 Node.js 有什么不好的地方?Deno 如何与它更成熟的表兄抗衡?

与 Node.js 的比较

尽管 Deno 和 Node.js 是执行相似操作的类似工具,但它们之间的差异远远不只是名称的颠倒。

体系结构

让我们先来了解一下 Deno 的内部原理。就像 Node.js 一样,它基于 Chromium 的 V8 JavaScript 引擎,并使用事件驱动非阻塞架构。但是两者的主要编写语言有所不同。Node.js 主要使用 C ++ 编写,libuv 作为其异步 I/O 库,而 Deno 用的是 Rust,同样其使用的异步库 Tokio 也是用 Rust 编写。

对于这些差异如何转化为实际性能,我们必须拭目以待。就目前而言,根据 Deno 的基准,两者之间的区别是无法区分的,或者说至少是非常微妙的。

ES模块

你可能知道,Node.js 当前的模块系统是所谓的 CommonJS (带有 require() 的那个),尽管 ESM( ECMAScript 模块(带有 importexport 的模块)成为 JS 的官方标准已有相当长的一段时间了,可以追溯到2015 年推出的 ES6。当然,Node.js 确实支持 ESM,但是此功能目前([ v14.xx) 被标记为实验性的,从而迫使 JS 社区仍然使用 CommonJS 模块系统 或其他打包器。

这就是 Deno 要推出的东西,它仅支持 ESM 模块 —— 一个真正的模块系统!

依赖管理

但是,除了 ESM 之外,Deno 还为 Node.js 带来的依赖性管理带来了更多变化。

基于从有着上百万个包的 NPM registry 和类似黑洞的 node_modules 目录中汲取的经验,Deno 采用了一种完全不同的依赖关系方法。 Deno 不需要类似 NPM 的 registry 和包管理器,而是直接从 URL 导入并使用依赖项:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
    req.respond({ body: "Hello World\n" });
}

然后将下载的模块不可见地存储在计算机上的某个位置。是的,这意味着不会再有 node_modules

可是等等!还有更多...或者我应该少说,因为 Deno 还摆脱了现在制作的万能的 package.json 文件。除了deps.ts文件之外没有其他的替代选择,它的作用更像是所有外部模块的重定向排序文件:

export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";

至于 NPM registry,因为 Deno 现在可以从 URL 加载依赖项,所以这与 Node.js 的要求不一样。但是如果你对这个选项感兴趣,Deno 会提供自己的包托管

TypeScript 和其他功能

是的,你已经看到了 ——JavaScript 是使用 Deno 的主要语言,另外还支持 TypeScript,。该支持是内置的,不需要类似 custom registers 的东西或复杂的设置。

但是,除了 TS 支持之外,Deno 还内置了许多其他有用的工具。它们当中的大多数以命令形式出现,例如fmtbundledoc,分别提供代码格式化,打包和文档生成等功能。

API

至于 API,Deno 肯定是自己的东西。一切都是用 TypeScript 编写的,异步 API 仅基于 Promise。核心功能被限制在最低限度,而其他所有功能都可以在 标准库 中找到。

所以从表面上看,这一切看起来都很好,而且非常有前途,但是当你意识到更改所有的 API 意味着将 Node.js 代码库转换为 Deno 更加困难时,这种愉悦的心情立即消失了。可悲的是,所有新的和更好的东西都必须付出代价,对吗?

安全

最后,安全性是 Deno 最重要的方面之一。与 Node.js 相比,它用沙盒执行的代码,仅允许访问系统的选定部分。这意味着通过传递适当的标志,可以轻松地限制对磁盘、网络和子进程等内容的访问。

那么,这意味着什么?

因此,我刚刚以非常简短的方式向你介绍了 Deno 的一些功能,以便你能够掌握所有内容的要点。你可以根据需要进行更深入的研究(我将在本文结尾放一些不错的文章链接)。

让我们回过头来讨论这个博客文章的主要问题——这意味着什么?好吧,主要是因为 Deno v1 已经在 2020 年 5 月 13 日 发布(正好是其首次发布的第二年)。现在每个人都在问这是否将会成为“下一个大事件”,或者它是否将会完全取代 Node.js。

就个人而言,我认为现在讨论这些还为时过早。考虑到项目的规模和社区的期望,该项目尽管已经是 v1 版了,但要成为可行的 Node.js 替代者还有很长的路要走。请记住,这些技术(即使存在所有差异)仍然要做同样的事情,同时必须相互竞争。而且 Node.js 的开发也不会过时(例如基于 Promise 的 FS API 变体或 ESM 实验性支持),这意味着我们很可能会在这个存在两个 JavaScript 运行时的世界中生活很长时间(说的好像对 JS 开发人员来说是个新鲜事一样?)。并且请记住,我甚至没有提到庞大的 NPM registry 和生态系统,尽管它们无论如何都不是完美的,但仍然为 Node.js 增添了很多价值——这是 Deno 目前还不具备的优势。

底线

总而言之,Node.js 不会出现在任何地方,并且,如果你要启动一个用于生产的严肃项目,那么至少就目前而言,最好还是坚持使用 Node.js。话虽如此,但是没有什么人(当然不是我)或事情能够阻止你去使用 Deno,甚至把 Deno 用于严肃的项目。看起来它确实像是未来,但是我们根本还没有到达。

Deno资源:


本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章

Deno 意味着什么?

欢迎继续阅读本专栏其它高赞文章:


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
AssemblyScript 入门指南[每日前端夜话0xEB]
每日前端夜话0xEB每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2459 字预计阅读时间:10分钟作者:DannyGuo翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/b880277c594152a503
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Node.js 12中的ES模块[每日前端夜话0x9E]
每日前端夜话0x9E每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2552字预计阅读时间:10 分钟作者:BrianDeSousa翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/2ccaf94cecd3
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0