golang 调用rust_通过从JavaScript调用Rust来构建和扩充库

2023-05-16

golang 调用rust

为什么要在WebAssembly中使用Rust? ,我探讨了为什么您可能要编写WebAssembly(Wasm),以及为什么您可能会选择Rust作为语言来编写。现在,我将通过探索将Rust嵌入JavaScript的方式来分享它的外观。

这是将Rust与Go,C#和其他语言(具有可编译为Wasm的大型运行时)区分开来的功能。 Rust的运行时最少(基本上只是一个分配器),可以轻松地从JavaScript库使用Rust。 C和C ++有相似的故事,但是Rust的独特之处在于它的工具,我们现在来看一下。

基础

如果您以前从未使用过Rust,那么您首先需要进行设置。 很简单 首先下载Rustup ,这是一种控制Rust版本和不同工具链进行交叉编译的方式。 这将使您可以访问Cargo ,这是Rust构建工具和包管理器。

现在我们要做出决定。 我们可以很容易地编写通过WebAssembly在浏览器中运行的Rust代码,但是如果我们要做的事情除了使人们的CPU迷们旋转之外,我们可能会在某个时候想与文档对象模型(DOM)进行交互或使用一些JavaScript API。 换句话说: 我们需要JavaScript互操作 (又称JavaScript互操作性API)。

问题与解决方案

好消息是,有两个库可以促进基于Rust的Wasm与JavaScript之间的通信: wasm-bindgenstdweb 。 不幸的是,不幸的是,这两个库彼此不兼容。 wasm-bindgenstdweb低,并且尝试提供对JavaScript和Rust交互方式的完全控制。 事实上,还有的甚至通话使用WASM-BindGen自重写stdweb ,这将摆脱不兼容的问题。

由于wasm-bindgen是重量较轻的选项(该选项由Rust WebAssembly官方工作组正式开发),因此我们将重点介绍该选项。

wasm-bindgen和wasm-pack

我们将创建一个函数,该函数从JavaScript中获取字符串,将其变为大写并在其前面加上“ HELLO”,然后将其返回给JavaScript。 我们称这个函数为“ 激动的问候”

首先,让我们创建一个Rust库,其中将包含这个出色的功能:


   
   
$ cargo new my - wasm - library -- lib
$ cd my - wasm - library

现在,我们要用令人兴奋的逻辑替换src / lib.rs的内容。 我认为最好写出代码而不是复制/粘贴。


   
   
// Include the `wasm_bindgen` attribute into the current namespace.
use wasm_bindgen::prelude::wasm_bindgen;

// This attribute makes calling Rust from JavaScript possible.
// It generates code that can convert the basic types wasm understands
// (integers and floats) into more complex types like strings and
// vice versa. If you're interested in how this works, check this out:
// https://blog.ryanlevick.com/posts/wasm-bindgen-interop/
#[wasm_bindgen]
// This is pretty plain Rust code. If you've written Rust before this
// should look extremely familiar. If not, why wait?! Check this out:
// https://doc.rust-lang.org/book/
pub fn excited_greeting(original: &str) -> String {
  format!("HELLO, {}", original.to_uppercase())
}

其次,我们必须对Cargo.toml配置文件进行两项更改:

  • 添加wasm_bindgen作为依赖项。
  • 将库二进制文件的类型配置为cdylib或动态系统库。 在这种情况下,我们的系统是wasm ,设置此选项是我们产生.wasm二进制文件的方式。

   
   
[ package ]
name = "my-wasm-library"
version = "0.1.0"
authors = [ "$YOUR_INFO" ]
edition = "2018"

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

[ dependencies ]
wasm - bindgen = "0.2.33"

现在开始构建! 如果仅使用cargo build ,我们将获得一个.wasm二进制文件,但是为了使从JavaScript调用Rust代码更容易,我们希望有一些JavaScript代码可以将丰富JavaScript类型(例如字符串和对象)转换为指针,并代表我们将这些指针传递给Wasm模块。 手动执行此操作很繁琐且容易出现错误。

幸运的是,除了是一个库之外, wasm-bindgen还具有为我们创建此“胶水” JavaScript的能力。 这意味着在我们的代码中,我们可以使用普通JavaScript类型与Wasm模块进行交互,并且wasm-bindgen生成的代码将完成将这些丰富的类型转换为Wasm真正理解的指针类型的工作。

