Using WebAssembly with React tutorial
作者:Richard Reedy:
npx create-react-app react-wasm-migration
安装
react-app-rewired
和
wasm-loader
npm install react-app-rewired wasm-loader -D
添加
config-overrides.js
const path = require('path');
module.exports = function override(config, env) {
const wasmExtensionRegExp = /\.wasm$/;
config.resolve.extensions.push('.wasm');
config.module.rules.forEach(rule => {
(rule.oneOf || []).forEach(oneOf => {
if (oneOf.loader && oneOf.loader.indexOf('file-loader') >= 0) {
// make file-loader ignore WASM files
oneOf.exclude.push(wasmExtensionRegExp);
}
});
});
// add a dedicated loader for WASM
config.module.rules.push({
test: wasmExtensionRegExp,
include: path.resolve(__dirname, 'src'),
use: [{ loader: require.resolve('wasm-loader'), options: {} }]
});
return config;
};
更改CRA NPM脚本以使用
而不是
react-scripts
:
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test"
}
npm install --save wasmlibfp
在JS代码中异步加载WASM:
WebAssembly must be loaded asynchronously
,所以您需要添加加载它的JS代码(我把这个放在
App.js
componentDidMount() {
this.loadWasm();
}
loadWasm = async () => {
try {
const wasm = await import('external');
this.setState({wasm});
} catch(err) {
console.error(`Unexpected error in loadWasm. [Message: ${err.message}]`);
}
};
如果已加载wasm代码,请在应用程序中使用该代码:
render() {
const { wasm = {} } = this.state;
return (
<div className="App">
{ wasm.doStuff && wasm.doStuff() }
</div>
);