npm install 必须显式指定版本号,否则默认安装 latest 版本,易导致协作环境不一致或 CI 失败;VSCode 不参与依赖解析,行为完全由 npm CLI 决定。

npm install 必须显式指定版本号
VSCode 不参与依赖解析,npm install 行为完全由 npm CLI 决定。不写版本号(如 npm install axios)等价于 npm install axios@latest,极易导致协作环境不一致或 CI 失败。
常见错误现象:本地开发时功能正常,CI 构建失败,报错 Cannot find module 'xxx' 或类型不匹配——往往是因为 package.json 里没锁版本,不同机器拉到了不同 minor/patch 版本。
- 装精确版本:
npm install lodash@4.17.21 - 装兼容主版本的最新版(推荐用于 runtime 依赖):
npm install react@^18.2.0 - 装兼容次版本的最新版(适合 bugfix 密集型包):
npm install semver@~7.5.4 - 从
package.json安装所有已声明版本:npm install(前提是dependencies字段已含带版本号的条目)
vsce package 会打包 node_modules 中实际用到的模块
VSCode 插件发布为 .vsix 文件,本质是 zip 包,它不引用用户机器上的全局 node_modules,而是把构建时本地 node_modules 中被代码 import/require 的模块一起打进包里。
容易踩的坑:只在 devDependencies 里写了 axios,但插件代码里用了它——vsce package 不会包含,运行时报 Cannot find module 'axios'。
- 所有运行时依赖必须列在
dependencies(不是devDependencies) - 打包前务必执行
npm install,确保node_modules完整且与package.json一致 - 用
npm ls axios验证是否真被安装并可解析,而不是只看package.json有没有写 - 避免使用
^或~发布前未锁定:CI 打包时可能拉到不兼容的新版,建议发布前跑npm install --no-package-lock && npm install强制重装并校验
Version Lens 显示的 “latest” 默认不是 registry 最新版
悬停在 package.json 的依赖行上,Version Lens 提示的 “latest” 实际是 wanted 版本——即满足你当前 semver 范围(如 ^1.2.0)的最高兼容版,不是 npm registry 标记为 latest 的绝对最新版。
例如你写的是 "typescript": "^4.9.5",插件可能显示 “latest: 4.9.5”,而真实 npm view typescript version 返回的是 5.5.4,但因主版本不兼容,它不会提示。
- 要看到 registry 绝对最新版,必须设 VSCode 设置项
versionLens.showLatestVersion为true - 改完设置后需关闭再重新打开
package.json,否则缓存不刷新 - 私有源需同步配置
versionLens.npmRegistry,否则全显示N/A - 最终仲裁以终端命令为准:
npm view <pkg> version查 latest,npm outdated查可升级范围
extensionDependencies 和 dependencies 完全不是一回事
extensionDependencies 是插件对「其他 VSCode 插件」的依赖,比如你的插件需要 ms-python.python 提供的 Python API;而 dependencies 是对「npm 包」的依赖,比如 axios 或 lodash。两者混淆会导致加载失败或功能缺失。
典型错误:把 ms-python.python 错写进 dependencies,结果 vsce package 把整个 Python 插件源码打进了你的 .vsix——这不仅体积爆炸,而且根本无法运行。
-
extensionDependencies只声明 ID(如"ms-python.python"),VSCode 启动时检查该插件是否已安装并启用,不打包、不下载 -
dependencies必须是 npm 包名,且必须通过npm install安装到本地node_modules,才能被vsce package打包进去 - 如果插件依赖某个语言服务器(如
pyright),不要把它当 npm 包装进dependencies,应作为独立进程调用,或明确文档说明需用户手动安装对应插件
node_modules 的文件系统路径,也不动态解析 package.json 的版本字段;它只认打包进 .vsix 的那一份代码。所以任何“本地能跑,发布后报错”的问题,第一反应就该是检查 vsce package 前有没有漏装、错装、或误删依赖。


















