WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互

2023-05-16

WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互

About: 简介

上一篇文章: WebAssembly 与 Rust 编程系列05 Rust编写wasm模块
我们介绍了最简单的 Rust 导出wasm模块,并在js中加载调用

接下来我们会在此基础上, 更加深入的了解 Rust 与 JavaScript 的交互, 以及 Rust 和 WebAssembly 相关生态工具的应用

wasm-bindgen 使用

wasm-bindgen的核心是提供javascript和Rust之间相互使用wasm进行通信。
它允许开发者直接使用Rust的结构体、javascript的类、字符串等类型,而不仅仅是wasm支持的整数或浮点数;

wasm-bindgen
wasm-bindgen-doc

wasm-bindgen 是一个 cargo 包,只需要在依赖中加入即可

wasm-bindgen = "0.2.64"

wasm-pack 使用

wasm-pack 可以把我们的代码编译成 WebAssembly 并制造出正确的 npm 包。

cargo install wasm-pack

创建工程

  • 创建 bindgen 工程
cargo new bindgen-hello --lib
  • 修改 Cargo.toml
[package]
name = "bindgen-hello"
version = "0.1.0"
authors = ["austindev <austinxishou@yahoo.com>"]
edition = "2018"

[lib]
crate-type = ["cdylib"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
wasm-bindgen = "0.2.64"
  • 修改 lib.rs
    实现一个最简单的 rust调用JavaScript的alert
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
}

#[wasm_bindgen]
pub fn hello(name: &str) {
    alert(&format!("Hello, {}!", name));
}
  • 编译 wasm
cargo build --release --target wasm32-unknown-unknown

webpack 与 npm 集成使用

上述cargo编译出模块后,因为集成了wasm-bingen,不能直接使用

  • 生成 npm 模块
    需要进一步处理
wasm-bindgen target/wasm32-unknown-unknown/release/bindgen_hello.wasm --out-dir ./lib
  • 修改 .gitignore
    我们编译生成的模块文件是不需要加入版本管理的,记得加入 gitignore
/target
Cargo.lock
/lib
node_modules/
  • 新建 package.json

定义一个package.json文件

{
  "scripts": {
    "build": "webpack",
    "serve": "webpack-dev-server"
  },
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "1.0.1",
    "text-encoding": "^0.7.0",
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.29.4",
    "webpack-cli": "^3.1.1",
    "webpack-dev-server": "^3.1.0"
  }
}
  • 新建 webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    entry: './index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'index.js',
    },
    plugins: [
        new HtmlWebpackPlugin(),
        new WasmPackPlugin({
            crateDirectory: path.resolve(__dirname, "./lib")
        }),
        // Have this example work in Edge which doesn't ship `TextEncoder` or
        // `TextDecoder` at this time.
        new webpack.ProvidePlugin({
          TextDecoder: ['text-encoding', 'TextDecoder'],
          TextEncoder: ['text-encoding', 'TextEncoder']
        })
    ],
    mode: 'development'
};
  • 安装依赖运行
npm install
npm run serve

小结

