javascript - Feilsøk Node.js Async/Await med Typescript+VSCode
Jeg har sjekket de følgende svarene:
async await med nodejs 7
Hvordan feilsøke async/await i Visual Studio Code?
Men ingen av dem har løst problemet mitt.
Jeg vil kunne feilsøke native Async/Await fra VSCode ved bruk av Node.js v7.4.0 uten den forferdelige Typescript-transpilerte versjonen. Jeg klarer å få Typescript til å generere riktig kode, altså uten __awaiter osv. Imidlertid, når jeg prøver å feilsøke koden, dukker all den transpilerte tilstandsmaskinkoden opp!? Så jeg kan feilsøke koden, det er bare ikke koden jeg ønsker å feilsøke. Finnes det en måte å hindre at den feilsøkte koden får den transpilerte tilstandsmaskinkoden?
Her er konfigurasjonsfilene jeg har:
tsconfig.json
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"noImplicitAny": false,
"sourceMap": true,
"outDir": "lib",
"noUnusedParameters": false,
"noUnusedLocals": false,
"skipLibCheck": true
//"importHelpers": true
},
"exclude": [
"node_modules"
]
}
launch.json
{
"name": "Launch",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/node_modules/jest-cli/bin/jest.js",
"stopOnEntry": false,
"cwd": "${workspaceRoot}",
//"preLaunchTask": "tsc",
"runtimeExecutable": null,
"args": [
"--runInBand"
],
"runtimeArgs": [
"--harmony-async-await",
"--no-deprecation"
],
"env": {
"NODE_ENV": "development"
},
"console": "integratedTerminal",
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/{lib}/**/*.js"
],
"skipFiles": [
"node_modules/**/*.js",
"lib/**/*.js"
]
}
For å illustrere nærmere hva jeg mener, her er et utdrag av kode i den genererte JavaScript-en:
let handler = subscription.messageSubscription.handler;
debugger;
await handler(message.message, context);
Men når det feilsøkes ser det slik ut:
case 4:
handler = subscription.messageSubscription.handler;
debugger;
return [4 /*yield*/, handler(message.message, context)];
case 5:
Svar #1
Jeg legger til "smartStep": true i launch.json og feilsøking av await/async-mønsteret fungerer som ønsket (ved bruk av Node v8.4.0).
Dette er min launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}/src/main.ts",
"cwd": "${workspaceRoot}",
"console": "integratedTerminal",
"outFiles": [ "${workspaceRoot}/dist/*.js" ],
"sourceMaps": true,
"preLaunchTask": "build",
"smartStep": true
}
]
}
For flere detaljer, se https://code.visualstudio.com/updates/vApril#_smart-code-stepping.
Det er ikke en perfekt løsning, fordi med smartStep kan du ikke feilsøke i bibliotekkode, så du må manuelt kommentere ut dette alternativet hvis du vil feilsøke i biblioteket. Kanskje noen vet hvordan man kan løse denne lille ubeleiligheten.
Svar #2
Endelig funnet ut av det. Bruker Typescript og Jest. Deling av det jeg har, forhåpentligvis vil det hjelpe noen. Node 11, VScode 1.34.0
launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Jest Current File",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["-i", "${relativeFile}"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"sourceMaps": true,
"smartStep": true,
"windows": {
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
}
]
}
tsconfig.json:
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": ".",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"inlineSources": true,
"sourceRoot": "/",
"declaration": false,
"module": "es2015",
"esModuleInterop": true,
"resolveJsonModule": true,
"stripInternal": true,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es2017",
"typeRoots": ["node_modules/@types"],
"lib": ["es2018", "dom", "esnext.asynciterable"],
"types": ["chrome", "node", "jest"]
}
}
Dette fungerer imidlertid bare i noen scenarier. Hvis du kan kompilere appen din til JS ES2017, fungerer det. Angular kan ikke kompileres til den ES-versjonen, så det fungerer bare med noen testfiler. Det er veldig frustrerende at Angular-kompilering ikke gir ut ES2017, og det vil ikke gjøre det de neste mange årene heller.