我们可以使用很棒的wasm-pack来构建Wasm二进制文件,调用wasm-bindgen CLI工具,并将所有JavaScript(以及任何可选的生成的TypeScript类型)打包到一个简洁的程序包中。 现在就开始吧!

首先,我们需要安装wasm-pack

 $ cargo install wasm - pack 

默认情况下, wasm-bindgen生产ES6模块。 我们将使用来自简单脚本标签的代码,因此我们只希望它产生一个普通的旧JavaScript对象,使我们可以访问Wasm函数。 为此,我们将--target no-modules选项传递给它。

 $ wasm - pack build -- target no - modules 

现在,我们的项目中有一个pkg目录。 如果我们查看内容,将会看到以下内容:

  • package.json :如果我们要将其打包为NPM模块,则很有用
  • my_wasm_library_bg.wasm :我们实际的Wasm代码
  • my_wasm_library.js :JavaScript“胶水”代码
  • 一些TypeScript定义文件

现在,我们可以创建一个index.html文件,该文件将使用我们JavaScript和Wasm:


   
   
< html >
< head >
  < meta content = "text/html;charset=utf-8" http-equiv = "Content-Type" / >
< / head >
< body >
  <!-- Include our glue code -->
  < script src = './pkg/my_wasm_library.js' >< / script >
  <!-- Include our glue code -->
  < script >
    window.addEventListener('load', async () => {
      // Load the wasm file
      await wasm_bindgen('./pkg/my_wasm_library_bg.wasm');
      // Once it's loaded the `wasm_bindgen` object is populated
      // with the functions defined in our Rust code
      const greeting = wasm_bindgen.excited_greeting("Ryan")
      console.log(greeting)
    });
  < / script >
< / body >
< / html >

您可能会想在浏览器中打开HTML文件,但是不幸的是,这是不可能的。 出于安全原因,必须从与HTML文件相同的域中提供Wasm文件。 您将需要一个HTTP服务器。 如果您有喜欢的静态HTTP服务器,可以从文件系统提供文件,请随时使用。 我喜欢使用basic-http-server ,您可以像这样安装和运行它:


   
   
$ cargo install basic - http - server
$ basic - http - server

现在,通过转到http:// localhost:4000 / index.html并通过Web服务器打开index.html文件,并检查您JavaScript控制台。 您应该在那里看到一个非常令人兴奋的问候!

如有任何疑问,请告诉我 。 下次,我们将研究如何在Rust代码中使用各种浏览器和JavaScript API。

翻译自: https://opensource.com/article/19/3/calling-rust-javascript

golang 调用rust

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

golang 调用rust_通过从JavaScript调用Rust来构建和扩充库 的相关文章

