Deno 1.7:独立二进制文件大小减少60%

2021-01-23 16:05:24

<-其他新闻GitHub今天我们发布了Deno 1.7.0。此版本包含许多新功能,一些稳定性以及对现有API和工具的一些重大改进。

如果您已经安装了Deno,则可以通过运行deno upgrade升级到1.7。如果是第一次安装Deno,则可以使用下面列出的方法之一:

在继续阅读之前,请考虑填写Deno调查。即使您从未使用过Deno!仅需10分钟,将极大地帮助我们指导我们的发展。

在上一发行版中,我们增加了将为Deno编写的应用程序编译成独立的自包含可执行文件的功能。当我们最初在1.6.0中发布deno编译时,我们有了要解决的痛点和功能列表。此版本解决了其中三个问题。

我们很高兴地报告,在1.7 deno编译中,现在可以从任何稳定支持的体系结构(Windows x64,MacOS x64和Linux x64)交叉编译到任何其他稳定支持的体系结构。这意味着您现在可以从一台Linux CI计算机上为Windows和MacOS创建二进制文件。

此外,deno编译现在生成的二进制文件比Deno 1.6生成的二进制文件小40-60%。要尝试此功能,请在编译应用程序时使用--lite标志。这告诉deno编译使用仅精简运行时的Deno二进制文件,而不是以前使用的完整Deno二进制文件。

在下面,您可以看到一个简单的hello world程序示例,该程序已从macOS为Linux交叉编译,然后在Linux上运行。

最后,deno编译现在可以创建具有内置CA证书,自定义V8标志,锁定Deno权限和预填充命令行参数的二进制文件。这应该使deno编译对更多人有用。

这是一个示例,其中我们从std / http / file_server模块创建一个可执行文件,该可执行文件侦听端口8080(而不是默认的4507)并启用了CORS。正在运行的代码具有的权限也被锁定(只能从当前工作目录中读取,并且只能在端口8080上侦听)。

数据URL是用于执行即时生成的代码的有用工具。在此版本中,我们增加了对导入(静态和动态)以及inWeb Workers中的数据URL的支持。所有现代浏览器和NodeJS已经支持此功能。

上面的代码可以表示为以下数据URL:" data:application / typescript; base64,ZXhwb3J0IGNvbnN0IGEgPSAiYSI7CgpleHBvcnQgZW51bSBBIHsKICBBLAogIEIsCiAgQywKfQo ="此URL由baseapplication编码和内容创建,并附加到: base64 ,。对于JavaScript,您可以将内容附加到data:application / javascript; base64,。

此版本添加了新的Deno.resolveDns API。它可用于从DNS解析器查询DNS记录。目前仅支持UDP / TCP上的DNS(不支持HTTPS上的DNS或TLS上的DNS)。可以指定要使用的自定义名称服务器(例如Cloudflare的1.1.1.1或Google的8.8.8.8),但是默认情况下,我们将使用系统解析器(例如Linux上的/etc/resolv.conf)。

该API当前支持A,AAAA,ANAME,CNAME,MX,PTR,SRV和TXT记录。响应作为结构化数据返回。

这是一个示例供您尝试。该示例是unix上的dig工具的非常简单的版本。您可以将域名作为第一个参数传递给它,它将通过stdout返回该域的A记录。

我们已经用一个改进的函数(Deno.emit)代替了与Deno的内置TypeScript编译器进行交互的三个不稳定的API(Deno.transpileOnly,Deno.bundle和Deno.compile)。您可以在手册的TypeScript部分中阅读有关如何使用Deno.emit进行捆绑,转译等的全部信息。

deno fmt现在支持格式化降价文件,包括格式化这些文件中的JavaScript和TypeScript代码块。

另外,添加了一个新的--ext标志,以便在从stdin(deno fmt-)格式化代码时指定文件扩展名。可用的文件扩展名是js,jsx,ts,tsx和md。请记住,格式化磁盘上的文件时此标志无效。

此版本已花费大量精力使我们各种Web API(文本编码,URL,流和WASM)的实现与这些API的各种规范保持一致。这主要是内部错误修复,但在一种情况下,尤其是用户面对的更改非常严重。

以前,我们是根据2020年3月左右的规范实现Streams API的。在此规范的修订版中,ReadableStream类具有getIterator方法,该方法可用于从ReadableStream获取异步迭代器。在最新版本中,ReadableStream类是模拟迭代器,并且已删除getIterator方法。

为了更接近规范,我们想删除ReadableStream上的getIterator方法。为了让您有时间更新此deprecatedAPI的用法,我们已将该方法标记为此版本(1.7)已弃用。我们计划在2021年3月2日删除将于6周内发布的Deno 1.8中不推荐使用的方法。

在0.83.0或更低版本的某些std模块(特别是std / async和std / http)中使用了此不推荐使用的API。请升级到标准版本0.84.0。在您自己的代码中,删除所有.getIterator()调用,如下所示:

