2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论 1 条评论

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

开发第一个Flink应用

程序员欣宸

Java flink 7月月更

OpenCV编程:OpenCV3.X训练自己的分类器

DS小龙哥

7月月更

数字化转型的两种误区

奔向架构师

数据仓库 数据资产 7月月更

SAP Fiori 的附件处理(Attachment handling)

汪子熙

SAP Fiori SAP UI5 ui5 7月月更

查找——平衡二叉树

乔乔

7月月更

知其然,而知其所以然,JS 对象创建与继承

掘金安东尼

JavaScript 前端 设计模式 7月月更

qt 实现遍历文件夹

小肉球

qt 7月月更

getchar()

謓泽

7月月更

【愚公系列】2022年7月 Go教学课程 012-强制类型转换

愚公搬代码

7月月更

LeetCode-108. 将有序数组转换为二叉搜索树(java)

bug菌

Leet Code 7月月更

nacos服务注册之SpringCloud 集成nacos

急需上岸的小谢

7月月更

云原生(五) | Docker篇之深入Dockerfile

Lansonli

云原生 7月月更

MFC|框架下自绘CEdit控件

中国好公民st

c++ 7月月更

博弈论(depu)与投资(40/100)

hackstoic

投资

推荐 6 个实用的 Vue 组件库

devpoint

JavaScript Vue 前端开发 7月月更

TCP拥塞控制详解 | 7. 超越TCP

俞凡

算法 网络 TCP拥塞控制

李宏毅《机器学习》|1. Introduction of this course(机器学习介绍)

AXYZdong

机器学习 7月月更

jQuery 的节点操作

Jason199

jquery js 7月月更

java零基础入门-File类(实战篇)

喵手

Java 7月月更

如何使用SVG制作沿任意路径排布的文字效果

南极一块修炼千年的大冰块

7月月更

Tortoisegit工具的安装和使用

空城机

git Tortoisegit 7月月更

数据库每日一题---第25天:银行账户概要 II

知心宝贝

数据库 云计算 前端 后端 7月月更

各厂商的数据湖解决方案

五分钟学大数据

数据湖 7月月更

架构实战营|模块7

KDA

#架构实战营

C# SerialPort配置和属性了解

IC00

C# 7月月更

王者荣耀商城异地多活架构设计

爱晒太阳的大白

基于CSS mask-image 实现炫酷图片过渡效果之星球大战

南城FE

前端 动画效果 7月月更 过渡

使用Java获取给定日期所在周的第一天

GeekYin

Java 小工具

HarmonyoS快速入门:Hello world

逝缘~

7月月更

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