Deno 1.0:您需要知道的内容

2020-05-07 05:48:31

经过近两年的等待,等待接近尾声。接口已经冻结,正式定于5月13日发布的Deno 1.0已经开始倒计时。

由于其著名的创建者和高瞻远瞩的远见,Deno肯定会是最近记忆中最令人兴奋和最具争议的JavaScript相关版本。

Deno是一个通用的JavaScript/TypeScript编程环境。它汇集了许多最好的开源技术,并在一个小的可执行文件中提供了全面的解决方案。

Deno由Ryan Dahl创建,他最为人所知的是Node.js背后的策划者,它利用了自2009年Node.js发布以来一直可用的JavaScript特性。它还解决了Ryan在他的“我对Node.js感到遗憾的10件事”演讲中谈到的设计缺陷。一些人称其为Node.js的续集,尽管作者本人并没有这样的说法。

与用C++编写的Node.js不同,Deno是用Rust编写的。它构建在Tokio平台之上,与Node.js一样,使用V8引擎执行JavaScript。一个突出的特点是内置了打字稿。虽然它仍然需要编译成JavaScript才能运行,但它是在内部完成的,所以TypeScript对用户的行为就像它受到本机支持一样。

要下载Deno,请按照主页上的说明进行操作。要更新到未来版本,请使用Deno Upgrade。

在本指南中,我们将介绍Deno1.0必须提供的所有杀手级特性,并提供如何将它们与最新语法结合使用的示例。我将在可能的情况下使用TypeScript,但是JavaScript的等价物应该是显而易见的。

我相信等我们结束的时候你会爱上德诺的。本指南将为您提供入门所需的一切信息。

默认情况下,Deno是安全的。相比之下,Node.js可以完全访问您的文件系统和网络。

Deno使用命令行选项显式地允许访问系统的不同部分。最常用的包括:

对读、写和网络使用权限白名单是最佳实践。这些允许您更具体地了解允许Deno访问的内容。例如,要允许Deno在/etc目录中只读文件,请使用:

您可能很快就会厌倦在每次运行应用程序时显式启用权限。要解决此问题,您可以采取以下任一方法。

您可以使用--Allow-All或其快捷方式-A启用所有权限。不建议这样做,因为这样会消除拥有特定权限的安全优势。

创建具有运行该程序所需的最低权限的bash脚本。

这里的缺点是,运行、测试和捆绑等工作可能需要几个它们。

您可以使用GNU tool make通过一组带权限的Deno命令创建一个文件。您也可以使用特定于Deno的版本,Drake。

使用Deno install安装Deno程序,该程序具有执行该程序所需的所有权限。安装后,您可以从$PATH中的任何位置访问该程序。

Deno标准库是由Deno项目维护并保证与Deno一起使用的常用模块的集合。它涵盖了用户在执行常见任务时最常需要的代码,并且松散地基于Go编程语言提供的标准库。

JavaScript一直受到缺乏标准库的困扰。用户被迫一次又一次地重新发明轮子,开发者必须经常在NPM上搜索第三方模块,以解决平台制造商应该提供的常见问题。

由像Reaction这样的库解决复杂问题的第三方包是一件好事,但是对于像UUID生成这样简单的事情,使用官方标准库要好得多。这些小型库可以作为大型库的构建块,从而使开发更快、更少引发焦虑。曾经很受欢迎的图书馆有多少次被遗弃,让用户自己维护或寻找新的图书馆?事实上,10%到20%的常用OSS包没有得到积极维护。

TypeScript是JavaScript,但添加了显式类型。任何有效的JavaScript也都是有效的类型脚本,因此将代码转换为类型脚本是不费力的。只需将扩展名更改为.ts并开始添加类型即可。

要在Deno中使用TypeScript,您无需执行任何操作。如果没有Deno,则必须将TypeScript编译成JavaScript才能运行。Deno在内部为您做到了这一点,使打字稿更易于采用。

对于那些熟悉tyescript的人来说,您将习惯于使用tsconfig.json文件来提供编译器选项。当您使用Deno时,这是可选的,因为它已经有了自己的默认配置。如果您使用自己的tsconfig.json,并且它与Deno冲突,您将收到警告。

