Skip to content

Latest commit

 

History

History
executable file
·
126 lines (111 loc) · 3.45 KB

README.md

File metadata and controls

executable file
·
126 lines (111 loc) · 3.45 KB

教你一步一步使用rust写js扩展

  • 这是一个用于制作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