VS Code代码行数统计插件漏统计的主因是仅监听onDidChangeTextDocument而忽略文件打开、切换等场景;须同时监听onDidOpenTextDocument、onDidChangeActiveTextEditor(需判空)和onDidChangeTextDocument,并逐行扫描lineAt()计算非空非注释行。

为什么 vscode.workspace.onDidChangeTextDocument 会漏统计?
代码行数统计插件最常犯的错,就是只监听文档变更却忽略文件打开、关闭、切换标签页等场景。比如用户刚打开一个 .js 文件,此时 onDidChangeTextDocument 根本不会触发——它只响应内容修改,不响应加载。结果插件显示“0 行”,用户一脸问号。
正确做法是三路并进:
- 用
vscode.workspace.onDidOpenTextDocument捕获新打开的文件 - 用
vscode.window.onDidChangeActiveTextEditor捕获编辑器切换(比如从 A.ts 切到 B.py) - 再配合
onDidChangeTextDocument响应实时编辑
注意:这三者返回的 TextDocument 对象结构一致,但 onDidChangeActiveTextEditor 的回调参数可能为 null(比如焦点切到终端),必须判空。
怎么安全获取当前文件的有效代码行数?
直接用 document.lineCount 是错的——它包含空行、注释行,也把 /* */ 多行注释中间的空行算进去。真实需求往往是“非空非注释行”,得自己扫描。
关键点有三个:
- 逐行调用
document.lineAt(i).text.trim(),跳过全空白行 - 用正则判断单行注释:
/^\s*\/\/.*$/,注意要匹配行首可能的空白 - 多行注释状态需手动维护:遇到
/*开启,遇到*/关闭,期间所有行都视为注释(包括空行)
别用 document.getText().split('\n') 全局拆分——大文件(>10MB)会卡顿甚至 OOM;逐行 lineAt() 是 VS Code 官方推荐的流式访问方式。
状态栏显示数字后,为什么点击没反应?
很多人加了 vscode.window.createStatusBarItem() 并设了 text,但忘了绑定点击事件。VS Code 的状态栏项默认不可交互,必须显式调用 item.command = 'extension.showStats',再在 package.json 的 contributes.commands 里注册同名命令。
常见疏漏:
- 命令 ID 写错大小写(
showstats≠showStats) - 没在
activate()里调用vscode.commands.registerCommand() - 状态栏项未调用
item.show()—— 即使设置了 text,不 show 就不渲染
调试技巧:在命令回调里加 vscode.window.showInformationMessage('clicked'),快速验证是否绑对了。
打包发布前,为什么本地跑得好,别人装了就报 Cannot find module './extension'?
这是 vsce package 打包时路径解析出错的典型表现。根本原因是 package.json 的 main 字段写的是 ./src/extension.ts,但 VS Code 运行时只认编译后的 JS,而 vsce 默认不执行 tsc 编译。
必须做两件事:
- 确保
tsconfig.json的outDir设为./out,且rootDir指向./src - 把
package.json的main改成./out/extension.js
顺手加个 npm script:"package": "tsc && vsce package"。否则每次改完代码都要手动 tsc 再 vsce,极易漏编译。
复杂点在于:TypeScript 类型声明、node_modules 依赖、以及 webpack 打包方案会进一步改变输出结构——但纯 TS 插件起步阶段,守住 out/extension.js 这条线就够了。


















