必须执行npm install并确保依赖列在dependencies中,vsce package才可将其打入.vsix;动态引入的需显式require一次,原生模块如fs不可用,须改用vscode.workspace.fs api。

vsce package 时依赖没打进 .vsix 怎么办
VSCode 插件的 dependencies 不会自动“联网加载”,必须在打包前已存在于本地 node_modules 中,且被 vsce package 实际扫描到。常见错误是只写了 package.json 里的依赖声明,却没执行 npm install,导致打包后运行时报 Error: Cannot find module 'lodash'。
- 确保所有运行时依赖(如
axios、glob、js-yaml)都列在dependencies字段,而非devDependencies - 执行
npm install(不是npm ci,后者跳过package-lock.json的兼容性校验,有时漏装可选原生模块) - 用
npm ls <pkg-name></pkg-name>验证依赖是否解析成功,例如npm ls glob应返回树形结构,而非empty -
vsce package默认只打包被代码实际require()或import的模块,若依赖仅用于条件分支或动态require(),需在入口文件中显式引入一次(哪怕不执行),否则会被剔除
插件里 require('fs') 为什么报错?
VSCode 插件运行在受限的 Node.js 环境(主进程或扩展主机进程),并非完整 Node.js 运行时。fs、child_process、net 等核心模块默认不可用——不是路径问题,而是权限策略拦截。直接 require('fs') 会抛出 TypeError: fs.readFileSync is not a function 或静默失败。
- 读写文件请统一走 VSCode 提供的 API:
vscode.workspace.fs.readFile()、vscode.workspace.fs.writeFile() - 需要底层文件操作(如递归扫描、符号链接处理)时,可启用
activationEvents中的onStartupFinished,并在激活后调用vscode.env.appRoot获取安装路径,再通过vscode.workspace.fs操作;不要尝试拼接系统路径硬读 - 若真需 Node.js 原生能力(如编译、spawn),必须起独立子进程,并通过
vscode.window.withProgress管理生命周期,避免阻塞 UI
如何让插件正确识别 workspace 中的 node_modules
VSCode 插件**不会**自动继承工作区(workspace)根目录下的 node_modules。每个插件拥有独立的 node_modules,这是设计使然,也是隔离依赖冲突的基础。试图让插件“复用项目 node_modules”本质是反模式,极易引发版本错乱或安全漏洞。
- 插件自身逻辑所需的一切依赖,必须明确声明在自己
package.json的dependencies中,并随插件一起打包 - 若插件需与当前打开的项目协作(如读取其
tsconfig.json或调用其本地 CLI),应通过vscode.workspace.getConfiguration()或vscode.workspace.findFiles()定位项目文件,再用vscode.workspace.fs读取,而非require项目里的包 - 例外:调试器或语言服务器类插件可通过
debug或language-features激活事件,在用户项目上下文中启动独立进程,此时才可能使用项目node_modules/.bin下的二进制,但该进程与插件代码本身完全隔离
自定义 extensions-dir 后依赖路径还有效吗
有效,但仅限于插件自身的 node_modules。修改 --extensions-dir 只影响插件物理存放位置,不影响插件内部模块解析逻辑——它仍按 CommonJS 规范从自身 node_modules 目录下查找 require() 的路径,与 extensions-dir 所在磁盘无关。
- 路径变更后,需重新执行
vsce package→vsce publish或手动复制.vsix,旧插件不会自动迁移 - 若插件代码里硬编码了类似
path.join(__dirname, '../node_modules')这种相对路径,会失效;应始终用require.resolve('pkg-name')获取模块绝对路径 - 多环境部署时(如 CI 构建 + 用户机器安装),务必确认
vsce版本一致,低版本vsce可能忽略某些optionalDependencies或打包规则变更
package.json 是唯一权威,node_modules 是唯一可信源,任何绕过这两者的路径操作,迟早会在某个用户机器上触发静默失败。











