WASM 使用说明23事(RUST实现)

文章目录

    • [1. wasm是什么](#1. wasm是什么)
      • [1.1 chatgpt定义如下:](#1.1 chatgpt定义如下:)
      • [1.2 wasm关键特性:](#1.2 wasm关键特性:)
    • [2. wasm demo](#2. wasm demo)
      • [2.1 cargo 创建项目](#2.1 cargo 创建项目)
      • [2.2 编写code](#2.2 编写code)
      • [2.3 安装wasm-pack](#2.3 安装wasm-pack)
      • [2.4 编译](#2.4 编译)
    • [3.1 html页面引用wasm代码(js引用)](#3.1 html页面引用wasm代码(js引用))
    • [3.2 访问页面](#3.2 访问页面)
    • [4 导入js function](#4 导入js function)
      • [4.1 编写lib.rs文件,内容如下:](#4.1 编写lib.rs文件,内容如下:)
      • [4.2 编译](#4.2 编译)
      • [4.3 html](#4.3 html)
      • [4.4 访问页面, 结果如下:](#4.4 访问页面, 结果如下:)

1. wasm是什么

1.1 chatgpt定义如下:

WebAssembly(WASM)是一种新兴的、低级的二进制格式,旨在为 web 提供一种高性能的执行环境。它可以与 JavaScript 互操作,使开发者能够在浏览器中运行复杂的应用程序,比如游戏、图形处理、科学计算等。

1.2 wasm关键特性:

  • 高性能:WASM 被设计为快速加载和执行,接近原生代码的性能。
  • 安全性:WASM 在一个安全的沙箱环境中运行,可以防止未授权的内存访问。
  • 跨平台:可以在任何支持的环境中运行,包括浏览器、服务器和嵌入式设备。
  • 语言支持:除了 JavaScript,许多编程语言(如
    Rust、C、C++、Go)可以编译为 WASM。

2. wasm demo

2.1 cargo 创建项目

shell 复制代码
cargo new --lib wasm-hello 

2.2 编写code

2.2.1 修改Cargo.toml文件, 内容如下:

toml 复制代码
[package]
name = "wasm-hello"
version = "0.1.0"
edition = "2021"

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

[dependencies]
wasm-bindgen = "0.2"

2.2.2 修改src/lib.rs文件, 内容如下:

rust 复制代码
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

2.3 安装wasm-pack

shell 复制代码
cargo install wasm-pack

2.4 编译

进入项目根目录, 然后编译

shell 复制代码
wasm-pack build --target web

命令执行成功后, 截图如下:

说明: 1. wasm_hello_bg.wasm就是输出的二进制文件

3.1 html页面引用wasm代码(js引用)

wasm-hello根目录下创建index.html页面, 内容如下:

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello World - Rust</title>
    <script type="module">
        import init from "./pkg/wasm_hello.js";
        const runWasm = async () => {
            // Instantiate our wasm module
            const helloWorld = await init("./pkg/wasm_hello_bg.wasm");

            // Call the Add function export from wasm, save the result
            const addResult = helloWorld.add(24, 24);

            // Set the result onto the body
            document.body.textContent = `Hello World! addResult: ${addResult}`;
        };
        runWasm();
    </script>
</head>
<body></body>
</html>

3.2 访问页面

截图如下:

4 导入js function

4.1 编写lib.rs文件,内容如下:

复制代码
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

// Here, we will define our external `console.log`
#[wasm_bindgen]
extern "C" {
    // Use `js_namespace` here to bind `console.log(..)` instead of just
    #[wasm_bindgen(js_namespace = console)]
    fn log(s: &str);
}

// Export a function that will be called in JavaScript
// but call the "imported" console.log.
#[wasm_bindgen]
pub fn console_log_from_wasm() {
    log("This console.log is from wasm!");
}

4.2 编译

进入项目根目录, 然后编译

shell 复制代码
wasm-pack build --target web

4.3 html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello World - Rust</title>
    <script type="module">
        import init from "./pkg/wasm_hello.js";
        const runWasm = async () => {
            // Instantiate our wasm module
            const helloWorld = await init("./pkg/wasm_hello_bg.wasm");

            // Call the Add function export from wasm, save the result
            const addResult = helloWorld.add(24, 24);

            // Set the result onto the body
            document.body.textContent = `Hello World! addResult: ${addResult} `;

            helloWorld.console_log_from_wasm();
        };
        runWasm();
    </script>
</head>
<body></body>
</html>

4.4 访问页面, 结果如下:

页面有console输出"This console.log is from wasm!"

相关推荐
czq_268671948714 小时前
Python打卡第46天
开发语言·python
Evand J16 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter17 小时前
ZPL文件预览
开发语言·c++
Zan18 小时前
Tauri 2 实战:为什么一个可靠的桌面应用,应该由 Rust Host 管理生命周期?
前端·架构·rust
RobinDevNotes21 小时前
从 Electron 到 GPUI,9 个跨平台桌面方案该怎么选
前端·javascript·rust·electron·openresty·前端开发工具
噢,我明白了1 天前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人1 天前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾1 天前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者1 天前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光1 天前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习