使用 Chrome Devtools 调试 Babel 转译 React 时,“this”的值不正确

IT技术 reactjs ecmascript-6 google-chrome-devtools webpack babel-6
2021-03-24 05:29:49

我有一个 React 应用程序,它使用以下 .babelrc 配置与 Babel 一起编译

{
  "presets": [
    "es2015",
    "stage-1",
    "react"
  ],
  "plugins": [
    "transform-decorators-legacy"
  ]
}

应用程序转换并运行良好。但是,当我调试事件处理程序(特意编写为箭头函数)时,Chrome 调试器将“this”的值显示为 null。这是一个示例事件处理程序

handleNext = (event) => {
    event.preventDefault();
    this.gotoPage(this.state.page + 1);
}

如果我在事件处理程序的第一行设置断点,调试器将“this”的值显示为空,但将“_this”显示为“this”的正确值。正如我所说,代码运行干净,但调试令人沮丧,因为我不能简单地将鼠标悬停在代码中的字段上以查看它们的值。如果我将“this”绑定到我的事件处理程序,我可以解决调试问题,但我不应该执行那个额外的步骤。所有这些在 Babel5 中都运行良好,并且在我们切换到 Babel6 后才出现问题。

我正在使用 webpack 来捆绑代码并创建源映射。这是我的 webpack.config.js 中源映射配置的摘录

plugins: [
new webpack.SourceMapDevToolPlugin({
  filename: '[name].js.map',
  include: ['app.js'],
  columns: false
})
],
1个回答

不幸的是,当在 Chrome 的 Babelified 代码中使用调试器时,这是一个现实。要使用 ECMAScript 规范行为实现箭头函数,this需要关键字转换为不同的名称,目前无法告诉 Chrome 进行调试做什么。Firefox 的开发人员工具有一堆额外的逻辑来解决此类问题,因此如果您使用 Firefox 并启用“映射范围”复选框,它可能会正常工作,但它也可能更慢,因为它不是微不足道的。

一种选择是尝试使用spec箭头函数转换选项,这应该使它在调试时表现得更好,但可能不适用于所有情况。

"plugins": [
    ["transform-es2015-arrow-functions", {spec: true}]
]
@Bergi 仍然是一个问题,是的。这个问题有两个方面。Sourcemaps可能有足够的信息来扭转这种情况,但并不是所有的人都会,而且由于给定 source-map 的确切行为是相当不明确的,所以由地图的每个消费者来决定他们有多少数据想尝试从映射中推断。例如,如果您使用“Map Scopes”,Firefox 现在可以很好地处理这些内容,因为我为它们编写了一些逻辑,可以推断出超出传统做法的大量内容,但这都是启发式方法,默认情况下关闭,因为它很慢.
2021-05-24 05:29:49
这在 2019 年仍然是 Babel 的问题吗?等效的TypeScript 错误也仍然存在。这是否因缺少 sourcemap 功能而被阻止?
2021-05-30 05:29:49
@CiprianTomoiagă 而不是重命名this,而是尝试使用.bind以获得类似箭头的行为。
2021-06-16 05:29:49
您能否详细说明该spec选项的作用,以便我们了解它为什么有帮助?谢谢!
2021-06-17 05:29:49