Deno是由Node.js的原始创建者Ryan Dahl创建的一个项目,刚刚发布了1.0版。
它不是一种新的语言,它不是一种新的类型系统,而是一种新的运行时,它支持现成的Javascript和TypeScript。
首先,让我们看看Deno项目的一个比较突出的主张,即安全运行时。
引擎就是将您编写的代码转换成可执行代码的工具。
另一方面,运行时为您的代码提供了运行环境或上下文。它提供了一组对象和API,您的代码可以与之交互,例如,文件系统或‘window`。
浏览器和node.js使用相同的引擎-V8引擎。然而,它们并不使用相同的运行时。
浏览器将使用浏览器提供的运行时,而node.js将使用由node.js提供的运行时。
嗯,对于Node.js,您非常信任您使用的脚本不会做任何变化无常的事情。
例如,以下面的代码为例。在这里,我导入了一个模块,我是完全安全的。我的印象是,这个模块将接受一些文本,并给定一种语言,将其转换为所说的语言。
如果我使用Node.js运行时执行此代码,我必须相信此代码不会做任何恶意操作,因为默认情况下,Node.js运行时为任何脚本提供对整个系统的访问。
例如,我导入的上述脚本在运行时实际上可以扫描我的系统中的环境变量(DB主机、用户名和密码),并将它们发送到第三方系统。都不让我知道。
您所依赖的是您执行的代码是安全且经过验证的。通常,你会通过某种社会证据来断言这一点。如果一个软件包每周被下载100万次,那么它很有可能是安全的,对吗?
因为你不仅要验证你使用的每个包裹都是安全的,还要确保你使用的每个包裹都是安全的,你使用的每个包裹都是安全的。
但是,如果您在浏览器中运行上面的代码,那么您可能会受到更多的保护。默认情况下,浏览器会阻止访问大多数内容,如硬盘、网络摄像头、麦克风等。
这是有道理的,对吧-你不会想不小心访问一个网页,然后突然把你硬盘上的所有内容都加密了。
这是因为浏览器运行时是安全的,并且在其中执行的脚本的信任级别多少为0。用户必须明确授予访问权限。
因此,这就是迪诺试图提供的相同级别的安全。他们希望将浏览器的默认禁用特性带到服务器端。
要实现这一点,您必须在执行代码时通过提供标志来显式启用访问。
这实际上是行不通的。这是因为我们没有给它提供访问网络的许可。为此,我们必须给出`--allow-net`标志:
这种方法有几个问题,主要是如果一个脚本需要访问网络,那么所有脚本现在都可以访问。但是,可以通过在代码中显式使用API来解决此问题。
通常,使用Node时,您只需在项目的目录中包含一个Package.json文件,然后在导入语句中引用您的依赖项。
使用Deno,它们处理依赖关系的方式非常不同,这可能是运行时最有争议的特性。
这里我们直接指向STD库HTTP server.ts文件,并将其固定到版本`0.53.0`。
这使得快速编写利用依赖项的脚本变得非常简单,而不必使用Package.json文件设置节点项目。
主要是版本管理。如果我在多个文件(比如UUID生成器)中使用相同的包,我必须确保无论在哪里导入该文件,我都使用相同的版本。如果我需要升级那个版本,我现在也需要在所有地方更新它。
目前,人们正在想出几个解决方案,但是最流行的可能是导入地图,这是Deno团队目前不稳定的特性。
导入映射是Deno团队的一个实验性特性,其行为更像传统的Package.json文件。
无论哪种方式,默认情况下所有依赖项都会被缓存,所以如果您认为它会在每次执行时重新下载它们,请不要担心。
这是Node真正缺少的东西,并导致了多个相互竞争的包,所有这些包都试图做一些一开始就应该合并到语言中的事情。
就我个人而言,我觉得Node.js的STD库的缺乏导致了编写Node.js应用程序的各种不同的、对比鲜明的和不完整的方法。
显然,有些人会认为这是积极的--你现在不再拘泥于一种做事的方法或方式。然而,我会争辩说,我更喜欢社区接受的方法或库,用于单一任务,如果我不喜欢这种方法,那么我可以使用替代包。
标准库的最大特点是Deno团队保证那里的代码总是会被审计。这意味着对于广泛使用的包,如HTTP服务器和UUID,您可以确保正在运行的代码可以安全使用。
标准库包括HTTP、WS、UUID、哈希、DATETIME等模块,不胜枚举。
JavaScript很棒。但是.。说它有一些怪癖,可以以一些意想不到的方式工作。
TypeScript是一个很好的选择,它构建在Javascript之上,它提供了一个合理的类型系统,可以帮助在编译期间捕获过多的运行时错误。
以前,如果将tyescript与Node.js一起使用,则需要包括tyescript编译器、tyescript config等。
Deno run myfile.js的工作原理与运行Deno run myfile.ts完全相同。不需要特定的配置或系统。
目前,他们正在使用微软的TypeScript编译器,但计划在Ruust中实现自己的编译器。
与Node.js不同,在Node.js中,一旦构建/编译(如果使用TypeScript),您将获得一组具有单个入口点的文件,而Deno将始终为您提供单个可执行二进制文件。
它有一些我在上面提到的权衡,而且仍然相当年轻-因此很容易受到相当多的变化的影响。
然而,它确实有一个很有前途的未来,我绝对建议你去尝试一下。
我不是说出去用Deno构建您的下一个应用程序--但也许下次您有一个想要运行的小脚本时,不妨试一试。
这篇文章的目的绝对是为了让你对Deno有初步的了解,增加你的广度。
从上面列出的6枚硬币中,你总共可以用多少种方法来创造3美元呢?