首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是Deno,它与Node.js有什么不同?[每日前端夜话0xA1]

什么是Deno,它与Node.js有什么不同?[每日前端夜话0xA1]

作者头像
疯狂的技术宅
发布于 2019-08-02 07:28:09
发布于 2019-08-02 07:28:09
2.4K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

每日前端夜话0xA1

每日前端夜话,陪你聊前端。

每天晚上18:00准时推送。

正文共:1925 字

预计阅读时间:10 分钟

作者:Maciej Cieslar

翻译:疯狂的技术宅

来源:logrocket

What Is Deno?

Node.js 的创建者 Ryan Dahl 花了一年半的时间研究 Deno(https://deno.land/),这是一个新的 JavaScript 运行时环境,可以解决Node 的所有问题。

不要误解我的意思,Node 本身就是一个很棒的服务器端 JavaScript 运行时环境,主要是因为它拥有庞大的生态和 JavaScript。然而,Dahl 承认他应该考虑更多的东西:安全性、模块和依赖性等。

并不是说 Dahl 认为这个平台在短时间内会增长多少。不过早在 2009 年,JavaScript 仍然是这种奇怪的小众语言,每个人都在取笑它,而且还确实许多功能。

什么是Deno,它的主要特点是什么?

Deno 是一个基于 V8 构建的安全的 Typescript 运行时,V8 是 Google 的 JavaScript 运行时引擎。

它由以下技术构建:

  • Rust(Deno的核心是用Rust编写的,Node用C ++编写)
  • Tokio(用Rust编写的事件循环)
  • TypeScript(Deno 支持 JavaScript 和开箱即用的 TypeScript)
  • V8(google 在 Chrome 和 Node 等中使用的 JavaScript 运行时)

那么让我们来看看 Deno 提供的功能。

安全性(权限)

Deno 最重要的功能之一就是注重安全性。

与 Node 相反,Deno 默认在沙箱中执行代码,这意味着运行时无权访问:

  • 文件系统
  • 网络
  • 执行其他脚本
  • 环境变量

我们来看看权限系统的工作原理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async () => {
    const encoder = new TextEncoder();
    const data = encoder.encode('Hello world\n');

    await Deno.writeFile('hello.txt', data);
    await Deno.writeFile('hello2.txt', data);
})();

该脚本创建了两个名为 hello.txthello2.txt 的文本文件,其中包含一个 “Hello world” 消息。该代码正在沙箱中执行,因此它无法访问文件系统。

还要注意,我们用的是 Deno 命名空间而不是 fs 模块,就像在 Node 中一样。Deno 命名空间提供了许多基本的辅助函数。如果使用命名空间,就会失去浏览器兼容性,稍后将对此进行讨论。

这样运行它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deno run write-hello.ts

将会提示以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]

实际上我们会被提示两次,因为来自沙箱的每次调用都必须请求许可。当然,如果我们选择 allow always 选项就只会被问一次。

如果选择 deny 选项,将抛出 PermissionDenied 错误,而且由于我们的代码中没有任何错误处理逻辑,因此将终止该进程。

如果用以下命令执行脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deno run --allow-write write-hello.ts

会发现没有提示,两个文件都已被创建。

除了文件系统的 --allow-write 标志外,还有 --allow-net--allow-env--allow-run标志用来启用网络请求、访问环境、以及运行子进程。

模块

Deno 就像浏览器一样,通过URL加载模块。很多人起初在看到服务器端带有 URL 的 import 语句时感到困惑,但它确实有意义 —— 只要你能忍受:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

您可能会问,通过 URL 导入包有什么大不了的?答案很简单:通过 URL,Deno 软件包可以在没有集中注册的情况下进行分发,例如 npm,还有很多问题的解释可以在这里找到(https://www.youtube.com/watch?v=MO8hZlgK5zc)。

通过URL导入代码,我们使包的创建者能够在他们认为合适的地方托管自己的代码。不需要 morepackage.json 和 node_modules。

当启动应用程序时,Deno 会下载所有导入的模块并对其进行缓存。一旦它们被缓存,Deno 将不会再次进行下载,直到通过 --reload 标志特别要求。

这里有几个重要的问题:

如果网站出现故障怎么办?

由于它不是集中式的注册,托管该模块的网站可能会因多种原因而被删除。这取决于它在开发期间的状态——或者更糟糕的是,在生产过程中是有风险的。

正如前面提到过的,Deno 缓存了下载的模块。由于缓存存储在本地磁盘上,Deno 的创建者建议在版本控制系统(即git)中检查它并将其保存在存储库中。这样,即使网站出现故障,所有开发人员都可以访问下载的版本。

Deno 将缓存存储在 $DENO_DIR 环境变量下指定的目录中。如果不自己设置变量,它将被设置为系统的默认缓存目录。可以在本地存储库中的某处设置 $DENO_DIR 并将其签入版本控制系统。

我是否必须一直通过URL导入?

不断输入网址将非常繁琐。值得庆幸的是,Deno 为我们提供了两种选择避免这样做。

第一个选项是从本地文件重新导被出导入的模块,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";

假设上面的文件名为 local-test-utils.ts。现在,如果想再次使用 testassertEquals 函数,可以像这样引用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { test, assertEquals } from './local-test-utils.ts';

因此,是否从 URL 加载它并不重要。

第二个选项是创建一个导入映射,可以先在 JSON文 件中指定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}

