10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论 1 条评论

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

还不清楚Lambda的底层原理?一文帮你搞懂

后台技术汇

28天写作

项目管理知识标准体系

Ian哥

28天写作

外企时代已经过去?

李忠良

28天写作

管事情的过程,如何聚焦并决策高价值的事?

一笑

管理 优先级队列 28天写作

Reactive Spring实战 -- 响应式Redis交互

binecy

redis Reactive Spring

我的电脑嘲讽我!

IT蜗壳-Tango

七日更

如何做到超预期供应

熊斌

28天写作

同城快递架构设计

Mars

VS2019 + Qt Creator 4.11.1 导入Qt源码进行调试记录

Creep

c++ qt

数据结构和算法学习总结-复杂度分析

Nick

时间复杂度 数据结构与算法 复杂度

【Vue2】文本无缝滚动

德育处主任

Vue 大前端 28天写作

【计算机内功修炼】八:函数运行时在内存中是什么样子?

码农的荒岛求生

高并发 内存 高性能 内存管理 运行时栈帧

Mybatis【17】-- Mybatis自关联查询一对多查询

秦怀杂货店

数据库 mybatis

Elasticsearch document routing 数据路由

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

浅谈JavaScript常见的循环方式

devpoint

foreach for for...of

年关将至

luojiahu

《学会写作》学习笔记之如何选题

JiangX

28天写作

碎碎念之「创造力可能是新的生产力」

Justin

创意 28天写作 创造性思维

产品训练营-第六课笔记

Geek_娴子

28天瞎写的第二百三十三天:唯工具论的错误

树上

28天写作

小产品、连接和生态

孙苏勇

产品 产品定位

怀着期待开启美好的一天「幻想短篇 23/28」

道伟

28天写作

技术创业,股权设置的常见“坑” | 视频号28天(24)

赵新龙

28天写作

创业失败启示录|茶之玄学

阿萌

28天写作 创业失败启示录 青城

机器学习笔记之:虽然还没明白到底是在干嘛,但竟然还觉得挺有意思的!

Nydia

发布 Go Modules

Rayjun

go modules Go 语言

GameStop: 究竟发生了什么?

lidaobing

28天写作 逼空

架构师训练营第10周课后作业

万有引力

week10-总结

J

读2020年Javascript趋势报告展望ES2020

devpoint

大前端 ES2020 构建工具

week10-homework

J

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