如何使用 VS Code 调试 Node.js 中的私有 class 字段?
How can I debug private class fields in Node.js with VS Code?
如何在运行时检查 class 实例的私有字段的内容,在 VS Code 中调试 Node 应用程序?
这应该是基本的东西,但不知何故似乎不可能...
- VS Code 的 Javascript 调试器不显示对象的私有字段
- 我试过了
util.inspect
, but Node folks decided to not make it work。
如果不可能,有哪些解决方法?
我正在使用:
- 节点
15.3.0
- VS 代码
1.51.1
更新:
VS Code 的内置 javascript 调试器在提出这个问题时不支持私有 class 字段的调试。从 1.56.0 版(2021 年 4 月)开始,现在可以了。
旧答案:
VS Code 的内置 javascript 调试器(ms-vscode.js-debug) does not support private class fields yet. (there's a feature request for it on github)
但是,v8 确实有一个(目前处于实验状态)method for reading private class fields. I've made a proof of concept project (leonardoraele/private-field-inspect) that uses Node's inspector API 可以在运行时以编程方式打开调试会话以读取变量的内容。 (这不会中断运行时执行)
有效,但 few caveats。
用法:
import inspect from '../path/to/private-field-inspect';
class Subject
{
publicValue = 'not so secret';
#secretValue = 'my secret';
}
const subject = new Subject();
inspect(subject)
.then(console.debug);
输出:
{ publicValue: 'not so secret', '#secretValue': 'my secret' }
上面的解决方法对我来说并不令人满意,所以我认为最好尽可能避免使用私有 class 字段,直到它们得到调试器的正确支持。相反,使用 Symbols 来隐藏私有变量。
示例:
// my-class.js (or .msj)
const PRIVATE = {
SECRET_VAL = Symbol('#secretVal');
};
export default class Subject {
// ms-vscode.js-debug can read it, but other modules can't
[PRIVATE.SECRET_VAL]: 'my secret';
doSomething()
{
const secret = this[PRIVATE.SECRET_VAL];
// ...
}
}
如何在运行时检查 class 实例的私有字段的内容,在 VS Code 中调试 Node 应用程序?
这应该是基本的东西,但不知何故似乎不可能...
- VS Code 的 Javascript 调试器不显示对象的私有字段
- 我试过了
util.inspect
, but Node folks decided to not make it work。
如果不可能,有哪些解决方法?
我正在使用:
- 节点
15.3.0
- VS 代码
1.51.1
更新:
VS Code 的内置 javascript 调试器在提出这个问题时不支持私有 class 字段的调试。从 1.56.0 版(2021 年 4 月)开始,现在可以了。
旧答案:
VS Code 的内置 javascript 调试器(ms-vscode.js-debug) does not support private class fields yet. (there's a feature request for it on github)
但是,v8 确实有一个(目前处于实验状态)method for reading private class fields. I've made a proof of concept project (leonardoraele/private-field-inspect) that uses Node's inspector API 可以在运行时以编程方式打开调试会话以读取变量的内容。 (这不会中断运行时执行)
有效,但 few caveats。
用法:
import inspect from '../path/to/private-field-inspect';
class Subject
{
publicValue = 'not so secret';
#secretValue = 'my secret';
}
const subject = new Subject();
inspect(subject)
.then(console.debug);
输出:
{ publicValue: 'not so secret', '#secretValue': 'my secret' }
上面的解决方法对我来说并不令人满意,所以我认为最好尽可能避免使用私有 class 字段,直到它们得到调试器的正确支持。相反,使用 Symbols 来隐藏私有变量。
示例:
// my-class.js (or .msj)
const PRIVATE = {
SECRET_VAL = Symbol('#secretVal');
};
export default class Subject {
// ms-vscode.js-debug can read it, but other modules can't
[PRIVATE.SECRET_VAL]: 'my secret';
doSomething()
{
const secret = this[PRIVATE.SECRET_VAL];
// ...
}
}