如果您和大多数开发人员一样,了解到Deno在默认情况下使用严格模式,您一定会欣喜若狂。除非某些不法分子将其覆盖,否则Deno将合理地警告用户尽可能多的草率编码实践。

创建一个网络标准需要很长时间,一旦它确定下来,忽视它是不明智的。虽然框架来来去去,但Web标准仍将保留。花在学习标准化API上的时间永远不会浪费,因为没有人敢破坏网络;它很可能会使用几十年,甚至可能是您职业生涯的余生。

获取web API提供用于获取资源的接口。浏览器中提供了一个JavaScript fetch()方法。如果您想在Node.js中使用此标准,则需要使用第三方库Node Fetch。在Deno中,它是内置的,工作起来就像浏览器版本一样,开箱即用。

这些都在您的计划的顶级作用域中可用。这意味着如果您避免在deno()名称空间上使用任何方法,您的代码应该与Deno和浏览器都兼容。虽然并不是所有这些Deno API都100%符合其等效的Web规范,但这对前端开发人员来说仍然是一个巨大的奖励。

来自Node.js的Deno的主要突破性变化之一是,Deno使用官方的ECMAScript模块标准,而不是遗留的CommonJS。Node.js直到2019年底才启用13.2.0版的ECMAScript模块,但即使到那时,支持也是半生不熟的,它仍然包括有争议的.mjs文件扩展名。

Deno打破了过去的束缚,将现代网络标准用于其模块系统。该模块使用URL或文件路径引用,并包括必需的文件扩展名。例如:

在任何地方使用文件扩展名都是合乎逻辑的,而且似乎是显而易见的方法。不幸的是,在现实中,事情要比这复杂得多。目前,您可以使用Visual Studio代码扩展来为仅限Deno的项目解决此问题。

对于打字稿的创建者来说,这个问题似乎有争议。在我们最终抛弃CommonJS之前,我看不到一个快速而简单的解决方案。

让我们花点时间向明智而古老的编程之神祈祷。让他们摧毁这些遗留的格式,惩罚那些持有这些格式、损害我们所有人的人。

对于Deno中的包管理工作方式,已经进行了彻底的重新思考。它不依赖于中央存储库,而是分散的。任何人都可以托管软件包,就像任何人可以在Web上托管任何类型的文件一样。

使用像NPM这样的集中式存储库有好处也有坏处,而Deno的这一方面肯定是最有争议的。

不再有集中化的包管理器。您可以直接从Web导入ECMAScript模块。

不再有“神奇的”Node.js模块解析。现在,语法是明确的,这使得推理变得容易得多。

不再有NODE_MODULES目录。取而代之的是,依赖项被下载并隐藏在您的硬盘上,看不见。如果您想刷新缓存并再次下载它们,只需将--reload添加到您的命令。

如果希望与项目代码一起下载依赖项,而不是使用全局缓存,请使用$DENO_DIR环境变量。

与Deno兼容的第三方模块有一个用户区,但是在编写本文时导航是非常基本的。例如,没有按受欢迎程度或下载次数进行搜索的功能。我预测用户区域将会扩大,或者会为贡献的模块创建其他替代站点。

尽管没有对Node.js向后兼容的官方支持,但是仍然有很多库和应用程序可以很好地与Deno一起工作。有些是开箱即用的,而另一些则需要一点努力才能开始工作。

这可能不起作用,但是尝试一下NodeJS标准库的官方兼容层。

德诺仍然是非常新的,周围的生态系统还在形成中。在撰写本文时,我推荐Pika作为在标准库和用户库之后开始寻找兼容模块的第一个地方。

Pika背后的开发人员已经与Deno合作,通过称为X-TypeScript-Types的ECMAScript模块提供Typescript类型。要使用Pika查找包,请执行以下操作:

但是,Preact是兼容的。单击该选项,然后单击导入。您应该看到以下内容:

JavaScript生态系统的大部分仍然围绕着使用Package.json。它已经膨胀到包括许多职责,例如:

