2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

评论 1 条评论

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

英特尔2024技术篇章:矢志探索,砥砺前行

E科讯

MIT、OpenAI震撼力作!AI自主发现人工生命,软件测试行业如何迎接未来挑战?

测吧(北京)科技有限公司

测试

智慧酒店产业发展中的新突破——时序数据库TDengine与广东粤万润科技的深度合作

TDengine

数据库 tdengine

Sense 对话语音 AI:自动电话呼叫加快招聘流程;灵初智能发布端到端强化学习具身模型,实现长程任务泛化

声网

这两天在改BUG,下午就被通知在改进优化了...

Summer

Java 程序员 面试 架构师 大厂

【YashanDB知识库】sys登录提示账户被锁,怎么处理?

YashanDB

数据库 yashandb

【YashanDB知识库】listagg拼接结果发生溢

YashanDB

数据库 yashandb

【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断

YashanDB

数据库 yashandb

【YashanDB知识库】YAS-00402 failed to connect socket, errno 111, error message "Connection refused"

YashanDB

数据库 yashandb

英特尔2024产品年鉴:AI与软硬件的融合发展

E科讯

实时告警与性能监控:通过时序数据库 TDengine、taosKeeper 和 TDinsight 实现无缝监控

TDengine

数据库 tdengine

消失的一个多月,我用 AI 做了三个项目,简直不要太爽!

沉浸式趣谈

【YashanDB知识库】imp导入数据库时,报错YAS-08023

YashanDB

数据库 yashandb

时序数据库TDengine 2024 年终总结:与时代共跑的马拉松,我们携手同行

TDengine

数据库 tdengine 时序数据库

校招生技术简历撰写与求职全攻略 —— 从项目实践到薪资谈判的全方位指导

测吧(北京)科技有限公司

测试

2000 多位开发者测评通义灵码后,我们发现了大家「去班味」的原因

阿里云云效

阿里云 云原生

亚马逊直播网络不好的影响及改善方法

Ogcloud

海外直播专线 直播专线 亚马逊直播 亚马逊直播网络 亚马逊直播专线

揭秘!如何将动效描述自动转化为动效代码

快手技术

Java 前端 动效

履约系统:应用层、领域层、集成关系设计

不在线第一只蜗牛

Java 大数据 运维

酷睿Ultra 200S体验持续进化:精细化超频立功,游戏越来越快

E科讯

读懂华为开发者空间第一课,让云上开发如此简单

华为云开发者联盟

鸿蒙 软件开发 云主机 昇腾 CodeArts

自学记录:学习HarmonyOS Location Kit构建智能定位服务

李游Leo

鸿蒙 HarmonyOS

企业数字化转型的构念及实现路径

不在线第一只蜗牛

低代码 数字化

2000 多位开发者测评通义灵码后,我们发现了大家「去班味」的原因

阿里巴巴云原生

阿里云 云原生

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