4 月 18 日,Node.js 正式发布了 20 版本,新版中的亮点包括全新的 Node.js 权限模型、同步的 import.meta.resolve、稳定的测试运行器、更新 V8 JavaScript 引擎到 11.3,Ada 到 2.0 等!
下载:https://nodejs.org/en/download/current/
注意,Node.js 20 将在 10 月份进入长期支持(LTS)期,在那之前,它将在接下来的六个月内成为“Current”版本。鼓励探索这个最新版本提供的新功能和好处,并评估它对应用的潜在影响。
Node.js 权限模型是一种实验性机制,用于在执行期间限制对特定资源的访问。在这个第一个包含权限模型的发布版本中,这些功能带有以下能力:
可用权限由 --experimental-permission 标志记录。
使用 --experimental-permission 启动 Node.js 时,将限制访问文件系统、生成进程和使用 node:worker_threads 的能力。
使用 Node.js 的开发人员现在可以更好地控制文件系统访问,因为引入了 --allow-fs-read 和 --allow-fs-write 标志。这些实验性功能允许更细粒度地控制 Node.js 进程可以访问文件系统的哪些部分。
要启用这些标志,可以使用 --experimental-permission 标志和所需的权限。例如,运行以下命令允许对整个文件系统进行读写访问:
node --experimental-permission --allow-fs-read还可以通过将逗号分隔的值传递到标志中来指定文件系统访问的特定路径。例如,以下命令允许对 /tmp/ 文件夹进行写访问:
node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js通配符模式也可以用于一次性允许访问多个文件或文件夹。例如,以下命令允许读取 /home/ 目录中以 test 开头的所有文件和文件夹:
node --experimental-permission --allow-fs-read=/home/test* index.js当启用权限模型时,process 对象的新 permission 属性可以用于在运行时检查是否已授予某个权限。
process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/nodejs/protected-folder'); // true需要注意,这些功能仍处于实验阶段,可能会在 Node.js 的未来版本中发生更改。
通过 loader 提供自定义 ES module 生命周期 hook(--experimental-loader=./foo.mjs)现在在专用线程中运行,与主线程隔离开来。这为 loader 提供了单独的作用域,并确保 loader 和应用代码之间没有交叉污染。
为了与浏览器行为一致,import.meta.resolve() 现在返回同步操作;注意,用户 loader 中的resolve hook 仍然可以是异步操作,如果 loader 作者希望的话,在应用代码中import.meta.resolve仍将返回同步操作。
这些改变是标记 ESM loader 为稳定版前的最后几个未解决问题。一旦社区中没有重大错误报告一段时间,Node.js 团队就打算将 loader 标志、import.meta.resolve和resolve和load hook 标记为稳定版。这使 ESM 的更广泛采用成为可能,因为重要的利益相关者将拥有一个稳定的 API 来构建分析和报告库。
与往常一样,Node.js 中包含了V8引擎的新版本(更新到版本11.3,是 Chromium 113 的一部分),带来了改进的性能和新的语言特性,包括:
Node.js 20 中包含了一个对 test_runner 模块的重要变更。该模块在最近的更新后被标记为稳定版。稳定版 Test Runner 包括编写和运行测试所需的基本组件,包括:
以下是使用 Test Runner 的简单示例:
import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';
mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});随着新成立的 Node.js 性能团队的加入,自上一次主要发布以来,性能再次成为了一个重点。Node.js 20对运行时的基础部分(包括URL、fetch()和EventTarget)进行了许多改进。
初始化EventTarget的成本减半,可以更快地访问使用它的所有子系统。此外,V8 Fast API 调用已被利用,以改进诸如URL.canParse()和定时器等 API 的性能。
Node.js 20包括特定的变化,例如使用 C++ 编写的快速且符合规范的 URL 解析器 Ada 的更新版本2.0。
该项目在过去一年中一直致力于支持单个可执行文件(SEA),并最近实现了初步支持。由于该功能仍处于实验性阶段,团队将继续完善这一方法。在 Node.js 20 中,构建单个可执行文件现在需要从 JSON 配置中注入 Node.js 准备的 Blob,而不是注入原始的JS文件。
例如:sea-config.json
{
"main": "hello.js",
"output": "sea-prep.blob"
}这会将 blob 写入 sea-prep.blob 文件:
node --experimental-sea-config sea-config.json这个 Blob 现在可以注入到二进制文件中。这一改变是为了允许将多个共存资源嵌入到单个可执行文件(Single Executable Apps)中,从而开辟了新的用例。
Node.js 致力于与其他 JavaScript 环境的互操作性。例如,在 Node.js 20 中,Web Crypto API 函数的参数现在按照它们的 WebIDL 定义进行强制转换和验证,就像其他 Web Crypto API 实现一样。这进一步提高了与其他 Web Crypto API 实现的互操作性。
Node.js 具有广泛的平台和架构支持,Node.js 现在包括适用于 ARM64 Windows 的二进制文件,可以在该平台上进行本地执行。MSI、zip/7z包和可执行文件可以从 Node.js 下载站点以及所有其他平台上获得。CI 系统已更新,所有更改现在都在 ARM64 Windows 上进行了全面测试,以防止回归并确保兼容性。
该项目继续在 Node.js 中实现WASI。值得注意的进展是,虽然它是实验性的,但不再需要命令行选项来启用 WASI,这应该使其更容易使用。WASI 团队期待着 preview2,并为未来做了一些更改。其中包括在调用new WASI()时添加版本选项。在20.x版本中,版本是必需的,并且没有默认值。这对于支持新版本的应用非常重要,因为它们不会默认使用可能已过时的版本。然而,这也意味着任何依赖于版本默认值的代码都需要更新以请求特定版本。
需要注意,Node.js 14 将在2023年4月停止维护,因此建议您开始计划升级到 Node.js 18(LTS)或Node.js 20(即将成为LTS)。
Node.js 16(LTS)将在2023年9月停止维护,这是为了与OpenSSL 1.1.1的支持结束时间一致,该时间将于2024年4月结束。
完整更新:https://nodejs.org/en/blog/release/v20.0.0
更新概述:https://nodejs.org/en/blog/announcements/v20-release-announce
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T
我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http: