前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >什么是Deno,它与Node.js有什么不同?[每日前端夜话0xA1]

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

作者头像
疯狂的技术宅
发布于 2019-08-02 07:28:09
发布于 2019-08-02 07:28:09
2.2K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
json字符串数组转json数组
当需要把一串字符串转成一个json 数组 ,并遍历其中的内容时。 首先要导入 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包
全栈程序员站长
2022/06/24
5.6K0
java生成json格式数据 和 java遍历json格式数据
java 生成json 格式的数据,在需要加入一个创建json的jar包,这个网上有好多,我使用的是org.json的jar包。
全栈程序员站长
2022/07/19
2.8K0
java json数组转json对象_json对象数组
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
10K0
java json数组转json对象_json对象数组
js json字符串转json数组_string转json数组
查了很久,也实践了很多,都没有成功。网上说得最多的就是用 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包里面的
全栈程序员站长
2022/11/08
13.3K0
string转JSONObject遍历多层找到key的value
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172474.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.3K0
Json详解以及fastjson使用教程[通俗易懂]
Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到Json的使用。下面我们就简单讲一下Json的使用以及fastjson.jar包的使用。
全栈程序员站长
2022/07/25
2.5K0
Json详解以及fastjson使用教程[通俗易懂]
Json的常用方法[通俗易懂]
在java中要想方便的操作json首先要引入json的jar包,如json-lib-2.4-jdk15.jar
全栈程序员站长
2022/08/04
6790
java json对象和json字符串互转的方法_js中对象转字符串的方法
JSON字符串与JavaBean之间的转换建议使用TypeReference<T>类
全栈程序员站长
2022/09/27
4.6K0
Java中Json解析
首先准备一个JSON格式的字符串 * String JsonStr = "{object:{persons:" + "[{name:'呵呵',image:'http://10.0.159.132:8080/Web/s1.png'}," + "{name:'哈哈',image:'http://10.0.159.132:8080/Web/s1.png'}," + "{name:'嘿嘿',image:'http://10.0.159.132:8080/Web/s2.jpg'}]}}";
用户3030674
2018/09/14
2.2K0
java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…
$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象
全栈程序员站长
2022/11/08
2.4K0
javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下:
kirin
2020/10/30
4.8K0
string转jsonstring_java json转map
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/04
3.3K0
httpclient post发送json数组并解决json乱码问题
业务: 客户端发送json数据,服务端进行解析 client发送json格式: {"data":[{"name":"1;,a","id_no":"222,a","cellphone":"123141a","abode_detail":"213,a","emp_add":"werew3a","app_no":"111111111111a","create_time":"11a"},{"name":"张三","id_no":"null","cellphone":"null","abode_detai
shengjk1
2018/10/24
4.2K0
Android-json解析(三):原生JSONObject+JSONArray的解析、遍历及生成等
Android-Gson+GsonFormat的导入 Android-json解析(一):Gson的使用 Android-json解析(二):Jackson的使用 Android-json解析(三):原生JSONObject+JSONArray的使用 Android-json解析(四):fastjson的使用
全栈程序员站长
2022/09/14
8.2K0
json对象基本操作--视频讲解
经小伙伴的提醒,决定插播一期json对象基本操作的视频。由于我录视频没有很充分的前期准备,因为太费时间了,所以都是想到什么内容,打个腹稿,准备一下设备就开始喷了。欢迎多提意见。
FunTester
2020/03/23
4470
数组的增删改查操作
做批量数据录入时须要对json内的数组进行增删改查操作,splice还是非常强大的记录一下用法。
全栈程序员站长
2022/07/07
5170
JSON入门
JSON:JavaScript Object Notation 【JavaScript 对象表示法】
全栈程序员站长
2022/07/20
3540
JSON入门
Java解析JSON文件「建议收藏」
通常我们需要解析本地的json文件或者服务器上的json文件。我们用来解析json格式的jar包有很多,jackson,fastjson,gson都行。但本人喜欢用fastjson。所以本篇都是以fastjson来解析json文件。
全栈程序员站长
2022/11/04
1.9K0
jsonobject是什么类型_json和jsonobject区别
JSONObject是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。
全栈程序员站长
2022/09/28
2.8K0
js 二维数组 添加json数据及js数组与json字符串「建议收藏」
JSON(JavaScript Object Notation )是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,JSON是JavaScript原生数据格式。
全栈程序员站长
2022/09/01
4.4K0
推荐阅读
相关推荐
json字符串数组转json数组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验