如何在Vscode中使用Typescript等待后调试代码?

10

我正在使用Vscode 1.33.1, Node 11.12, Typescript 3.4.3, vscode-chrome-debug-core 6.7.46来尝试调试React Native项目。

只要没有遇到await,一切都运行得很好。然而,当我遇到包含await的代码时,我就不会在await之后触发任何断点(包括await本身)。代码会正常运行,但调试器会出现错误。如果我在await之前设置一个断点,并尝试step in/over/out,它就会跳转到丑陋的index.bundle代码中。

这在我的应用程序的多个位置上都会发生,因此它不是一个孤立的问题。

这是我launch.json中的活动配置:

{
    "name": "Debug iOS (sim)",
    "program": "${workspaceRoot}/.vscode/launchReactNative.js",
    "type": "reactnative",
    "request": "launch",
    "platform": "ios",
    "sourceMaps": true,
    "outDir": "${workspaceRoot}/.vscode/.react",
    "smartStep": true,
    "skipFiles": [
        "${workspaceFolder}/node_modules/**/*.js",
        "${workspaceFolder}/lib/**/*.js",
        "<node_internals>/**/*.js"
      ]
},

从配置上看,我已经尝试了smartStep(但是Vscode说不允许),skipFiles(它确实会跳过文件,除非我明确地进入文件,所以它有效,但不能解决问题)。我也看过Debug Node.js Async/Await with Typescript+VSCode,但我已经尝试了smartStep,而那个问题的担忧已经过时并且已经在许多发布版本中解决。

如何正确地调试包含await的Typescript代码?

更新:当我绕过Vscode的调试/配置,在Chrome和vanilla终端(即react-native run-ios)中调试,它工作得很完美。所以这与Vscode或其配置有关。

更新2:我正在针对ES2017进行目标设置,这是我的tsconfig

{
  "compilerOptions": {
    "target": "es2017",
    "module": "commonjs",
    "jsx": "react-native",
    "strict": true,
    "noImplicitAny": false,
     "moduleResolution": "node",
     "baseUrl": "./app",
     "paths": {
       "assets/*": ["assets/*"],
       "components/*": ["components/*"],
       "navigation/*": ["navigation/*"],
       "utils/*": ["utils/*"],
       "views/*": ["views/*"],
       "types/*": ["types/*"],
       "services/*": ["services/*"],
       "state/*": ["state/*"],
       "constants/*": ["constants/*"]
     },
     "allowSyntheticDefaultImports": true,
    "esModuleInterop": true
  }
}

1
你的目标JavaScript版本是什么?我个人在将TypeScript编译成ES6之前的JavaScript时遇到了调试问题,因为async/await被编译成生成器函数。 - Jake Holzinger
@JakeHolzinger 我的目标是ES2017。 - Can Poyrazoğlu
生成的JavaScript代码在'await'周围是什么样子的? - Michael Dreher
@user240515 不,生成的JS没有await/async,它们会被Babel翻译成丑陋的嵌套Promise。也许React Native不需要这种语法,但我会进一步了解一下。 - Can Poyrazoğlu
@CanPoyrazoğlu 你解决了这个问题吗? - Isaac Pak
显示剩余2条评论
1个回答

2
调试时,我建议您使用谷歌的Node调试器ndb,它可以在您的Node项目中使用谷歌Chrome开发工具。
安装正确后,您只需通过以下命令运行文件: ndb node index.js 等等。 它将自动启动调试器并运行您的命令如下图所示: Screenshot 图片来源:https://github.com/GoogleChromeLabs/ndb/blob/v1.1.4/README.md 我认为这比VSCode调试器要好得多。
如果您想运行TypeScript文件,则应该在您的package.json中添加ts-node作为devDependency,这将允许您在不编译的情况下运行TypeScript文件。
然后,您可以这样使用ndbndb ts-node index.ts 然而,目前没有任何调试器完美支持TypeScript。 如果需要完整的调试功能,您应该调试编译后的JavaScript版本 - 您可以优化tsconfig.json以使代码更易读。

8
与基于Chrome调试器的Vscode调试器相比,ndb相比之下有哪些优点? - Can Poyrazoğlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接