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

标签 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 模块需要做些什么特别的事情吗?

最佳答案

是的,您可以将带有 wasm 文件的模块加载到 create-react-app 项目中。为此,您需要对 CRA 项目进行一些修改。以下步骤来自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>
);

关于javascript - 您可以将带有 wasm 文件的模块加载到 create-react-app 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259904/

相关文章:

node.js - Webpack 可在自定义域上本地运行,而不会出现套接字问题

node.js - 创建 React 应用程序 http-proxy-middleware 不工作

javascript - 如果我传入参数,函数不会被异步调用

javascript - 使用 es6 和 React 未定义函数

ruby-on-rails - Rails、Webpacker 和 Docker:无法分配请求的地址 - connect(2) for [::1]:3035

css - 使用 webpack 导入 css 库

typescript - Visual Studio Code 使用 "react-jsx"作为 jsx 值与 create-react-app 的问题

javascript - 使用 td 元素中的 javascript 将特定内容替换为其他内容

javascript - 如何将 int 转换为 float?

javascript - 从表中删除一行并将 bool 标志传递给 API,而不删除实际对象