写点什么

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

评论 1 条评论

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

白玉试毒 | 灰度架构设计

九叔(高翔龙)

架构设计 互联网架构设计 灰度 灰度发布 发布流程

那个百无一用的技术主管

极客思享

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)

mzlogin

jsDelivr CDN Jekyll GitHub Pages 个人博客

基于 Spring Boot 的企业级快速开发框架 BDF3

木香丘

架构 Spring Boot 可视化 后台管理系统

LeetCode题解:429. N叉树的层序遍历,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

阿里互联网神话,超级工程双十一如何打造终于开源了(共4篇)

小Q

学习 架构 面试 算法 阿里

中小企业如何启动产品科普直播?

boshi

内容 营销 直播 企业应用

spring-boot-route(八)整合mybatis操作数据库

Java旅途

Java Spring Boot mybatis

技术人为什么该坚持写作?

极客思享

菜鸟工程师的超神之路 -- 从校园到职场

极客思享

区块链即将涌现更多典型落地应用

CECBC

区块链 落地应用

可穿戴的“舌头鼠标”,催生“黏腻”人机交互的新想象?

脑极体

算法岗有没有泡沫

极客思享

在互联网站上怎么准确分辨别出MG平台真假VX(LGF7998)黑网的验证方法?

InfoQ_6b6a6317a692

惊艳!腾讯微软内部5大算法文档+源码,大厂offer拿到手软

小Q

学习 架构 数据结构 面试 算法

week03作业

xxx

手把手教你锤面试官 02——设计模式轻松答

慵懒的土拨鼠

Java 面试 设计模式

week03总结

xxx

「架构师训练营第 1 期」第三周作业

张国荣

如何高质量学习与正确运用设计模式

木香丘

学习 设计模式 实战

甲方日常 26

句子

生活 随笔杂谈 日常

时空停滞

Sean

调试 心得

共享服务中心建设原则-《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》

Man

中台 研发管理 DDD

演化过程中的技术与业务双驱引擎

boshi

云计算 架构 中台 成长 数字化

极客时间架构 1 期:第 3 周代码重构 - 学习总结

Null

架构训练营-week4-作业

于成龙

作业 架构训练营

《我想进大厂》之MQ夺命连环11问

艾小仙

kafka 面试 MQ 程序语言

第8周作业

Vincent

极客时间 极客大学

第8周总结

Vincent

极客时间 极客大学

java安全编码指南之:方法编写指南

程序那些事

java安全编码 java安全 java安全编码指南

区块链更多典型落地应用即将涌现

CECBC

区块链 落地应用

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