目录
什么是Deno,以及它的主要特性是哪些?
安全性(权限管理)
模块机制
万一存放引用的站点挂了咋办?
只能使用URL来引用模块吗?
如何进行版本管理
浏览器兼容性
支持TypeScript开箱即用
总结
首页 web前端 js教程 什么是Deno?与Node.js的区别是什么?

什么是Deno?与Node.js的区别是什么?

Jun 24, 2021 am 11:28 AM
node

Deno是为解决Node的一些内在问题而创建的,那么与Node.js的区别是什么?下面本篇文章带大家详细了解一下Deno,介绍一下Deno和Node.js的区别。

什么是Deno?与Node.js的区别是什么?

【推荐学习:《nodejs 教程》】

Node.js的作者Ryan Dahl,过去一年半的时间都在打造一个新的JavaScript运行环境Deno来解决Node的一些内在问题。

不过不要误会,得益于JavaScript庞大的社区生态和使用范围,Node是一个非常不错的JavaScript运行环境。然而,Dahl 也承认在Node的某些方面他应该考虑得更全面一些,比如:安全性,模块机制,依赖管理等。

在他的计划中,他并不会去预想Deno在短时间内能够发展成一个多大规模的平台。当然咯,把时间调回2009年,JavaScript还是人人都能取笑的一个有些怪异的小语言,也木有现在这么多语言特性。

什么是Deno,以及它的主要特性是哪些?

Deno是基于Google V8引擎构建的安全的TypeScript运行环境。 下面是构建Deno的一些物料:

  • Rust(Deno的核心模块使用Rust编写,Node的核心模块是用C++实现的)
  • Tokio(Rust实现的异步编程框架)
  • TypeScript(Deno对JavaScript和TypeScript都支持开箱即用)
  • V8(Google出品JavaScript运行时,主要用在Chrome和Node中)

接下来看看Deno提供了哪些特性。

安全性(权限管理)

Deno最重要的特性就是安全性。

相较于Node,Deno默认使用沙箱环境执行代码,这意味着运行环境没有操作以下模块权限:

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

让我们瞅一眼Deno的权限系统是如何工作滴。

