AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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

评论 1 条评论

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

软件测试|pyecharts绘制NBA球星得分能力对比图

霍格沃兹测试开发学社

帮您了解CDN节点如何做到访问加速与安全防护

天翼云开发者社区

云计算 CDN 内容分发网络

软件测试|一文带你了解Flask框架

霍格沃兹测试开发学社

2024深圳电子展

AIOTE智博会

电子展

一文快速了解微服务架构

穿过生命散发芬芳

微服务 6 月 优质更文活动

TS中type和interface在类型声明时的区别

不叫猫先生

6 月 优质更文活动

LRU缓存策略

不叫猫先生

LRU 6 月 优质更文活动

推动高校教改:如何面向人文社科教授数据分析

ModelWhale

数据分析 学科交叉 人文社科 教学经验 高等教育

软件测试|必须遵循的UI自动化设计军规

霍格沃兹测试开发学社

什么是无服务器架构技术?

天翼云开发者社区

服务器 架构设计

javaScript实现动态规划(Dynamic Programming)01背包问题

不叫猫先生

动态规划 JavaScrip 6 月 优质更文活动

了解 Dubbo:分布式服务框架的基础知识

Apifox

程序员 gRPC dubbo RPC 开发

基于 AIGC,RocketMQ 学习社区探索开源软件学习新范式

阿里巴巴云原生

阿里云 RocketMQ 云原生 AIGC

解密云商降本之谜:揭开AWS账单的真相,实现Finops的关键数据

jinjin

AWS 降本增效 spotmax FinOps 节约成本

软件测试|一文教你flask路由配置

霍格沃兹测试开发学社

云原生中间件套件,如何为企业数字化转型提供支撑

金蝶天燕云

云原生 中间件 信创

索信达携手华为联合发布智能营销标签平台解决方案

索信达控股

软件测试|Python操作Excel制作报表,不要太方便

霍格沃兹测试开发学社

软件测试|教你轻松解决pip安装下载超时问题

霍格沃兹测试开发学社

软件测试|Python绘图神器——Matplotlib使用教程(一)

霍格沃兹测试开发学社

头部大模型公司进京赶考,向量数据库成为应考神器

Zilliz

Milvus Zilliz AIGC 向量数据库 zillizcloud

阿里云微服务引擎负责人李艳林:云原生网关当道,会带来哪些改变

阿里巴巴云原生

阿里云 微服务 云原生

AIGC时代,基于云原生 MLOps 构建属于你的大模型(上)

York

云原生 大模型 MLOps AIGC ChatGPT

关于GDPR体系文件介绍,介绍GDPR体系文件的内容和意义

镭速

潮流地标美罗城焕新活力,智图赋能传统商业经典延续|MobTech观察

MobTech袤博科技

边缘计算简介

天翼云开发者社区

云计算 边缘计算

软件测试|码农必会的git操作(一)

霍格沃兹测试开发学社

镭速用心打造,新版本发布,为用户实现更多可能

镭速

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