QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

评论 1 条评论

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

报名领奖|云栖大会,10月19-22日杭州不见不散!

阿里巴巴云原生

阿里巴巴 阿里云 云原生 云栖大会

书单 | 带你轻松度假的10本好书!

博文视点Broadview

我写了一个脚本,可在“任意”服务器上执行命令!

冰河

Java 后台开发 运维 研发效能 系统架构

Morphling:云原生部署 AI , 如何把降本做到极致?

阿里巴巴云原生

阿里云 AI 云原生 Morphling

有人出15万要买下这份384页JDK源码笔记的版权,但被我果断拒绝,为了大家,我要开源

Java 程序员 架构 面试 计算机

谈谈几种数据库优化方法和依据的指标

Regan Yue

数据库优化 9月日更

学习心得 - 架构训练营 - 第四课

Fm

基于OpenCV+QT开发超实用的视频编辑器

轻口味

OpenCV 音视频 引航计划 9月日更

Canvas制作转盘和钢琴

空城机

typescript 大前端 canvas 引航计划

Spark 系列教程(1)Word Count

Se7en

Go 中五个常见错误

baiyutang

golang 9月日更

Intel高管披露Arc显卡合作厂商?官方否认

科技新消息

网络攻防学习笔记 Day147

穿过生命散发芬芳

风险评估

Prometheus 2.27.0 新特性

耳东@Erdong

release Prometheus 9月日更

华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新

华为云开发者联盟

华为云 企业应用 开天aPaaS aPaaS 华为云生态

一个Product Owner的假设引发的思考

Bruce Talk

敏捷 随笔 Agile Product Owner

25. 自动驾驶:AI最大的应用场景

Databri_AI

人工智能

linux之mktemp命令

入门小站

Linux

Intel要跟华硕等OEM品牌推出DG2显卡?官方:消息不属实

科技新消息

学生管理系统架构设计文档

Rabbit

前端性能优化实战(二)

Augus

JavaScript 9月日更

架构实战营 - 模块四作业

Alex.Wu

ECS 选款利器!PTS助您快速上云!

阿里巴巴云原生

活动 ECS TPS

缓存的弊端,你了解吗

卢卡多多

缓存 9月日更

在线Emoji符号大全

入门小站

工具

从敏捷开发到全自动开发,加速实现企业数字化转型

SoFlu-JavaAI开发助手

一文教你如何落地spring cloud alibaba企业级架构

小鲍侃java

后端 引航计划

智能世界的罗马是怎样建成的?

脑极体

联机数据分析OLAP:Kylin入门

正向成长

kylin

Chrome浏览器控制台支持中文

FunTester

chrome 浏览器 控制台 FunTester 中文

Flutter 对状态管理的认知与思考

小呆呆666

flutter ios android 大前端 dart

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