作者:MaciejCieslarDeno,一个全新的JavaScript运行环境,解决了Node的所有问题。不要误会,Node本身就是一个很棒的服务器端JavaScript运行环境,主要是因为它庞大的生态系统和JavaScript。然而,Dahl承认他应该考虑更多的事情:安全、模块和依赖关系等。并不是说Dahl认为该平台会在短时间内增长很多。但是回到2009年,JavaScript仍然是这种被大家取笑的怪异小众语言,而且它有很多特性。什么是Deno,它的主要特点是什么?Deno是一个安全的Typescript运行时,它建立在谷歌的JavaScript运行时引擎V8之上。它使用以下技术构建:Rust(Deno的核心是用Rust编写的,Node是用C++编写的)Tokio(用Rust编写的事件循环)TypeScript(Deno支持JavaScript和开箱即用的TypeScript)V8(谷歌在JavaScript运行时使用在Chrome、Node等中)所以让我们来看看Deno必须提供什么。安全性(权限)Deno最重要的特性之一是它对安全性的关注。与Node相反,Deno默认在沙箱中执行代码,这意味着运行时没有权限访问:文件系统网络执行其他脚本环境变量让我们看看权限系统是如何工作的。(async()=>{constencoder=newTextEncoder();constdata=encoder.encode('Helloworld\n');awaitDeno.writeFile('hello.txt',data);awaitDeno.writeFile('hello2.txt',数据);})();此脚本创建两个名为hello.txt和hello2.txt的文本文件,其中包含“Helloworld”消息。该代码正在沙箱中执行,因此它无法访问文件系统。另请注意,我们使用的是Deno命名空间而不是fs模块,就像在Node中一样。Deno命名空间提供了许多基本的辅助函数。如果您使用命名空间,您将失去浏览器兼容性,这将在后面讨论。像这样运行:denorunwrite-hello.ts会提示如下:Denorequestswriteaccessto"/Users/user/folder/hello.txt"。授予?[a/y/n/d(a=allowalways,y=allowonce,n=denyonce,d=denyalways)]我们实际上会被提示两次,因为来自沙箱的每次调用都必须请求许可。当然,如果我们选择allowalways选项,我们只会被询问一次。如果选择拒绝选项,将抛出一个PermissionDenied错误,并且由于我们的代码中没有任何错误处理逻辑,该过程将被终止。如果你用如下命令执行脚本:denorun--allow-writewrite-hello.ts,你会发现没有任何提示,两个文件都已经创建好了。除了文件系统的--allow-write标志外,还有--allow-net、--allow-env和--allow-run标志来启用网络请求、访问环境和运行子进程。模块Deno像浏览器一样通过URL加载模块。很多人一开始在服务器端看到带有URL的import语句时会感到困惑,但它确实有道理——只要你能忍受:import{assertEquals}from"https://deno.land/std/testing/asserts.ts”;你可能会问,通过URL导入包有什么大不了的?答案很简单:通过URL,Deno包可以在没有集中注册的情况下分发,例如npm,许多问题的解释可以在这里找到。通过URL导入代码,我们使包创建者能够在他们认为合适的地方托管他们自己的代码。不需要morepackage.json和node_modules。当启动应用程序时,Deno将下载所有导入的模块并缓存它们。一旦它们被缓存,Deno将不会再次下载它们,直到通过--reload标志特别请求。这里有几个重要的问题:如果网站出现故障怎么办?由于它不是集中式注册表,因此托管该模块的网站可能会出于多种原因被删除。取决于它在开发过程中的状态——或者更糟的是,在生产中是有风险的。如前所述,Deno缓存下载的模块。由于缓存存储在本地磁盘上,Deno的创建者建议在版本控制系统(即git)中检查它并将其保存在存储库中。这样,即使站点出现故障,所有开发人员都可以访问下载的版本。Deno将缓存存储在$DENO_DIR环境变量下指定的目录中。如果你不自己设置这个变量,它会被设置为系统默认的缓存目录。可以在本地存储库中的某处设置$DENO_DIR并将其签入版本控制系统。我必须一直通过URL导入吗?不停地输入URL会很乏味。值得庆幸的是,Deno为我们提供了两种选择来避免这样做。第一个选项是从本地文件重新导出导入的模块,如下所示: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/"}}然后导入它:从“http/server.ts”导入{服务};为此,必须告诉Deno通过包含--importmap标志来导入地图:denorun--importmap=import_map.jsonhello_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的新运行时,是一个有趣的项目,现在已经稳定发展了很长时间。但是在生产环境中它被认为是稳定的之前还有很长的路要走。凭借其分布式方法,它需要将JavaScript生态系统从集中式包注册表(即npm)中解放出来。Dahl说他希望在夏末发布1.0版本,所以如果你对Deno的未来感兴趣,请访问它的GitHub。