然后导入它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { serve } from "http/server.ts";

为了使它工作,必须通过包含 --importmap 标志告诉 Deno 导入映射:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deno run --importmap=import_map.json hello_server.ts
那么包版本控制呢?

包提供程序必须支持版本控制,但从客户端来看,只需在 URL 中设置版本号即可,如下所示:https://unpkg.com/liltest@0.0.5/dist/liltest.js

浏览器兼容性

Deno 旨在与浏览器兼容。从技术上讲在使用ES模块时,可以不必借助任何构建工具(如 webpack)来使我们的程序可以在浏览器中使用。

但是,像 Babel 这样的工具会将代码转换为 ES5 版本的 JavaScript,因此,即使在不支持该语言所有最新功能的旧版浏览器中,代码也可以运行。但这也是以在最终文件中包含大量不必要的代码并使输出文件膨胀为代价的。

由自己决定我们的主要目标是什么,并相应地做出选择。

TypeScript支持开箱即用

Deno 可以无需任何配置文件就能够轻松使用 TypeScript。同时可以用纯 JavaScript 编写程序并执行它们而不会有任何麻烦。

总结

Deno 是 TypeScript 和 JavaScript 新的运行时,是一个有趣的项目,现在已经稳定发展了很长一段时间。但是在被认为能够稳定用于生产环境之前还有很长的路要走。

借助它的分布式方法,它需要从集中式软件包注册表(即npm)中释放 JavaScript 生态系统。

