打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Node.js 全面拥抱 Rust !Neon 要火?
userphoto

2023.10.20 北京

关注

Hello,大家好,我是 Sunday。

这篇文章咱们来聊一点有一定代码难度的内容,不知道大家喜不喜欢。

内容涉及到:

  • Node.js
  • Neon(Node 库)
  • Rust(编程语言)

Node.js 是什么应该不需要说了,咱们从 Neon 开始~~~~

什么是 Neon

Neon 是一个库和工具链,用于将 Rust 嵌入到 Node.js 应用程序和库中。从而用于编写安全、快速的原生 Node.js 模块的 Rust 绑定。

使用 Neon,开发者可以像在 C 或 C++ 中一样创建本机 Node 模块,但不会遇到与不安全系统编程相关的一系列问题。在 Node 中嵌入 Rust 很有用,原因有很多,例如:

  • 性能
  • 线程和并行编程
  • 访问 Rust 的包生态
  • 访问本机操作系统特定的库

Neon 还努力使创建本机模块变得容易,它具有方便的命令行界面和围绕合理的项目约定构建的工作流程。这消除了构建本机 Node 模块的许多常见麻烦。

目前 Neon 在 Github 上通过 Apache-2.0 协议开源,有超过 7.5k 的 star,是一个值得关注的前端开源项目。

开始使用 Neon

接下来将带着大家设置系统以构建 Neon 项目,从一个简单的 Hello, World! 着手。

安装 Node.js

Neon 需要 Node.js 并支持最新的 Node 版本和所有 LTS 版本。如果尚未安装 Node.js,或者没有受支持的版本,请访问 Node.js 网站以获取安装说明。

安装 Rust

Neon 需要 Rust 来进行开发。如果尚未安装 Rust,或者没有受支持的版本,请访问 Rust 网站以获取安装说明。

Rust 可能有其他依赖项,具体取决于目标平台(例如 Windows 上的 Visual Studio)。

开始 Hello World 项目

下面的示例项目是一个返回当前设备中处理器数量的模块。如果不熟悉处理器和 CPU 等系统概念,请不要惊慌!可以使用 num_cpus 来完成所有繁重的工作,并且只返回它给我们的数字。

该教程很短,但它展示了 Neon 的一些强大功能:Rust 的 crate 生态正在快速发展,充满了许多有用且独特的库,通常提供在 npm 中很难找到的底层功能或高性能数据结构。

像 num_cpus 这样的库可能很有用,例如,作为调整 Electron 应用程序中 Web Worker 池大小的提示。

接下来要做的第一件事是创建新的 cpu-count Neon 项目:

npm init neon cpu-count

该命令将询问一系列类似于 npm init 的问题。完成后,该工具将创建一个具有以下布局的 cpu-count 目录:

cpu-count/
├── Cargo.toml
├── README.md
├── package.json
└── src
    └── lib.rs

首先要注意的是 Neon 项目既是 Node 包,又是 Rust crate。Rust 源代码位于 src/ 中,但增强 Rust 的 JavaScript 可以并存。

与调整 Babel 以定位最低 JavaScript 版本类似,Neon 可以通过调整 Cargo.toml 中的 napi 功能来定位 Node 版本。默认情况下,npm init neon 将使用当前安装的 Node 版本。

[dependencies.neon];
features = ['napi-6'];

构建和运行

目前为止,还没有实现任何程序,只是为了看看 npm init neon 生成了一个完整的、最小的 Neon 项目。接下来尝试构建它:

cd cpu-count
npm install

构建过程会生成一些文件:

  • target/:Rust 使用的构建目录
  • index.node:编译后的 Neon 模块

清理构建工件的一个简单方法是运行:

cargo clean

一旦构建了项目,就可以尝试运行它:

node
> require('.').hello()
hello node

添加 Rust 依赖

接下来添加对 num_cpus crate 的 Rust 依赖。在 Cargo.toml 中,添加以下行:

[dependencies];
num_cpus = '1';

这告诉 Rust 的构建工具 Cargo 获取与 semver 兼容的 num_cpus 包的版本 1。(package.json 等效项为“num_cpus”:“^1”。)

函数实现

接下来,可以将 npm init neon 生成的示例 hello 函数替换为实际想要的函数。函数应该返回一个 JavaScript 数字,而不是返回一个字符串。所以将使用 cx.number() 工具函数。

由于 cx.number() 需要 Rust f64(即 64 位浮点数),并且 num_cpus::get() 返回 usize(即指针大小的整数),因此将使用 Rust 的 sas 运算符将整数转换为浮点数:

use neon::prelude::*;

fn get_num_cpus(mut cx: FunctionContext) -> JsResult<JsNumber> {
    Ok(cx.number(num_cpus::get() as f64))
}

关于此代码还有一些需要注意的事项:

  • get_num_cpus 的 cx 参数:这包含有关函数调用的信息,例如参数和 this 的值。JsResult 输出类型:这是一个 Rust 结果类型,指示函数是返回 (Ok) 还是抛出 JavaScript 异常 (Err)。它还跟踪返回句柄的生命周期。
  • cx.number() 函数告诉 JavaScript 垃圾收集器,需要将分配的值保持足够长的时间,以便将其返回给 get_num_cpus 的调用者。

最后,修改 npm init neon 创建的代码,以使用此函数设置模块导出,而不是初始“hello world”函数:

#[neon::main]
fn main(mut cx: ModuleContext) -> NeonResult<()> {
    cx.export_function('get', get_num_cpus)?;
    Ok(())
}

这告诉 Neon 在第一次加载模块时通过创建一个使用上面定义的 get_num_cpus 函数实现的 JavaScript 函数来初始化模块,并将其导出为名为“get”的模块属性。

运行函数

首先需要 build:

npm run build -- --release

该命令将创建一个发布版本, 发布版本的编译时间较长,但最终库的执行速度更快。假设没有犯任何错误,可以在项目目录根目录的 Node 控制台上测试新的 Neon 模块:

node
> const cpuCount = require('.')
> cpuCount.get()
4

  1v1  offer 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Deno 运行时入门教程:Node.js 的替代品
docker 中运行的 jenkins 使用 npm 构建 Node.js 应用
Express / 认识Node.js下的轻量级Web框架
Node.js 调试 GC 以及内存暴涨的分析
【全文】狼叔:如何正确的学习Node.js
node
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服