您可以将带有wasm文件的模块加载到create-react-app中吗?

时间:2019-10-06 17:56:10

标签: javascript webpack create-react-app webassembly

我正在尝试将此模块加载到一个create-react-app项目中:https://www.npmjs.com/package/wasmlibfp

执行此操作时出现以下错误:

./node_modules/wasmlibfp/wasmlibfp_bg.wasm
Module parse failed: magic header not detected
File was processed with these loaders:
 * ./node_modules/file-loader/dist/cjs.js
You may need an additional loader to handle the result of these loaders.
Error: magic header not detected

在CRA中加载wasm模块是否需要做些特殊的事情?

2 个答案:

答案 0 :(得分:1)

是的,您可以将带有wasm文件的模块加载到create-react-app项目中。为此,您将需要对CRA项目进行一些修改。以下步骤来自Richard Reedy的Using WebAssembly with React tutorial

创建CRA:

npx create-react-app react-wasm-migration

安装react-app-rewiredwasm-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-app-rewired代替react-scripts

"scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test"
}

安装wasm依赖项:

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>
);

答案 1 :(得分:0)

或者,您可以尝试仅创建一个普通的react应用,然后尝试安装依赖项。

npm install --save wasmlibfp