Dahl 说他希望在夏天结束前发布 1.0 版本,所以如果你对 Deno 的未来发展感兴趣,可以访问它的 GitHub(https://github.com/denoland/deno)。

原文:https://blog.logrocket.com/what-is-deno/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是Deno?跟Node.js有何区别?
Node.js的作者Ryan Dahl,过去一年半的时间都在打造一个新的JavaScript运行环境Deno来解决Node的一些内在问题。
ConardLi
2020/03/02
1.9K0
什么是Deno?跟Node.js有何区别?
只需5分钟,让你了解未来可能推翻Node的新轮子 Deno 1.0
最近Nodejs作者Ryan Dahl发布了Deno 1.0正式版,圈子一下沸腾起来了。或许你早在两年前就听说了这个东西,但是也有人不知道这个东西是什么,干什么用的,所以今天我将为大家来简单的聊一下这个将来可能会推翻Node的新轮子。
吴佳
2022/09/26
7470
聊聊Deno的那些事
? 这是第 99 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:聊聊Deno的那些事 https://www.zoo.team/arti
政采云前端团队
2021/06/15
1.1K0
聊聊Deno的那些事
deno如何偿还Node.js的十大技术债 [每日前端夜话0x3D]
“Node现在太难用了!”。Node.js之父 Ryan Dahl 去年初要开发一款 JavaScript 互动式数据分析工具时,忍不住抱怨起自己十年前一手创造的技术。
疯狂的技术宅
2019/03/27
9700
deno如何偿还Node.js的十大技术债 [每日前端夜话0x3D]
Deno 入门指南
2018 年时,一篇 如何看待 ry 的项目 deno 的 issue 被中文刷屏的事件? 的文章成功引起了我对 Deno 的注意,cnode 有一篇文章严厉斥责这是中国开发者的耻辱,对此我不敢完全认同,毕竟 996 的大环境下,是很难孵化出国外这种创新精神的。但我并不否认学不学的动,全看个人。本人近期最敬佩的 蜗牛老湿_大圣坚持每日 5 点多起床,做到如此勤奋与持久,何愁学不动?
用户1250838
2021/05/31
1.6K0
Deno 入门指南
用 Deno 编写一个简单的 REST API
具体的安装及配置可参考官方文档:deno.land, 社区的安装教程可以说是非常丰富了,这里推荐 justjavac 的镜像站点:x.deno.js.cn。如需通过官网安装,可将地址替换为https://deno.land/x/install/:
胡琦
2021/09/09
1K0
deno入门教程
Deno 是一个由 Node.js 的创始人 Ryan Dahl 开发的现代化 JavaScript/TypeScript 运行时环境。它旨在提供安全、简单和高性能的方式来构建 JavaScript 和 TypeScript 应用程序。
用户6297767
2023/11/21
6530
deno入门教程
Deno会在短期内取代Node吗?
作为Node之父,Ryan Dahl认为Node自从他把项目移交出去后,Node的走向越来越背离了他的初衷,并且存在着很多无法解决的问题,所以他决心重新开发一个新的项目去解决这些问题,这个项目就名为Deno。目标则是Destroy-node。
葡萄城控件
2020/05/27
8760
Deno 运行时入门教程:Node.js 的替代品
这几天假期,我学习了一下 Deno。它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。
ruanyf
2020/02/14
1.9K0
Deno 运行时入门教程:Node.js 的替代品
了不起的 Deno 实战教程
相信接触过 Node.js 的读者对 Express、Hapi、Koa 这些 Web 应用开发框架都不会陌生,在 Deno 平台中如果你也想做 Web 应用开发,可以考虑直接使用以下现成的框架:
阿宝哥
2020/05/25
2.6K0
了不起的 Deno 实战教程
【学不动了系列】之 Deno 入门 什么是Deno安装DenoDeno运行时(Runtime)Deno标准库第三方模块
希望大家不要被标题吓到,纯属为了吸引眼球?。。根据笔者这两天的学习感受,Deno 比 Node 更容易入门,如果你有 Node 的基础那更简单了,很多东西都是可以类比的,学起来豪不费力。个人认为现在正
MudOnTire
2020/07/31
1.6K0
【学不动了系列】之 Deno 入门
                            什么是Deno安装DenoDeno运行时(Runtime)Deno标准库第三方模块
WebAssembly 是 Deno 的好搭档
备受期待的 Deno 项目 终于发布了 1.0 版本!Deno 是由 Node.js 的创始人 Ryan Dahl 创建的,旨在解决他所说的“我为 Node.js 感到遗憾的十件事”。
深度学习与Python
2020/08/28
2.5K0
如何将Node.js库转换到Deno
由于Node和Deno的一些差异,一个库要想同时支持Node和Deno是需要一些改造的
ACK
2022/05/29
2.6K0
如何将Node.js库转换到Deno
Deno 安装手册
node.js 之父 Ryan Dahl 发起的新项目:deno,力争打造一个基于 v8 引擎的安全的 TypeScript 运行时,同时实现 HTML5 的基础 API。
Yunjie Ge
2022/04/24
9720
Hello, Deno
Deno的创始人和Node的创始人是同一个人。把Node的前两个字母和后两个字母调换了下,destroy node,要用Rust重写js/ts的运行时,来解决设计Node.js之初的缺陷,并要在Deno中解决这些问题。
后端云
2022/11/25
5981
Hello, Deno
Deno 环境下的 TypeScript 开发入门手册
在本文中,我会让你快速了解 Deno,并把它与 Node.js 进行比较,以此构建你的第一个 REST API。
疯狂的技术宅
2020/05/26
1.6K0
150. 精读《Deno 1.0 你需要了解的》
Deno 将于 2020-05-13 发布 1.0,如果你还有上面的疑惑,可以和我一起通过 Deno 1.0: What you need to know 这篇文章一起了解 Deno 基础知识。
黄子毅
2022/03/14
4870
Deno 2021 回顾:优化内核、兼容 Node.js
2021 年是 Deno 获得资助发展的第一个整年。我们的公司 有 10 个员工,而且还在不断增加。
深度学习与Python
2022/03/23
9180
Deno 2021 回顾:优化内核、兼容 Node.js
了不起的 Deno 入门篇
Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验。Deno 含有以下功能亮点:
阿宝哥
2020/05/25
3.6K0
了不起的 Deno 入门篇
deno 初体验,实战记录一个node项目迁移到deno需要做什么
文档中有很多方式,我们按需选择即可。这里我直接选择mac的脚本安装形式。执行一个脚本然后按照提示设置环境变量即可
ACK
2020/06/09
1.6K0
deno 初体验,实战记录一个node项目迁移到deno需要做什么
相关推荐
什么是Deno?跟Node.js有何区别?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档