最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

评论 1 条评论

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

"我眼中的ChatGPT"征文获奖作品合集

InfoQ写作社区官方

技术专题合集 热门活动 ChatGPT

PyTorch 深度学习实战 | 基于ResNet的花卉图片分类

TiAmo

数据集 PyTorch

SVN管理工具:Cornerstone 4 激活版

真大的脸盆

svn Mac Mac 软件 SVN客户端

【云原生 • Docker】用故事给老板讲Docker核心原理

Reactor2020

云原生 ,docker linux namespace

可观测行之系统如何识别网站有多少文件命中了缓存?

Yestodorrow

可观测性 可观测性用观测云

Removing HTTP/2 Server Push from Chrome

Yestodorrow

SaaS时代下的我们需要什么样的数据库?

陈飞

运维进阶训练营 -W18H

赤色闪电

谷歌架构师分享gRPC与云原生应用开发Go和Java为例文档

程序知音

Java 架构 云原生 编程语言 后端

运维进阶训练营 -W19H

赤色闪电

如何落地质量门禁?

老张

软件测试 质量保障 质量度量 质量门禁

Java并发夺命23问

程序员大彬

Java Java并发 java面试

架构实战营第10期毕业设计-秒杀系统

Geek_4db2d5

设计电商秒杀系统

Geek_e5f2e5

AIGC导航网站推荐

kcodez

人工智能 AIGC Chat ChatGPT

App Store 新定价机制 - 2023年最全版

37手游iOS技术运营团队

ios iap In App Purchase App Store Connect API app store

阿里十年架构师总结的Java核心知识点大全,恐怖程度难以想象!

开心学Java

Java spring JVM Java工程师 多线程并发

运维进阶训练营 -W17H

赤色闪电

Dubbo Triple 异常处理

昵称不能为null

dubbo triple协议 dubbo异常处理

云原生引擎单元测试实践

京东科技开发者

云原生 单元测试 代码覆盖

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

InfoQ写作社区官方

热门活动 ChatGPT

GPT-4免费无限制使用教程

南城FE

人工智能 AI 前端 ChatGPT

如何构建内部开发者门户:企业参考指南

SEAL安全

企业号 3 月 PK 榜 开发者体验 内部开发者门户

蚁人与量子停车场

脑极体

AI

利用 Amazon Managed Blockchain 发展和扩大忠诚度奖励计划(第一部分)

亚马逊云科技 (Amazon Web Services)

人工智能

《动手学深度学习--PyTorch》之学习环境搭建

IT蜗壳-Tango

架构实战营10期-模块九作业

炮仗

架构训练营模块九作业

现在不学习马上变垃圾

架构训练营10期

「Go框架」bind函数:gin框架中是如何绑定请求数据的?

Go学堂

golang 开源 程序员 个人成长

一种基于实时大数据的图指标解决方案

京东科技开发者

大数据 运维 系统架构 开发 图指标

【程序员日记】---当“微服务”遇到了“电饼铛“

京东科技开发者

架构 微服务 系统架构 开发 企业号 3 月 PK 榜

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