随机推荐

  • Java之设计模式(一): 单例模式

    单例模式 什么是单例模式 xff1f 单例模式应用场景饿汉式懒汉式静态内部类总结 设计模式 xff08 Design pattern xff09 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代
  • Java内存结构:基本概念

    基本概念 Java内存结构方法区 xff1a 堆 xff1a 栈 xff1a 内地方法栈 xff1a PC寄存器 xff1a 执行引擎 xff1a 垃圾回收机制 前言 面试经常被问到JAVA内存模型和Java内存结构的区别 JAVA内存模型
  • Java内存结构:jvm调优 堆调优

    堆 什么是堆堆结构图堆的参数配置设置最大堆内存设置新生代与老年代优化参数设置新生代比例参数内存溢出解决办法 什么是堆 是new创建出来的对象或数组存放在堆中 堆结构图 堆的参数配置 XX 43 PrintGC 每次触发GC的时候打印相关日志
  • springboot 2.3之后消失的hibernate-validator

    spirngboot升级到2 3之后 xff0c hibernate validator消失 项目升级到springboot2 3之后 xff0c 参数校验的注解报错 xff0c 发现spring boot starter web的依赖项已
  • CentOS7.6下MySQL8.0 tar.xz 安装详解

    安装详解 环境准备下载安装包安装步骤创建mysql用户更改目录权限初始化mysql设置环境变量添加开机自启动启动MYSQL服务登陆MYSQL修改密码修改公网访问设置防火墙 环境准备 1 由于Centos7自带Mariadb xff0c 卸载
  • Linux 防火墙 常用命令 基于Centos7

    常用操作 firewalld的基本使用服务之间的常用命令配置firewalld cmd firewalld的基本使用 启动 xff1a systemctl start firewalld 关闭 xff1a systemctl stop fi
  • MySQL主从复制和读写分离

    MySQL主从复制和读写分离 MySQL主从复制的好处主从复制的概念与作用主从复制的原理主从复制与读写分离的关系主从复制的配置修改主 master 服务器主服务器给从服务器账号授权修改从 slave 服务器连接主服务器开始同步操作 MySQ
  • java:组织机构树实现名称模糊查询

    在开发的很多场景中 xff0c 需要我们对树形结构进行模糊查询 xff0c 这个时候就需要用到递归来实现定位 xff0c 效果如下图 xff1a 话不多说 xff0c 直接上代码吧 xff1a 首先是对json的实例化对象处理 public
  • openstack dns_使用OpenStack Designate构建DNS即服务

    openstack dns Designate是一个多租户DNS即服务 xff0c 包括用于域和记录管理的REST API xff0c 用于与Neutron集成的框架以及对Bind9的集成支持 您可能需要考虑以下DNSaaS xff1a 干
  • mybatis plus 之UpdateWrapper操作

    目前java开发的系统为了可移植性更高 xff0c 都采用了mybatis plus来做持久层 xff0c 现在介绍一下其中UpdateWrapper的用法 xff1a UpdateWrapper lt TemplateDetailsEnt
  • 阿里域名+腾讯云服务器组合部署网站

    前段时间 xff0c 我在阿里云上购买了一个域名 本想着也在阿里云上购买一台入门级服务器先玩玩 xff0c 但是在看完一系列的产品后 xff0c 还是放弃了阿里云的服务器 对比几家之后还是选择了腾讯云 xff0c 接下来 xff0c 就是踩
  • 解决spring security登出时会由https重定向为http

    我们在集成spring security框架时 xff0c 默认的登出会走一次重定向login logout xff0c 这是如果发布到生产环境 xff0c 则会登出有问题 具体报错就是说由https和http混用访问资源的错误 xff0c
  • docker安装kafka,并集成springboot进行测试

    大家好 xff0c 今天我们开始学习kafka中间件 xff0c 今天我们改变一下策略 xff0c 不刷视频学习 xff0c 改为实践学习 xff0c 在网上找一些案例功能去做 xff0c 来达到学习实践的目的 首先 xff0c 是安装相关
  • springboot集成kafka的相关配置及自定义

    之前的文章末尾 xff0c 简单的实现了springboot集成kafka xff0c 完成了简单的测试 xff0c 今天我们来扩展一下相关内容 首先详解一下配置文件的内容 xff1a spring kafka 指定 kafka 地址 xf
  • sql查询一个表不包含另一个表的数据,两种方法。

    1 用minus函数的方式 xff1a select from CMN FUND where FUND CODE in select FUND CODE from CMN FUND minus select FUND CODE from C
  • js控制输入框禁止输入和允许输入

    初始 xff0c 部分输入框禁止输入 xff1a document ready function 34 fundCode 34 prop 34 disabled 34 true 34 convertFundCode 34 prop 34 d
  • jsp页面内嵌另一个jsp公共页面

    在开发过程中 xff0c 有些功能是一直可以重复使用的 xff0c 这样的页面我们可以做成公共的 xff0c 供每个页面适用 xff0c 那么就需要我们在使用的时候做一下嵌套 例如 xff1a 这样一个页面中 xff1a 上半部分是公共的
  • Go语言入门

    原文地址 xff1a 嗨客网 Go语言入门 Go语言入门教程 很多人将 Go 语言 称为 21 世纪的 C 语言 xff0c 因为 Go 不仅拥有 C 语言的简洁和性能 xff0c 而且还很好的提供了 21 世纪互联网环境下服务端开发的各种
  • Docker学习十:Docker Swarm

    一 Swarm介绍 Swarm 是 Docker 官方推出的容器集群管理工具 xff0c 最大的优势之一就是原生支持 Docker API xff0c 原来的 Docker 用户可以很方便地将服务迁移到 Swarm 中来 Swarm 还内置
  • golang 调用rust_通过从JavaScript调用Rust来构建和扩充库

    golang 调用rust 在为什么要在WebAssembly中使用Rust xff1f xff0c 我探讨了为什么您可能要编写WebAssembly xff08 Wasm xff09 xff0c 以及为什么您可能会选择Rust作为语言来编