本篇实现了最简单的 Rust 写 npm模块,并且在模块中与JavaScript代码交互,基本上展现了rust与wasm以及JavaScript三者之间
如何协作的精髓.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互 的相关文章

  • RCE漏洞之绕过

    文章目录 花括号斜杠空格过滤一些命令分隔符黑名单绕过拼接绕过编码绕过单引号和双引号绕过利用Shell 特殊变量绕过linux中直接查看文件内容的工具文件构造 花括号 在Linux bash中还可以使用 OS COMMAND ARGUMENT
  • 调用windows系统动态库实现wifi连接及问题

    有个项目是c 做的 xff0c 有个需求是程序启动自动连接指定wifi xff0c 想到windows有个系统库支持 xff0c 就用c 43 43 调的系统库 xff0c 然后c 再调c 43 43 封装好的接口 xff0c 比较简单 x
  • ffmpeg编译时cmp: command not found的问题

    执行安装 pacman S diffutils 参考 xff1a https stackoverflow com questions 18152168 using cygwin for ffmpeg build error cmp comm
  • 关于vs2013弹出“正在初始化模板“的问题

    此处有标题 昨天想在vs2013里配置python的编译环境 xff0c 于是在网上找了资源来下载 xff0c 但是由于中途出了一点意外 xff0c 配置过程中断了 xff0c 再等我回来想要新建项目的时候 xff0c 就弹出来这个框框 x
  • C++异常和C++11标准

    异常 异常概念 xff1a 程序中可预料但无法避免的错误 异常处理概念 xff1a 从发生异常的地方开始终止 xff0c 不再进行正常的流程 xff0c 去转而执行特定的异常处理流程 关键字 xff1a try try块 xff0c 受监控
  • linux下安装sl

    在root用户下哦 yum install sl 这里会提示 No package sl available 我们要安装一个wget yum install wget 中间一路yes 提示出现Complete即为安装成功 下一步用wget安
  • C++ 20 Range

    简单理解为 xff1a 封装了begin xff0c end 这一对迭代器的对象 range的抽象级别更高 xff0c 具有更多好处 1 xff09 避免繁琐 std for each begin v end v 迭代器 xff0c 书写繁
  • P3367 【模板】并查集

    题目描述 如题 xff0c 现在有一个并查集 xff0c 你需要完成合并和查询操作 输入格式 第一行包含两个整数N M 表示共有 N 个元素和 M 个操作 接下来 M 行 xff0c 每行包含三个整数 Zi Xi Yi 当 Zi 61 1
  • Notepad++ 下载安装和使用

    Notepad 43 43 下载安装和使用 介绍下载1 官网下载2 网盘下载 介绍 Notepad 43 43 是 Windows操作系统下的一套文本编辑器 xff1b Notepad 43 43 是免费软件 xff0c 可以免费使用 xf
  • 如何解决c++中循环包含头文件的问题

    今天在编译别的人写的代码时 xff0c 出现 missing type specifier int assumed Note C 43 43 does not support default int的错误 在网上搜了一下 xff0c 发现是
  • Qt开发之Go篇(五)

    QPushButton 基本用法就像前边Hello World示例中的那样 xff0c 现在我们看看不基本的用法 状态保持 QPushButton有一个属性是checkable xff0c 当设置为true之后按钮就会点一下是按下 xff0
  • note: please ensure that VS 2013,VS 2015, VS 2017,VS 2019 or VS 2022 was instal1ed with the Visua1 C

    编译rust代码报错 报错信息 error 1inker link exe 96 not found 61 note program not found note the msvc targets depend on the msvc li
  • 线性表习题

    本章的代码大多数都是伪代码 xff0c 是不能直接运行的 删除递增单链表中 xff0c data值为mink maxk之间的值 思想 xff1a 先找到第一个大于等于mink的结点q xff0c 并记录其前驱结点pre xff0c 再找到第
  • c语言指针和多重指针

    数据结构是一种思想 xff0c 不限制于某一种语言 xff0c 但再各种语言实现中却有许多小细节不可忽视 xff0c 比如c语言中的指针 xff0c 是个让人十分头疼的问题 先以链表为例 xff0c 这里定义了链表的结点表示 xff0c d
  • 采用邻接表存储结构,编写一个算法,判别无向图中任意给定的两个顶点之间是否存在一条长度为为k的简单路径

    上图是具体的结构 要明确vertices是顶点数组 firstarc是第一个指向顶点的指针 nextarc是指向下一个顶点的指针 adjvex是相邻顶点的值 也就是在vertices的索引位置 span class token keywor
  • 试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)

    这是原版答案 span class token punctuation span 题目分析 span class token punctuation span 引入一变量level来控制递归进行的层数 span class token pu
  • C语言双重指针

    这是我的一些二重指针的一些经验 xff0c 希望对大家有帮助 xff0c 如有啥错误或者更好的想法希望能指出 xff0c 共同进步 xff0c 谢谢 span class token macro property span class to
  • 类和对象(一)——类&对象概念及定义

    c 43 43 是基于面向对象的语言 xff0c 并不是纯面向对象的语言 xff0c 因为它包含c的部分 xff0c c是面向过程的语言 一 面向对象 概念 xff1a 面向对象程序设计 xff08 OOP xff09 是一种程序设计的泛型
  • 顺序表习题

    1 在长度为n的顺序表L中 xff0c 删除所有值为x的数据元素 xff0c 要求时间复杂程度为O xff08 n xff09 xff0c 空间复杂程度为 xff08 1 xff09 解法1 xff1a 用k记录有序表中不等于x元素的个数
  • docker 安装nextcloud+mysql弃坑小记

    弄了一天 xff0c 终于弃坑了 docker中mysql和nextcloud都拉取最新版本 xff0c 8点几和20点几吧 mysql报过错 InnoDB Unsupported redo log format 0 xff0c 清空本机映

随机推荐