内容简介:自从入坑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
。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用 MonoRepo 管理前端项目
- 使用 Mkdocs 制作项目文档
- 使用Taro开发项目总结
- 使用 Maven 构建 Java 项目
- 使用gradle构建java项目
- flask使用蓝图规划大型项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站重构(第3版)
[美] Jeffrey Zeldman、[美] Ethan Marcotte / 傅捷、祝军、李宏 / 电子工业出版社 / 2011-3 / 59.00元
《网站重构:应用Web标准进行设计(第3版)》内容简介:畅销书作家、设计师、网页标准教父jeffrey zeldman再次更新了他经典的、颠覆行业的指南书。这已经是《网站重构:应用Web标准进行设计(第3版)》的第3版了,此次更新基本涵盖了随着环境和技术的变化,web标准所面临的挑战以及因此而发生的改善。第3版让基于标准的设计思想更加清晰,更加易于理解,帮助你在这个领域中保持聪明和领先。 ......一起来看看 《网站重构(第3版)》 这本书的介绍吧!