当前位置: 首页 > 知识库问答 >
问题:

如何在WebWorker上使用React组件

卫念
2023-03-14

我正在使用https://react-pdf.org/的react-pdf包创建一个PDF生成器。将react-pdf组件转换为pdf的过程会阻塞主线程,因此我希望在一个单独的工作线程上转换它们。

我正在使用带有worker-loader的create-react-app来识别WebWorker文件。我很难找到将react组件导入Webworker并使用React-PDF提供的pdf(Component).toblob()方法转换它们的方法。pdf(Component).toblob()将react组件作为输入并输出blob文件,这意味着工作者必须能够以某种方式加载react组件。当不包含React组件时,WebWorker按预期工作。

我天真地尝试将React组件导入WebWorker并尝试运行转换方法:

pdf(<Component />).toBlob().then(blob=>{
   ...
  }) 

这会导致模块解析错误:

Uncaught Error: Module parse failed: Unexpected token (14:8)
File was processed with these loaders:
 * ./node_modules/eslint-loader/index.js
You may need an additional loader to handle the result of these loaders.

如有任何帮助,我们将不胜感激。

编辑:我使用的是create-react-app默认webpack配置,添加了worker-loader,它检测.worker.js文件并将它们注册为WebWorker。我使用react-app-rewired包添加了工作加载器:

module.exports = function override(config, env) {
    config.module.rules.push({
        test: /\.worker\.js$/,
        use: { loader: 'worker-loader' }
      })
      config.output['globalObject'] = 'this';
    return config;
  }

共有1个答案

洪逸清
2023-03-14

这个回答是我们在聊天中讨论的延伸。

这里的问题是覆盖函数的.push()。如MSDN文档中所述:

push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

实际上,config.module.rules.push()在规则数组的末尾添加了加载器,因此首先处理React代码,然后处理worker.js

Ali Zeaiter发现,解决方案是使用.unshift()(参见doc),而不是.push(),以便将加载程序前置到规则数组,从而首先处理worker.js文件

 类似资料:
  • 问题内容: 我正在使用reactjs路由器中的Link组件,但无法使onClickevent运行。这是代码: 这是做这件事的方式还是另一种方式? 问题答案: 您以字符串形式传递,也意味着立即执行。 尝试

  • 问题内容: 我是webworker的新手,但我设法将xmlhttprequest发送到我的rest api,并且得到了json。但我想一次又一次(循环)发送此请求,直到页面处于活动状态。我实际上想实时显示值。我想制作一个简单的Web应用程序,在其中将数据插入数据库时​​,我的Webworker应该显示该数据而不刷新页面。有没有更好的方法可以做到这一点。请帮助我。对不起,英语不好。 问题答案: 您可

  • 问题内容: 我有一个React组件,并且在该组件的方法内部有这样的东西: 现在的要点是,我有两个固定的元素,一个在顶部,一个在底部。在中间,我想有一个switch语句,根据状态下的值,我想渲染一个不同的组件。因此,基本上,我希望两个元素始终固定,并且每次都在中间以呈现不同的组件。我正在使用它来实现多步付款程序)。但是,正如当前的代码一样,它不起作用,因为它给了我一个错误,说这是意外的。有什么想法可

  • 问题内容: 我有一个数组 如您所见,键0与1、3和4相同。键2与它们全部不同。 在它们上运行array_unique函数时,唯一剩下的是 有什么想法为什么array_unique无法按预期工作? 问题答案: 这是因为使用字符串比较来比较项目。从文档: 注意:当且仅当(string)$ elem1 ===(string)$ elem2,两个元素才被视为相等。换句话说:当字符串表示相同时。将使用第一个

  • 问题内容: 我使用下面的代码在React组件上设置默认道具,但是它不起作用。在该方法中,我可以看到输出“ undefined props”已打印在浏览器控制台上。如何为组件道具定义默认值? 问题答案: 您忘记合上支架了。

  • 问题内容: 我们目前正在从Relay转移到React Apollo 2.1 ,而我正在做的事情似乎很糟糕。 上下文: 只有在通过用户身份验证(通过API密钥)的情况下,才必须渲染某些组件,因此有一个组件可以保护其余的树。 在中,它是这样使用的(显然,下面的所有片段都是最小的示例): 如果身份验证成功,将进行渲染。 在第一次渲染/安装时将身份验证突变发送到服务器,并相应地调用渲染道具。 看起来像这样