(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命名空间来操作文件,而不像在Node中使用fs模块。Deno命名空间提供了超多基础方法。不过使用Deno命名空间会导致我们的代码失去了对浏览器的兼容性,这个问题我们晚点再聊。

使用下面的命令执行上述脚本:

$ deno run write-hello.ts
登录后复制

执行之后,我们会收到下面的提示:

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的错误,如果我们没写错误处理逻辑的话,进程在此时就被终止啦。

如果我们用下面的命令来执行脚本:

deno run --allow-write write-hello.ts
登录后复制

会在没有提示的情况下创建这两个文件。

Deno针对文件系统的命令行标志位,除了--allow-write,还有--allow-net/--allow-env/--allow-run,分别用来开启针对网络、系统环境变量和操作子进程的权限。

模块机制

Deno使用浏览器一样的方式,通过URL来加载模块。很多人第一次见到在服务端的import语句中见到URL会感到有点困惑,但对我来说这还蛮好理解的:

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
登录后复制

你觉得通过URL来引入模块会有啥大不了的吗?答案其实蛮简单的:通过使用URL来加载模块,Deno就可以避免引入一个类似npm的中心化系统来发布package,npm最近受到了很多吐槽

通过URL来引入代码,可以让包的作者们使用自己最喜爱的方式来维护和发布自己的代码。再也不会有package.jsonnode_modules了。

当我们启动应用之后,Deno会下载所有被引用的文件,并将它们缓存到本地。一旦引用被缓存下来,Deno就不会再去下载它们了,除非我们使用-- relaod标志位去触发重新下载。

还有几个问题值得我们讨论一哈:

万一存放引用的站点挂了咋办?

由于没有了一个中心化的包管理站点,那些存放模块的站点可能因为各种各样的原因挂掉。如果在开发甚至生产环境出现这种情况是非常危险滴!

我们在上一节提到,Deno会缓存好已下载的模块。由于缓存是存放在我们的本地磁盘的,Deno的作者建议将这些缓存提交到代码仓库里。这样一来,即使存放引用的站点挂了,开发者们还是可以使用已经下载好的模块(只不过版本是被锁住的啦)。

Deno会把缓存存储在环境变量$DENO_DIR所指定的目录下,如果我们不去设置这个变量,它会指向系统默认的缓存目录。我们可以把$DENO_DIR指定我们的本地仓库,然后把它们提交到版本管理系统中(比如:git

只能使用URL来引用模块吗?

总是敲URL显得有点XX,还好,Deno提供了两种方案来避免我们成为XX。

第一种,你可以在本地文件中将已经引用的模块重新export出来,比如:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
登录后复制

假如上面这个文件叫local-test-utils.ts。现在,如果我们想再次使用test或者assertEquals方法,只需要像下面这样引用它们:

import { test, assertEquals } from './local-test-utils.ts';
登录后复制

看得出来,是不是通过URL来引用它们并不是最重要的啦。

第二种方案,建一个引用映射表,比如像下面这样一个JSON文件:

{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}
登录后复制

然后把它像这样import到代码里:

import { serve } from "http/server.ts";
登录后复制

为了让它生效,我们还需要通过--importmap标志位让Deno来引入import映射表:

$ deno run --importmap=import_map.json hello_server.ts
登录后复制

如何进行版本管理

版本管理必须由包作者来支持,这样在client端可以通过在URL中设置版本号来下载:https://unpkg.com/liltest@0.0.5/dist/liltest.js

浏览器兼容性

Deno有计划做到兼容浏览器。从技术上讲,在使用ES module的前提下,我们不需要使用任何类似webpack的打包工具就能在浏览器上运行Deno代码。

不过呢,你可以使用类似Babel这样的工具可以把代码转化成ES5版本的JavaScript,这样可以兼容那些不支持所有最新语言特性的低版本浏览器中,带来的后果就是最终文件里有很多不是必须的冗余代码,增大代码的体积。

结果取决于我们的主要目的是啥。

支持TypeScript开箱即用

不需要任何配置文件就能在Deno中轻易地使用TypeScript。当然咯,你也可以编写纯JavaScript代码,并使用Deno去执行它。

总结

Deno,作为一个新的TypeScript和JavaScript的运行环境,是一个非常有趣的技术项目,并且至今已经稳定发展了一段时间。但是距离在生产环境中去使用它还有比较长的一段路要走。

通过去中心化(或者翻译成分布式?)的机制,把JavaScript生态系统从npm这样中心化的包管理系统中解放了出来。

Dahl希望在这个夏天快结束的时候能够发布1.0版本,所以如果你对Deno未来的新进展感兴趣的话,可以给它个star

最后还有一个日志系统的广告,大家可以去原文查看。

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

更多编程相关知识,请访问:编程视频!!

以上是什么是Deno?与Node.js的区别是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nvm 怎么删除node nvm 怎么删除node Dec 29, 2022 am 10:07 AM

nvm删除node的方法:1、下载“nvm-setup.zip”并将其安装在C盘;2、配置环境变量,并通过“nvm -v”命令查看版本号;3、使用“nvm install”命令安装node;4、通过“nvm uninstall”命令删除已安装的node即可。

node项目中如何使用express来处理文件的上传 node项目中如何使用express来处理文件的上传 Mar 28, 2023 pm 07:28 PM

怎么处理文件上传?下面本篇文章给大家介绍一下node项目中如何使用express来处理文件的上传,希望对大家有所帮助!

Node服务怎么进行Docker镜像化?极致优化详解 Node服务怎么进行Docker镜像化?极致优化详解 Oct 19, 2022 pm 07:38 PM

这段时间在开发一个腾讯文档全品类通用的 HTML 动态服务,为了方便各品类接入的生成与部署,也顺应上云的趋势,考虑使用 Docker 的方式来固定服务内容,统一进行制品版本的管理。本篇文章就将我在服务 Docker 化的过程中积累起来的优化经验分享出来,供大家参考。

深入浅析Node的进程管理工具“pm2” 深入浅析Node的进程管理工具“pm2” Apr 03, 2023 pm 06:02 PM

本篇文章给大家分享Node的进程管理工具“pm2”,聊聊为什么需要pm2、安装和使用pm2的方法,希望对大家有所帮助!

Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork节点详解及安装指南本文将详细介绍PiNetwork生态系统中的关键角色——Pi节点,并提供安装和配置的完整步骤。Pi节点在PiNetwork区块链测试网推出后,成为众多先锋积极参与测试的重要环节,为即将到来的主网发布做准备。如果您还不了解PiNetwork,请参考Pi币是什么?上市价格多少?Pi用途、挖矿及安全性分析。什么是PiNetwork?PiNetwork项目始于2019年,拥有其专属加密货币Pi币。该项目旨在创建一个人人可参与

聊聊用pkg将Node.js项目打包为可执行文件的方法 聊聊用pkg将Node.js项目打包为可执行文件的方法 Dec 02, 2022 pm 09:06 PM

​如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node项目打包为可执行文件的方法,希望对大家有所帮助!

npm node gyp失败怎么办 npm node gyp失败怎么办 Dec 29, 2022 pm 02:42 PM

npm node gyp失败是因为“node-gyp.js”跟“Node.js”版本不匹配,其解决办法:1、通过“npm cache clean -f”清除node缓存;2、通过“npm install -g n”安装n模块;3、通过“n v12.21.0”命令安装“node v12.21.0”版本即可。

什么是单点登录系统?用nodejs怎么实现? 什么是单点登录系统?用nodejs怎么实现? Feb 24, 2023 pm 07:33 PM

什么是单点登录系统?用nodejs怎么实现?下面本篇文章给大家介绍一下使用node实现单点登录系统的方法,希望对大家有所帮助!

See all articles