Node私有包类型提示问题:如何让VSCode指向源码而非构建文件
问题本质
VSCode的TypeScript语言服务默认优先读取模块构建后的产物文件,但这些文件通常会丢失原始JSDoc注释;同时通过Git URL安装模块时,默认导入路径指向dist下的构建文件,导致语言服务无法关联到带完整注释的源码,进而出现无类型提示、跳转至构建文件的问题。
规范实现方案
你通过package.json的exports字段指定types指向源码的做法完全符合规范,这是TypeScript官方认可的原生JS项目提供类型支持的方式。以下是优化后的完整实现步骤:
1. 配置package.json的exports字段
同时覆盖ESM、CommonJS构建产物和类型入口,明确将源码作为类型来源:
{ "name": "utils", "type": "module", "exports": { ".": { "import": "./dist/utils.mjs", "require": "./dist/utils.cjs", "types": "./src/index.js" } }, "main": "./dist/utils.cjs", "module": "./dist/utils.mjs", "types": "./src/index.js" }
exports内的types字段用于现代包管理器和语言服务的精准入口映射- 根级
types字段作为兼容旧工具的兜底配置
2. 保持Rollup构建的注释移除配置
如果你的Rollup配置使用了rollup-plugin-terser等移除注释的插件,无需修改——我们的目标就是让语言服务直接读取源码中的JSDoc,而非构建后的文件。
3. 确保项目JS类型检查开启
在使用该模块的项目中,检查.vscode/settings.json是否开启JS类型检查:
{ "javascript.implicitProjectConfig.checkJs": true }
该配置会让VSCode自动解析JS文件中的JSDoc注释,生成类型提示。
4. Git URL安装的注意事项
通过Git URL安装时,包管理器会克隆完整仓库,src目录会被包含在node_modules/utils中,语言服务可正常访问到带JSDoc的源码。若后续发布至npm,需确保.npmignore未排除src目录,保证源码能被打包进npm包。
方案合规性说明
TypeScript官方文档明确支持:对于JavaScript项目,可通过types字段指向包含JSDoc的入口文件,以此提供类型提示。这种无需生成.d.ts文件、完全依赖JSDoc的方式,是原生JS项目提供类型支持的推荐方案之一。
内容的提问来源于stack exchange,提问作者hedgehog90

