使用 webpack devtool=eval 显示跨域 React 错误边界错误?

Posted

技术标签:

【中文标题】使用 webpack devtool=eval 显示跨域 React 错误边界错误?【英文标题】:Display cross-origin React error boundary errors with webpack devtool=eval? 【发布时间】:2018-08-03 20:33:36 【问题描述】:

我刚刚使用 React 16 中的“新”componentDidCatch 功能在我的 React 页面中添加了一个“错误边界”。

但是,当抛出错误时,它会显示:

错误:引发了跨域错误。 React 无法访问开发中的实际错误对象。

React 团队 recommends 我将我的 webpack 开发工具从 eval 更改为 cheap-module-source-map

这确实有效。

但是,如果您查看performance chart,您会发现cheap-module-source-map 的重建时间明显慢于eval

我不能让 webpack-dev-server 运行得更慢。对我的一个 JSX 文件进行单个字符更改后,重建已经需要大约 10 秒。这也不是在慢速笔记本电脑上。

在不更改我的 webpack devtool 的情况下是否可以显示错误?

【问题讨论】:

【参考方案1】:

facebook/react issue #10441有一些讨论。

问题似乎是在一些非常具体的条件下出现的。自从在我的开发机器上安装负载平衡器和反向代理后,我也遇到了这个错误,如果不启用 CORS,我无法完全满意地解决这个问题。您可以尝试以下方法:

尝试不同的 Webpack 开发工具(来自您链接的表)。例如,对于我的设置,cheap-eval-source-map 可以正常工作,但cheap-module-eval-source-map 不行。 在 Webpack 开发配置中设置 output.crossOriginLoading = 'anonymous' 以启用块的跨域加载

作为最后的手段,您可以尝试在开发模式下全局或针对特定路由启用CORS 服务器端。假设启用 CORS,您可以使用任何开发工具,从而缓解性能问题,但是...

警告:启用 CORS 这是一个安全漏洞,可能非常危险,具体取决于您的安全要求(请参阅下面的链接)。

在所有路由上启用 CORS 的简单 Express 中间件示例:

// Enable CORS in development
if(config.IS_DEVELOPMENT) 
  app.use((req, res, next) => 
    res.header('Access-Control-Allow-Origin', '*')
    res.header('Access-Control-Allow-Headers',
      'Origin, X-Requested-With, Content-Type, Accept')
    next()
  )

您可以使其更智能,并且仅在捆绑重新加载路由上选择性地启用 CORS。你可以试试expressjs/cors 包,它提供了更多的灵活性。

同样,您可以将 CORS 标头添加到 webpack-dev-server devServer.headers

另见:

What are the security risks of setting Access-Control-Allow-Origin? When is it safe to enable CORS?

【讨论】:

以上是关于使用 webpack devtool=eval 显示跨域 React 错误边界错误?的主要内容,如果未能解决你的问题,请参考以下文章

[webpack] devtool里的7种SourceMap[转]

webpack is not defined错误解决

webpack常见配置信息

Webpack中的sourceMap配置

前端项目工程化 -- webpack -- Source Maps

webpack配置文件中的devtool与其他插件(例如UglifyjsWebpackPlugin)源映射选项有什么区别?