一步一步教大家制作node的rust扩展
发布于 2 个月前 作者 zy445566 2013 次浏览 最后一次编辑是 1 个月前 来自 分享

rust-bindings-learn

  • github首发,如需转载,请先联系作者。
  • 这是一个用于制作node的rust扩展的的中文教程,接下来我将会一步一步教学。
  • 由于天朝墙的问题,建议大家先准备好代理。

准备

如果之前使用过node-gyp则只需要安装rust即可(优势可以不需要python了)

在 Unix 系统的软件列表

在 Mac 系统的软件列表

在 Windows 系统的软件列表

开始建立项目

先全局安装生成器

npm install -g neon-cli

正式开始建立项目

  • 运行命令建立项目,那我们来一发求斐波那契数吧
  • 先建立项目,同时看是否之前的环境是否搭建有误 首先运行
neon new fib

neon_new_fib

我们先看一下目录结构

dir-stcut

接下来,切换到生成的目录,安装依赖并编译

cd fib
npm install

如果出现以下情况则安装正确(如图):

build-test

开始写我们的斐波那契数吧

打开native目录里的src中的lib.rs文件,修改为

#[macro_use]
extern crate neon;

use neon::vm::{Call, JsResult};
use neon::js::JsString;
use neon::js::JsInteger;
use neon::js::Variant;

//原有的hello方法
fn hello(call: Call) -> JsResult<JsString> {
    let scope = call.scope;
    Ok(JsString::new(scope, "hello node").unwrap())
}

//斐波那契数方法入口
fn fib(call: Call) -> JsResult<JsInteger> {
    let scope = call.scope;
    //获取第一个参数
    let option_num = call.arguments.get(scope,0);
    //定义参数值变量
    let mut num:i32 = 0;
    //获取参数值
    if let Some(x1) = option_num {
        if let Variant::Integer(x2) = x1.variant() {
            num = x2.value() as i32;
        }
    }
    //调用简单的求斐波那契数方法,并返回js的Integer对象
    Ok(JsInteger::new(scope, easy_fib(num)))
}

// 简单的求斐波那契数方法,有兴趣的同学可以实现一下矩阵快速幂求斐波那契数
fn easy_fib(num:i32) -> i32
{
    if num < 2
    {
        return 1;
    } else {
        return easy_fib(num-1) + easy_fib(num-2);
    }
}

//模块导出
register_module!(m, {
    try!(m.export("hello", hello));
    try!(m.export("fib", fib));
    Ok(())
});

接下来是lib的index.js文件修改为

var addon = require('../native');
console.log(addon.hello());
console.log(addon.fib(30));

编译并运行

cnpm install #或neon build
node .\lib\index.js

看到下图,你就已经成功了,现在你可以用rust做node扩展了


fib-test

14 回复

好像很厉害的样子

rust,我也算是刚刚才开始学,也问了很多 属于极少数不需要GC的语言,在编译期就完成内存的管理, 同时会在编译期进行代码的运算,有点像facebook的prepack @i5ting 可以加精么?

@coolicer rust目前来说是编程语言的异类,学习这个能扩宽我们的代码思维,有兴趣可以玩一下

@zy445566 很强大,rust看过一些基础语法而已

@i5ting 我看到neon例子全部都是没有接收参数,我这应该是第一个

@zy445566 内容是很好的,不过还需要再整理一下,目录,排版,多一些阐述语句会更好,加油,看好你哦

程序猿就是要注定不停的折腾。

@nobody 就是要折腾!!!

来自酷炫的 CNodeMD

回到顶部