如何在React项目中直接使用WebAssembly

栏目: IOS · Android · 发布时间: 7年前

内容简介:自从入坑WebAssembly以来,躺了很多坑,也浏览了很多资料,都没有看到很多能够直接在前端项目中使用WebAssembly的例子。即使有,我自己按照介绍的步骤一步一步来, 也会报各种错误,官方的文档也写的比较模糊。于是,就决定自己撸一个,让React项目能够直接的借助Webpack,在代码中引入已经编译好的C++模块。执行以下代码对上面的

自从入坑WebAssembly以来,躺了很多坑,也浏览了很多资料,都没有看到很多能够直接在前端项目中使用WebAssembly的例子。即使有,我自己按照介绍的步骤一步一步来, 也会报各种错误,官方的文档也写的比较模糊。于是,就决定自己撸一个,让React项目能够直接的借助Webpack,在代码中引入已经编译好的C++模块。

写一个 C语言 模块

int add(int a, int b) {
  return a + b;
}
复制代码

使用emscripten对C模块进行编译

执行以下代码对上面的 add.c 文件进行编译。

emcc add.c -Os -s WASM=1 -s SIDE_MODULE=1 -o add.wasm
复制代码

-Os 代码我的模块需要优化, -s WASM=1 代表我需要Wasm的第一个版本, -s SIDE_MODULE=1 代表我不需要多余的代码,就只要这一个模块。 -o add.wasm 表示我的输出文件为 add.wasm 。然后就可以看到在与 add.c 同级的目录下生成了 add.wasm 。然后把 add.wasm 放到 public 目录下。

新建一个react项目

npx create-react-app my-project
cd my-project
yarn install
yarn start
复制代码

执行完上述的命令,一个简单的react项目就在你本地的3000端口启动了。

获取webpack控制权

然后再执行以下命令。

yarn run eject
复制代码

运行之后就可以看到webpack的配置文件了。

安装loader和fetch

yarn add wasm-loader && yarn add node-fetch
复制代码

更新webpack配置文件

找到webpack配置文件,在相应的位置添加如下配置。

{
    test: /\.wasm$/,
    type: 'javascript/auto',
    loaders: ['wasm-loader']
}
复制代码

修改App.js文件

修改App.js。将其替换为如下代码。

import React, {Component} from 'react';
import logo from './logo.svg';
import fetch from 'node-fetch';
import './App.css';

class App extends Component {
  componentDidMount() {
    this.doSomething();
  }

  getExportFunction = async (url) => {
    const env = {
      memoryBase: 0,
      tableBase: 0,
      memory: new WebAssembly.Memory({
        initial: 256
      }),
      table: new WebAssembly.Table({
        initial: 2,
        element: 'anyfunc'
      })
    };
    const instance = await fetch(url).then((response) => {
      return response.arrayBuffer();
    }).then((bytes) => {
      return WebAssembly.instantiate(bytes, {env: env})
    }).then((instance) => {
      return instance.instance.exports;
    });
    return instance;
  };

  doSomething = async () => {
    const wasmUrl = 'http://localhost:3000/add.wasm';
    const { add } = await this.getExportFunction(wasmUrl);
    console.log(add(200,2034));
  };

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo"/>
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
      </div>
    );
  }
}

export default App;
复制代码

可以看到App类中有个函数叫 getExportFunction ,这个函数接受一个 url 参数,这个url是远程wasm文件的地址。然后动态的根据传入url,解析其中的编译好的 function


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ASP.NET 2.0入门经典

ASP.NET 2.0入门经典

哈特 / 清华大学出版社 / 2006-8 / 78.00元

该书是Wrox红皮书中的畅销品种, 从初版、1.0版、1.1版到目前的2.0版,已经3次升级,不仅内容更加完善、实用,还展现了.NET 2.0的最新技术和ASP.NET 2.0最新编程知识,是各种初学者学习ASP.NET的优秀教程,也是Web开发人员了解ASP.NET 2.0新技术的优秀参考书。该书与《ASP.NET 2.0高级编程(第4版)》及其早期版本,曾影响到无数中国Web程序员。一起来看看 《ASP.NET 2.0入门经典》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具