什么是Deno?与Node.js的区别是什么?
Deno是为解决Node的一些内在问题而创建的,那么与Node.js的区别是什么?下面本篇文章带大家详细了解一下Deno,介绍一下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.txt
和hello2.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.json
和node_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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

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

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

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

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

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

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

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怎么实现?下面本篇文章给大家介绍一下使用node实现单点登录系统的方法,希望对大家有所帮助!
