时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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:002907

评论 1 条评论

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

活动 | GreatSQL社区亮相2023 DTC 分享开源技术成果实践

GreatSQL

有限资源下如何实现最高效的数据处理?四个“智慧城市”项目寻找“最优解”

TDengine

tdengine 物联网 时序数据库 智慧城市 数据优化

华为云智能编程进高校,解读行业发展新趋势

科技说

毫末顾维灏:中国首个自动驾驶数据智能体系MANA将以产品服务方式对外合作开放

科技大数据

高效复制:在Linux中并发执行相同任务,各自生成日志

小毛驴的烂笔头

实力爆表,日日新成为AI领航者

柒号华仔

人工智能 AIGC 日日新 商汤

得帆云DeFusion融合集成iPaaS平台领先行业,打造先锋集成产品

得帆信息

打破信息孤岛 数据集成 集成平台 数据集成平台 ipaas

WWDC 2023会有哪些内容?WWDC 2023抢先看

Rose

WWDC 2023 Apple发布会

全能网页视频下载工具Downie使用教程

Rose

downie 4 Mac 视频下载工具 Downie使用教程 如何下载网页视频

青云职上 群英有为 | 助力区域打造人才高地,龙岗双选会顺利举办!

科技说

Selenium之POM 设计模式

QE_LAB

selenium 测试技术

万字详解 | Java 函数式编程

Phoenix

Lambda 函数式 #java

Java变量与数据类型

timerring

Java 后端

FLINK 在蚂蚁大规模金融场景的平台建设

Apache Flink

大数据 flink 实时计算

打卡智能中国(四):向着沙漠,向着沙漠

脑极体

AI 遥感

在字节跳动实习后,程序员是这样写简历的

字节跳动技术范儿

字节跳动 实习

CIO成就计划预告·微软韦青:数智时代下的企业数智化战略决策

科创人

一文吃透泛型

程序员大彬

Java java面试

数据库原理及MySQL应用 | 并发控制

TiAmo

MySQL 数据库 并发控制

Mac上免费好用的PDF编辑器:Acrobat Reader DC2023

Rose

苹果软件 mac软件下载 pdf阅读 Adobe Acrobat Reader DC

关于mac虚拟机Parallels Desktop 常见问题解答

Rose

pd 18 Parallels Desktop 虚拟机 PD常见问题 Mac虚拟机

得物 API一站式协作平台的一些思考

得物技术

API Gateway

AI时代下的打工人 | 社区征文

Dec

三周年征文

技术速递 | 分布式政企应用如何快速实现云原生的微服务架构改造

科技说

毫末发布DriveGPT雪湖·海若!首期智能驾驶能力、驾驶场景识别能力对行业开放

科技大数据

GardenPlanner :花园式和景观设计工具

Rose

Garden Planner 景观设计工具 GardenPlanner注册版 花园设计

Django笔记七之ManyToMany和OneToOne介绍

Hunter熊

Python django 多对多 ManyToMany OneToOne

AI日课@20230410:大语言模型是对本质知识的无损压缩

无人之路

ChatGPT

园林绿化设计工具:GardenPlanner Mac版

真大的脸盆

Mac Mac 软件 Mac 系统 园林设计工具 绿化设计

数据产品经理的三大底层思维

小鲸数据

数据产品经理 产品思维 数据产品 数据思维 #商业思维

CIO成就计划第二季第一期 | 活动回顾:基于数字技术重塑流程,驱动业务增长

科创人

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