{";名称";:";项目名称";,//元数据";版本";:";1.0.0";,//元数据";说明";:";我的应用程序";,//元数据";类型";:";模块";,//模块功能";主";:";src/mod.ts";,//模块功能";脚本";:{";build";:";npm run_copy-build-files&;&;ROLLUP-c";,";build-watch";:";npm run_copy-build-files&;&;ROLLUP-CW";},//脚本功能";License";GPL-3.0";,//METADATA";devDependency";:{";@ROLLUP/Plugin-TypeScript";:";^3.1.1";,";ROLLUP";:";^1.32.1";,";TypeScript";:";^3.8.3";},//版本控制和分类功能";:{";tPlant";:";^2.3.3";}//版本控制和分类功能}。

随着时间的推移,所有这些实践都汇聚在一起,现在代表了JavaScript生态系统的标准工作方式。很容易忘记,这不是官方标准;它只是在这些功能成为必需品时虚构出来的。既然JavaScript已经迎头赶上,是时候进行重大的重新思考了。

Deno还不能取代Package.json的所有功能,但目前有一些解决方案。

包版本控制有一个Deno约定,那就是使用一个名为dess.ts的特殊文件。在内部,依赖项被重新导出。这允许应用程序中的不同模块都引用相同的源。

它不是告诉NPM下载模块的哪个版本,而是在diss.ts中的URL中引用。

如果您想要更新任何模块,您可以更改diss.ts中的URL。例如,将@v0.39.0替换为@v0.41.0,则新版本将在任何地方使用。如果您将https://deno.land/[email protected]/fmt/colors.ts直接导入到每个模块中,则必须费力地检查整个应用程序并更改每个引用。

假设您之前下载的模块不可能在之后被篡改,这将是一个安全风险。这就是为什么还有一个创建锁文件的选项。这将确保新下载的模块与您最初下载的模块相同。

JSDoc发布于1999年,也就是21年前。它现在是记录JavaScript和TypeScript的最常用和最受支持的方式。虽然不是官方的Web标准,但它是Package.json中所有元数据的完美替代品。

/*@file管理小部件的配置设置*@作者Lucio Fulci*@版权所有2020 Intervision*@License GPL-3.0*@1.0版*。

Deno开箱即支持JSDoc,并将其用于内置文档系统。虽然它当前不使用上面的元数据,但命令Deno doc读取函数的描述及其参数的描述。

/*返回值(TRUE?)。如果要包含规则**@param key当前键正在检查的规则的名称*@param Val正在检查的规则的当前值**/

Deno doc mod.tsfunction rulesToRemove(key:string,val:any[]):如果要包含规则,则布尔值返回值。

当您的程序联机承载时,请使用联机文档查看器更详细地查看它。

这是对前端开发者影响最大的领域。JavaScript工具的当前状态是一片混乱。当您添加TypeScript工具时,复杂性甚至会进一步增加。

JavaScript的最大优点之一是它不需要编译,因此可以立即在浏览器中运行。这使得立即获得关于您的编码的反馈非常容易。入门门槛非常低;编写软件所需的只是一个文本编辑器和一个浏览器。

不幸的是,这种简单性和可访问性已经被过度工具的狂热所破坏。它把JavaScript开发变成了复杂性的噩梦。我甚至看过专门配置webpack的整个课程。这种胡言乱语需要结束了--生命太短暂了。

工具的混乱已经发展到了这样一个地步,许多开发人员急于回到实际编写代码的工作中,而不是玩弄配置文件,为他们应该采用多个相互竞争的标准中的哪一个而苦恼。一个新兴的项目解决了这个问题,那就是Facebook的罗马。在撰写本文时,这还处于初级阶段。虽然它可能被证明是有益的,但Deno有可能成为一个更实质性的解决方案。

Deno本身就是一个完整的生态系统,包括运行时和自己的模块/包管理系统。这给了它更大的空间来内置所有自己的工具。让我们研究一下1.0中提供了哪些工具,以及如何使用它来减少对第三方库的依赖并简化开发。

目前还不可能在Deno替换整个前端构建的管道,但用不了多久就可以了。

使用Deno.test()函数将测试运行器构建到Deno的核心中。断言库在标准库中提供。其中包括您喜欢的所有内容,如assertEquals()和assertStrictEq(),以及一些不太常用的断言,如assertThrowsAsync()。

在编写本文时,还没有测试覆盖特性,需要使用第三方工具(如Denon)设置监视模式。

要查看所有的测试运行器选项,请使用Deno test--help。虽然它们相当有限,但在Mocha这样的程序中,您可能会熟悉许多功能。例如,--Failfast将在遇到第一个错误时停止,而--Filter可用于筛选要运行的测试。

最基本的语法是Deno test。这将运行工作目录中以_test或.test结尾的所有文件,扩展名为.js、.ts、.jsx或.tsx(例如,example_test.ts)。

从";https://deno.land/std/testing/asserts.ts";;Deno.test({导入{assertEquals}名称:";测试示例";,fn():void{assertEquals(";World";,";World";);assertEquals({hello:";world";},{hello:";world";});

如果您的代码使用DOM,则需要为您自己的tsconfig.json提供lib:[";dom";,";esnext";]。我们将在下面详细介绍。

格式是由dprint提供的,这是一种复制所有已建立的更漂亮的2.0规则的漂亮的快速替代方案。

要格式化一个或多个文件,请使用Deno fmt<;files>;或Visual Studio代码扩展(稍后详细介绍)。

Deno可以使用Deno包从命令行创建一个简单的包,但是它还公开了一个内部编译器API,这样用户就可以创建他们自己的输出,可以为前端使用定制一些东西。此接口当前标记为不稳定,因此需要使用--unstant标志。

虽然Deno有一些与Web兼容的API,但它们并不完整。如果您想编译任何引用DOM的前端文字脚本,则需要在编译或捆绑时告诉Deno这些类型。您可以使用编译器API选项lib。

index.html<;!DOCTYPE html>;<;html lang=";en";>;<;head>;<;meta charset=";UTF-8";/>;<;meta name=";viewport";content=";width=device-width,initial-scale=1.0";/>;<;<;h1 id=";greeter";>;Replace me<;/h1>;<;/body>;<;/html>;test-dom.tslet greeter:HTMLElement|null=document.getElementById(";greeter";)!;//请原谅非Null断言Operatorgreeter.innerText=";Hello world!,未定义,{lib:[";dom";,";esnext";],//include";deno.ns";对于Deno命名空间outDir:";dist";,});如果(错误){console.log(";出现错误:";);console.error(Error);}否则{console.log(发出);//通常我们会写入文件}。

在上面的示例中,我们编译了引用DOM的test-dom.ts文件。在Deno.Compile()中使用lib选项会覆盖Deno使用的任何lib默认选项,因此需要重新添加esnext,还需要添加deno.ns(可选)才能使用Deno名称空间。

这一切仍有些实验性质,但我希望捆绑命令会发展到能够处理树摇晃之类的事情,并且行为更像Rollup.js。

Deno具有内置调试,但在编写本文时,Visual Studio代码扩展不支持它。要进行调试,请手动使用以下命令。

在Chrome或Chromium中打开Chrome://检查。您将看到与下图类似的屏幕。

Deno通过Deno.watchFS()API使用Rust Notify库内置了文件监视功能。Deno喜欢用其API在幕后提供繁重的工作,让用户随心所欲地实现他们的代码。您需要创建自己的实现或使用第三方模块,而不是提供--watch标志。

制作您自己的文件观察器的唯一重要方面是去抖动。API可以快速连续触发多个事件,您可能不想多次运行操作。用户Caesar2011使用Date.now()解决了23行打字稿中的问题。

还有一个更高级的Deno文件查看解决方案,称为Denon。这就相当于节点的作用。如果您想要查看工作区是否有更改并重新运行测试,只需执行以下操作:

到目前为止最好的扩展是AXETROY的,可以从Visual Studio Market place获得。安装后,在您的项目文件夹中创建一个.vscode/settings.json文件,并逐个项目启用该扩展名。

现在,您将可以访问完全的智能感知支持以及获得编码所需的一切。

事实证明,JavaScript生态系统的快速变化是喜忧参半。从积极的一面来看,可用的高质量工具从未像现在这样多。消极的一面是,围绕着不断向我们抛来的新框架和库的无休止的炮轰,有一种普遍的愤世嫉俗和疲倦的感觉。

Deno成功地消除了JavaScript开发中的许多缺点。下面只是几个例子。

通过使用网络标准,Deno使其API面向未来。这给了开发人员信心,他们不会浪费时间去学习即将过时的东西。

除了JavaScript之外,使用TypeScript可以消除编译负担,并允许更紧密的集成

内置工具意味着不需要浪费时间来搜索。

..