写点什么

Neon 支持在 Node App 中嵌入 Rust 代码

  • 2020-10-29
  • 本文字数:967 字

    阅读完需:约 3 分钟

Neon支持在Node App中嵌入Rust代码

Neon 是一个可以使用 Rust 开发原生 Node 模块的库和工具链,类似于使用 C 和 C++所实现的功能,它还利用了 Rust 安全方面的好处。


Neon 致力于让 Node.js 模块的创建变得简单明了。在安装了 Neon 和 Rust 工具链后,你就可以使用 neon new 来创建一个 Node 模块骨架,其中包含了一个 Cargo.toml 文件和一个 Rust 文件(一个示例 hello 函数):


<project-name>/├── .git ignore├── README.md├── lib/│   └── index.js├── native/│   ├── Cargo.toml│   └── src/│       └── lib.rs└── package.json
复制代码


你可以在 Cargo.toml 中添加所需的 Rust 依赖项,并按照你喜欢的方式布局代码。你可以通过两个步骤导出 Rust 函数,然后在 Node 程序中使用它。首先是注册函数:


register_module!(mut m, {    m.export_function("myFunction", thread_count)});
复制代码


然后,在 lib/index.js 中导出:


const addon = require('../native');module.exports = addon.myFunction;
复制代码


准备好代码后,你就可以构建 Node 模块:


neon build --release
复制代码


虽然这看起来很简单,但你无论如何都应该特别注意在 Node 环境中表现得像个好公民。特别是你导出的任何一个 Rust 函数都应该是特定类型的:


fn add1(mut cx: FunctionContext) -> JsResult<JsNumber> {...}
复制代码


这里,可以通过 FunctionContext 访问 Node 调用者环境,包括它的 arguments 列表。类似地,导出的函数应该返回一个 JsResult,这是一个指定了函数返回给定类型或抛出 JavaScript 异常的可选类型。例如,你可以使用以下语法访问特定参数:


let x = cx.argument::<JsNumber>(0)?.value();
复制代码


要从导出的函数返回值,应该将其转换为预期值。例如,如果你的函数返回一个数字,在返回时你需要使用 Rust 的 as f64 转换操作符对其进行转换:


Ok(cx.number(num_cpus::get() as f64))
复制代码


构建原生 Node 模块的一个好处是可以执行异步后台任务。Neon 使用 N-API 的微任务API来实现这个目标,并依赖 JavaScript 端的回调和 Promise 来控制异步任务的执行。


Neon 也可以用于 Electron App。目前这需要使用一个中间工具 electron-build-env,用于构建 Electron App 所需的 Neon 依赖项。Neon 团队正在开发electron-rebuild,这个工具将简化这一过程,可以像使用其他依赖项那样使用 Neon 依赖项。


原文链接


Neon Enables Embedding Rust Code in Node.js Apps


2020-10-29 09:002793

评论 1 条评论

发布
用户头像
牛逼
2020-10-29 10:03
回复
没有更多了
发现更多内容

分享一些常用的开源博客社区网站

兮动人

博客 开源社区

7月征文活动结果出炉,快来看看有没有你

InfoQ写作社区官方

热门活动 年中技术盘点

火山引擎AB测试:广告实验深度打通巨量引擎,高效测试广告素材

字节跳动数据平台

大数据 A/B测试 对比试验 企业号 7 月 PK 榜 数字化增长

零信任体系化能力建设(1):身份可信与访问管理

权说安全

MYSQL中JSON类型介绍 | 京东物流技术团队

京东科技开发者

json MySQL 数据库 企业号 7 月 PK 榜

Java高级特性——反射

java易二三

Java 编程 计算机

TypeScript 玩转类型操作之字符串处理能力

小乌龟快跑

typescript 面试 前端

细数不懂Spring底层原理带来的伤与痛

java易二三

spring 程序员 Spring Boot 计算机 底层原理

解析游戏陪练app源码的开发与意义

山东布谷网络科技

游戏 开源代码 APP软件开发

【实践篇】最全的【DDD领域建模】小白学习手册(文末附资料) | 京东云技术团队

京东科技开发者

架构 DDD 领域建模 企业号 7 月 PK 榜

竞速榜实时离线对数方案演进介绍 | 京东云技术团队

京东科技开发者

实时数据 企业号 7 月 PK 榜 竞速榜 离线数据

2023 云原生编程挑战赛火热报名中!导师解析 Serverless 冷启动赛题

阿里巴巴云原生

阿里云 Serverless 云原生

如何为Spring和Mybatis增加可逆计算支持

canonical

Spring Boot mybatis 低代码 可逆计算 Nop平台

Android 架构模式如何选择

vivo互联网技术

mvc Compose MVVM 解耦 MVI

javascript运算符与流程控制

timerring

JavaScript

解析架构设计:构建可靠、高效的软件系统

前端连环话

前端架构 架构设计 前端工程化 技术 优化体系

在 Go 语言单元测试中如何解决 MySQL 存储依赖问题

江湖十年

golang Web 后端 单元测试 测试 单元测试

企业号 8 月 PK 榜,火热开启!

InfoQ写作社区官方

热门活动 企业号 8 月 PK 榜

未来前端框架将持续推进组件化开发

没有用户名丶

Spring AOP 中的代理对象是怎么创建出来的?

江南一点雨

Java spring

【华秋干货铺】一文轻松搞定PCB叠层和阻抗设计

华秋电子

RLHF 技术:如何能更有效?又有何局限性?

Baihai IDP

人工智能 强化学习 白海科技 RLHF 大语言模型

直播平台源码开发,信息收发功能搭建

山东布谷科技

软件开发 直播 源码搭建 消息发送 直播平台源码

特性快闪:使用 Databend 玩转 Iceberg

Databend

这次是运行在 Intel AIxBoard™ 开发板上的 TDengine 预测“未来”

爱倒腾的程序员

飞桨AI Studio可以玩多模态了?MiniGPT4实战演练!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

面试官:说出 Java 中的 7 种重试机制

java易二三

编程 程序员 面试 计算机

你不知道的ES2023 | 京东云技术团队

京东科技开发者

JavaScript ecmascript 前端 ECMAScript 6 企业号 7 月 PK 榜

Neon支持在Node App中嵌入Rust代码_大前端_Sergio De Simone_InfoQ精选文章