ES6 字符串文字/打字稿的 Chrome 开发工具问题

Posted

技术标签:

【中文标题】ES6 字符串文字/打字稿的 Chrome 开发工具问题【英文标题】:Chrome Dev Tools Issue With ES6 String Literals/Typescript 【发布时间】:2017-04-13 08:09:00 【问题描述】:

我正在使用 Typescript 和 Typescript 公开的一些 ES6 功能(例如 ES6 String Literals)开展一个项目,例如`Something $variable Something else`.

在调试问题时,我在我的打字稿文件中放置了一个断点,以便在源代码面板中单步执行它,这通常可以正常工作。

但 Chrome 开发工具在 ES6 字符串文字方面存在问题,并且似乎无法识别 ES6 字符串文字的结尾。

相反,字符串文字后面的所有代码都标记为红色(在调试器中突出显示字符串)并阻止变量检查,因为 chrome 调试器似乎认为它都是一个大字符串。

是否有人遇到过此问题、找到了解决方案或知道这是否在 Google 的 Chrome 开发工具路线图上?

编辑 1: 看起来这个问题目前正在由 Chromium 团队处理。请参阅问题报告以获取更新:bugs.chromium.org/p/chromium/issues/detail?id=659515

编辑 2: 错误已经开放了很长一段时间,但似乎没有被优先考虑。如果您遇到问题,请转到上面的 chromium 链接,并用有用的信息对其加注星标/评论,以将其转移到开发工具团队的关注点。

【问题讨论】:

你有没有找到任何东西?可能是错误报告?这也让我发疯了。 @YesMan85 发现了一个开放的错误报告 - 看起来他们仍在努力修复:bugs.chromium.org/p/chromium/issues/detail?id=659515 好的,谢谢,我昨天也在一个 repo 案例中放了一个 bug,希望他们能把它捡起来。 任何遇到这个问题的人都应该给铬错误加注星标/添加更多信息和证据。希望这很烦人 在链接中,您提供的这个问题被标记为“已修复”,但实际上它仍然存在问题。有人知道是否有指向此问题的新链接,我们可以投票以强制执行此错误修复? 【参考方案1】:

如果您使用的是 Typescript,则可以通过将代码编译为 ES2015 并使用源映射来解决此问题。这样,反引号内插字符串将转换为良好的 ol'"string " + variable + " string",但您仍然可以在查看带有反引号的原始打字稿代码时进行调试。

这需要将以下内容添加到您的 tsconfig.json:


    "compilerOptions": 
        "target": "ES2015",
        "sourceMap": true, 
        ...
    
    ...

如果您在本地提供生成的源映射文件 (.js.map) 以及生成的 .js 文件,您应该能够使用 Ctrl-p 在“源”下的 chrome 开发工具中打开 typescript 文件。

【讨论】:

问题是语法高亮在带有反引号的 TS 源映射上不起作用。您的方法最终仍会在 Chrome 调试器中显示带有反引号的 TypeScript 文件。 这不是 OP 问题的解决方案,甚至与他的问题无关。【参考方案2】:

来自 DevTools 团队的 December 14, 2017 评论说他们更新了 DevTools 中使用的 CodeMirror 版本,现在应该修复该问题。在 Chrome 64 及更高版本中它应该可以工作。在早期版本的 Chrome 中,它仍然会被破坏。你可以在chrome://version查看你的版本。

【讨论】:

还是坏了。版本 64.0.3282.119(正式版)(64 位) 在版本 65.0.3325.162 中损坏。我已在crbug.com/659515 为该问题加注星标 在 68.0.3438.3 中损坏。我已在crbug.com/659515 上为该问题加注星标 在版本 70.0.3538.102(官方构建)(64 位)中损坏 仍然损坏 77.0.3865.120(官方版本)(64 位)。没人关心【参考方案3】:

至于版本 69.0.3497.100 (Official Build) (64-bit) 在 Ubuntu 中仍然是一个 bug。

作为一种解决方法,您可以开始在包含模板化字符串的行末尾添加://`,这会修复 chrome 源选项卡中的格式。

这是我的工作 jsx 代码的一些示例。


在组件道具中:

  <Field
    name=`$fields.name[$index].comments`// `
    component="input"
    type="text"
  />

作为子元素:

  <label>
    `$t('Condone')  `/* ` */
  </label>

在声明中:

  switch (DEBTTYPE) 
    case DEBTTYPE_MACHINE_PRODUCT:
      id = `machine_product_difference_row_$row.id_productdebt`;// `
      break;
      ....

我真的希望他们能尽快解决这个问题。

【讨论】:

好东西!谢谢!!

以上是关于ES6 字符串文字/打字稿的 Chrome 开发工具问题的主要内容,如果未能解决你的问题,请参考以下文章

为基于打字稿的库在 package.json 类型字段中放置啥

带有打字稿的角度材料设计

通过打字稿的界面来反应状态[重复]

带有打字稿的枚举

带有打字稿的 Angular 5 websocket 示例

带有打字稿的MongoDB聚合