代码之家  ›  专栏  ›  技术社区  ›  Brandon Durham

你能把带有wasm文件的模块加载到createreact应用程序中吗?

  •  0
  • Brandon Durham  · 技术社区  · 6 年前

    我正在尝试将此模块加载到create react应用程序项目中: 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模块需要做什么特别的工作吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Bank    6 年前

    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>
    );
    
        2
  •  0
  •   Raushan Kumar    6 年前

    npm install --save wasmlibfp