7个版本

0.0.6 2020年12月1日
0.0.5 2020年12月1日
0.0.3 2020年11月30日

1474WebAssembly

每月31次下载

MIT/Apache

13KB
222

js-bindgen

该项目目前处于非常初级的ALPHA版本,但正在为Rust和C生成一些非常基础的绑定

通过js-wasm为各种语言生成WebAssembly到JavaScript的绑定

  • Rust
  • C
cargo install js-bindgen

入门指南

此项目能够将如下的JavaScript API描述(yaml格式)转换为代码:

Bindings to web console
----
- name: console
  functions:
    - name: clear
    - name: log
      parameters:
        - name: msg
          parameter_type: string
    - name: warn
      friendly_name: warning
      parameters:
        - name: msg
          parameter_type: string
    - name: error
      parameters:
        - name: msg
          parameter_type: string
    - name: time
      parameters:
        - name: msg
          parameter_type: string
    - name: timeEnd
      parameters:
        - name: msg
          parameter_type: string

并转换为代码。

Rust

js-bindgen --lang rust console.yaml
#![no_std]

pub mod console {
    use js::*;
    
    pub fn clear(){
        let func = js!(r###"function(){
                console.clear();
            }"###);
        func.invoke_0();
    }
    
    pub fn log(msg: &str){
        let a0 = msg.as_ptr() as u32;
        let a1 = msg.len() as u32;
        let func = js!(r###"function(msgPtr,msgLen){
                console.log(this.readUtf8FromMemory(msgPtr,msgLen));
            }"###);
        func.invoke_2(a0, a1);
    }

...

C

js-bindgen --lang c console.yaml
#include "js-wasm.h"

void console_clear(){
    static int fn;
    char *fn_code = "function(){ console.clear(); }";
    if(fn == 0){
        fn = js_register_function(fn_code,js_strlen(fn_code));
    }
    js_invoke_function_0(fn);
}

void console_log(char * msg){
    static int fn;
    unsigned int a0 = (unsigned int)msg;
    unsigned int a1 = js_strlen(msg);
    char *fn_code = "function(msgPtr,msgLen){ console.log(this.readUtf8FromMemory(msgPtr,msgLen)); }";
    if(fn == 0){
        fn = js_register_function(fn_code,js_strlen(fn_code));
    }
    js_invoke_function_2(fn, a0, a1);
}

...

自定义代码

有时你可能想要创建绑定到不存在的代码,但仍能生成适用于多个目标的库

- namespace: unicorn
  functions:
    makeUnicorns:
      code: |
        function() {
          console.log("🦄🦄🦄")
        }

依赖项

~9–19MB
~250K SLoC