原文地址:https://blog.logrocket.com/exploring-node–js–v20-features/,翻译:一川,Node.js的每个版本都带有令人兴奋的新功能,v20也不例外。Node.js v20 于 2023 年 4 月 18 日发布。此版本附带了更新的功能,旨在通过使用稳定的内置测试运行程序减少依赖性,使 Node.js 比以往任何时候都更安全。Node.js v20还提供了创建单个可执行应用程序的功能,这些应用程序可以在Windows,macOS和Linux上执行,而无需在其系统上安装Node.js。,在本教程中,我们将探讨 Node.js v20 中提供的一些功能。您需要在计算机上安装 Node.js v20 或更高版本,并熟悉创建和运行 Node.js 程序才能遵循。,Node.js v20 中引入的主要功能之一是实验性的权限模型,旨在使 Node.js 更安全。长期以来,Node.js没有权限系统。任何应用程序都可以与文件系统交互,甚至可以在用户计算机上生成进程。,这为攻击打开了大门,第三方软件包在未经用户同意的情况下访问了用户的计算机资源。为了降低风险,权限模型限制Node.js应用程序访问文件系统、创建工作线程和生成子进程。,启用权限模型后,用户可以运行应用程序,而不必担心恶意第三方包可以访问机密文件、删除或加密文件,甚至运行有害程序。权限模型还允许用户在运行应用程序或运行时向 Node.js 应用授予特定权限。,让我们看看如何使用权限模型。使用您选择的名称创建一个目录:,创建一个 package.json 文件:,添加到 type:module 支持 ESM 模块:,然后,创建包含以下内容的: data.txt,接下来,创建一个 index.js 文件并添加以下代码来读取 data.txt 该文件:,在这里,定义一个readFileContents函数,该函数接受 并从 filename 文件系统读取文件。在函数中,调用readFile() fs模块的方法读取data.txt文件内容,然后将它们记录在控制台中。,现在,使用 node 以下命令运行文件:,我们将在控制台中看到如下所示的输出:,若要启用实验性权限模型,请使用以下–experimental-permission标志运行文件:,这次我们收到如下所示的错误:,错误消息让我们知道我们没有读取文件的权限。权限模型限制了文件系统访问。如果尝试生成工作线程和子进程,也会收到一条错误消息。,要授予对文件或目录的读/写访问权限,可以使用该 –allow-fs-read 标志。以下是可以使用的一些选项:,还可以使用标志 –allow-fs-write 授予写入访问权限。它还接受通配符、目录路径或文件名,如上所述。如前所述,权限模型还阻止 Node.js 程序创建子进程。要授予权限,我们需要传递: –allow-child-process,为了允许创建工作线程来并行执行任务,可以改用该 –allow-worker 标志:,因此,回到前面的示例,授予Node.js读取data.txt.执行此操作的更灵活的方法是提供 驻data.txt留的完整目录路径,如下所示:,现在,程序可以毫无问题地读取文件,尽管它提供了警告:,启用权限模型后,可能不知道应用程序是否具有写入或读取文件系统的权限。为了防止运行时 ERR_ACCESS_DENIED 错误,权限模型允许在运行时检查权限。,要检查是否具有读取权限,可以执行以下操作:,或者,可以检查目录的权限。在下面的代码中,检查是否对给定目录具有写入权限:,有了这个,我们现在就可以创建安全的应用程序并保护我们机器的资源在未经我们同意的情况下不被访问。若要探索权限模型中的更多功能,请访问文档。,在Node.js v18发布之前,Node.js 中的所有测试运行器都是第三方软件包,例如 Jest 和 Mocha。虽然它们为 Node.js 社区提供了良好的服务,但第三方库可能是不可预测的。,首先,Jest有一个错误,它会破坏 instanceof 控制器,产生误报。解决方案是安装另一个第三方软件包。内置工具倾向于按预期工作并且更加标准化,如 Python 或 Go,它们都附带内置测试运行器。,甚至像Deno和 Bun 这样的更新的 JavaScript 运行时也带有测试运行器。Node.js 一直被抛在后面,直到Node.js v18发布,它附带了一个实验性测试运行器。现在,随着 Node.js v20 版本的发布,测试运行程序是稳定的,可以在生产中使用。以下是测试运行程序中提供的一些功能:,让我们详细探讨测试运行程序。首先, calculator.js 使用以下代码创建一个:,之后,创建一个 test 目录中的文件目录 calculator_test.js 。在文件中,添加以下代码以使用内置测试运行程序测试函数:,在上面的代码中,我们从 导入 describe node:test / it 关键字,如果您使用过 Jest,应该很熟悉。我们也 assert 从 . node:assert/strict 然后,我们测试 divide() 和 add() 函数是否按预期工作。按如下方式运行测试:,运行测试将生成与以下内容匹配的输出:,当我们运行测试时,内置运行器会搜索所有后缀为 .js 、 .cjs 的JavaScript测试文件,前提是 .mjs :,我们还可以在运行时 node –test 提供包含测试的目录。如果我们想跳过一些测试,我们需要提供该 skip: true 选项作为 it 块的第二个参数:,当重新运行测试时,将看到只有一个测试运行:,Node.js v20 还附带了一个实验性监视模式,一旦检测到测试文件中的更改,它就可以自动运行测试。我们需要传递 –watch 标志并提供目录以在监视模式下运行测试:,如果更改文件,Node.js 将自动选取更改并重新运行测试。,只是触及了测试运行程序可以做什么的表面。查看文档以继续探索它。,Node.js建立在高性能的V8 JavaScript引擎之上,该引擎也为Google Chrome提供支持。它实现了更新的 ECMAScript 特性。当新版本的 Node.js 发布时,它附带了最新版本的 V8 JavaScript 引擎。最新版本是V8 v11.3,它具有一些显着的功能,包括:,让我们探索用于调整 ArrayBuffer、SharedArrayBuffer 最令人兴奋的新功能之一是调整 ArrayBuffer 。在 Node.js v20 之前,在创建缓冲区后调整缓冲区大小以容纳更多数据是不可能的。使用 Node.js 20,我们可以使用该resize()方法调整它的大小,如以下示例所示:,首先,创建一个大小为字节的缓冲区,其缓冲区限制为 10 使用该 maxByteLength 属性指定的 4 字节数。有了缓冲区限制,如果我们要将其大小调整为超过 10 字节,它将失败。如果需要更多字节,可以将 修改 maxByteLength 为所需的值。,接下来,我们检查缓冲区是否可调整大小,然后调用该方法 resize() 将缓冲区的大小从字节调整 4 为 8 字节。最后,我们记录缓冲区大小。像这样运行文件:,下面是输出:,缓冲区的大小已成功从字节调整 4 为 8 字节。也有 SharedArrayBuffer 相同的限制 ArrayBuffers ,但现在我们可以使用以下 grow() 方法将其增长到我们选择的大小:,输出如下所示:,在示例中,我们检查 是否 buffer 可增长。如果它的计算结果为 true,我们调用该方法 grow() 以增加 SharedArrayBuffer 8 字节数。与 ArrayBuffer类似,我们不应该将其增长到 maxByteLength。,目录通常被认为是树结构,因为它们包含子目录,子目录也包含子目录。从历史上看, fs 该模块readdir()的方法仅限于列出给定目录的文件内容,并且不会递归地遍历子目录并列出其内容。因此,开发人员转向第三方库,如readdirp,recursive-readdir,klaw和fs-readdir-recursive。,Node.js v20 为 和 方法添加了一个recursive选项,允许 readdirSync 方法递归读取给定目录和 readdir 子目录。,假设有一个类似于以下内容的目录结构:,可以添加 recursive: true 列出所有文件的选项,包括子目录中的文件,如下所示:,运行文件后,输出将匹配以下内容:,如果不将选项传递给 readdir() 该方法,输出将 recursive 如下所示:,虽然这是一个次要的补充,但它可以帮助我们减少项目中的依赖关系。,我们将在本文中探讨的最后一个功能是Node.js v20中引入的实验性单可执行应用程序 (SEA)。它允许我们将应用程序捆绑到Windows上的单个可执行文件.exe或可以在macOS / Linux上运行的二进制文件中,而无需用户在其系统上安装Node.js。在撰写本文时,它仅支持使用commons模块系统的脚本。,让我们创建一个二进制文件。本节中的说明仅适用于 Linux。在macOS和Windows上,某些步骤会有所不同,因此最好查阅文档。首先,创建一个不同的目录来包含代码并移动到其中:,在此之后,创建一个 list_items.js 包含以下内容的文件:,接下来,创建一个配置文件 sea-config.json ,用于创建可注入可执行文件的 Blob:,生成 Blob,如下所示:,复制可执行文件并为其指定一个适合您的名称:,将 Blob 注入二进制文件:,像这样在系统上运行二进制文件:,这负责创建 SEA。如果您想了解如何为 macOS 或 Windows 创建二进制文件,请查看文档[https://nodejs.org/api/single-executable-applications.html]。,在这篇文章中,我们探讨了 Node.js v20 中引入的一些功能。首先,我们研究了如何使用实验性权限模型。然后,我们了解了如何使用现在稳定的内置测试运行程序。从那里,我们了解了 V8 JavaScript 引擎中可用的新功能。,之后,我们探索了如何递归读取目录,最后,我们使用实验性的单一可执行应用程序(SEA)功能创建了一个二进制文件,该功能允许用户在不安装Node.js的情况下运行Node.js程序。
© 版权声明
文章版权归作者所有,未经允许请勿转载。