默认情况下,除非用户在CLI上传递--allow- *标志,否则Deno将在完整的沙箱中执行用户代码。不幸的是,这些权限不能限制在特定的模块上。许多用户都要求使用此功能,我们很高兴地宣布在此方面已经取得了一些进展。从Deno 1.7开始,用户可以使用自定义权限集生成Web Worker,从而可以在Deno进程中运行不受信任的代码。

重要的是要知道授予工作人员的权限必须是过程权限的子集,即。如果该进程在运行时没有" read"权限,然后尝试使用" read"创建工作程序权限将导致PermissionDeniederror。

注意:此功能与浏览器不兼容。浏览器将忽略worker选项包中的denofield。

这是一个示例供您尝试。它将产生具有读取权限的工作程序,然后该工作程序将尝试读取文件./log.txt并将其发送回客户端。

您也可以尝试在没有--allow-read许可的情况下运行它。这将导致引发错误,因为您正尝试升级权限:

Deno没有" document"的不幸影响在一个HTML页面中运行它的JavaScript,是因为Deno从来没有一个确定脚本来源的好方法。这对于window.localstorage之类的API很重要,您与之交互的数据取决于您所在的页面(文档)。 LocalStorage API是使用起源的许多API之一,但是我们要尽快添加它。

这对于同构代码(在客户端和服务器上运行的代码)(例如在React组件的服务器端渲染期间)也非常有用,因为它们现在可以同时使用globalThis.location和相对提取。

在此版本中,我们通过添加--locationflag来解决此问题,该标志可让您设置" document"脚本的位置。该位置可以是任何http或https URL(不需要存在)。如果未设置此标志,则window.location仍将存在,但将引发访问。提取和新Worker中的相对URL相同。如果设置了它们,它们将相对于位置,否则它们将抛出。在工作程序中,位置始终将设置为工作程序的入口点脚本。

* cli的API是稳定的。将来,当std变得稳定时,我们可能

我们知道某些模块使用window.location来确定它们是否正在浏览器中运行。这是不好的做法。使用typeof Deno!==" undefined"确定您是否在Deno中运行,并使用typeof文档!==" undefined"确定DOM是否可用。

除了对获取中的流式响应正文的支持之外,我们现在还支持流式请求正文。这可用于将大文件上传到Web服务器,而无需先将其缓冲在内存中。可以绕过ReadableStream到获取选项中的body字段来完成此操作。

当前,仅支持提取上传流的运行时是Chromium和Deno。这两种实现都有一个局限性,即在请求主体已完全发送之前,您无法开始接收响应主体。这不是Fetch规范中的限制,而是实现中的限制,并将在以后解决。

有关获取上传流的更多示例和用例,请参见Jake Archibald关于此事的文章:https://web.dev/fetch-upload-streaming/。

某些服务器要求用户重用现有的TLS会话(例如FTP)。直到现在,Deno还无法重用TLS会话,而是会为每个连接重新建立新的TLS会话。在此版本中,我们添加了进程全局TLS会话缓存,该缓存将允许在连接之间重用现有的TLS会话。

会话缓存是内存中的缓存,大小为1024个会话。会话过多会导致其他人被逐出。尽力使用TLS会话缓存。

Deno.shutdown()和Conn#closeWrite()在此版本中已稳定。这些功能用于通过通知另一边您已完成发送数据的方式来正常关闭连接。与该API的不稳定版本不同,shutdown()方法不再具有模式参数。只能关闭套接字的写端。

同样在此版本中,不稳定的Deno.createHttpClient API的选项包的签名也已更改。该API可用于自定义执行获取的方式。现在,您不能指定caFile(包含自定义CA证书的文件的路径),而是指定caData。这意味着您现在可以在内存证书中使用Deno.createHttpClient。

净权限的不稳定的Deno.permission API也已发生了轻微变化。现在,我们不再使用url参数,而是使用host来匹配--allow-net标志支持的内容。

deno test --coverage现在可以报告部分覆盖的行,以及收集从测试生成的Deno子流程的覆盖率。我们将继续改进覆盖范围的功能,包括即将发布的版本中的其他报告格式。

用户以前曾报告过许多有关Deno API中半随机挂起的问题。经过彻底的调查后,确定它们都是由与tokio运行时的交互引起的。由于tokio 1.0中API的更改,我们不得不重新架构deno_core的重要部分以适应这些更改。实际上,ResourceTable会从头开始重写保存Rust分配的对象(例如,文件句柄,TCP连接)的结构,从而增加了对不同的队列进行排队的能力。代理资源;这意味着现在保证对同一套接字或文件的写入以与开始时相同的顺序进行,因此读取也是如此。

如上所述,我们在此版本上花费了大量时间,以使我们的Web API与各种API规范保持一致。通过将Web平台测试套件集成到我们的测试中,这极大地帮助了我们。 Web平台测试是所有浏览器供应商用来测试与Web平台规范的兼容性的测试套件。我们已经启用了成千上万的测试,但是,这项工作还远远没有完成(仍有数千个Web平台测试需要启用)。如果您认为可以帮助您解决此问题,请查看以下问题:https://github.com/denoland/deno/issues/9001。

如果您填写了Deno调查,我们将不胜感激,它仅需10分钟,将极大地帮助我们进一步发展Deno。