根本原因是vsce package默认递归打包未被.vscodeignore排除的构建产物、node_modules、测试文件、图标字体等冗余内容;必须通过项目根目录的.vscodeignore显式排除out/、dist/、node_modules/等目录,而非依赖package.json的files字段。

VSCode 插件市场上传包体超 50MB 会被拒绝,根本原因不是代码本身大,而是构建产物、未忽略的依赖、调试资源或冗余文件被一起打包进 .vsix —— 这类问题必须在本地构建阶段解决,上传时再压缩已无意义。
为什么 vsce package 生成的 .vsix 远大于源码目录
VSCode 官方打包工具 vsce package 默认递归打包整个工作区(除 .vscodeignore 外),常见膨胀点包括:
-
node_modules/下未被dependencies引用但被devDependencies拉入的包(如typescript、jest) - 构建输出目录(
out/、dist/、lib/)未被排除,且含 sourcemap 或调试用 bundle -
.vscode/目录、test/用例、docs/、CHANGELOG.md等非运行必需文件被包含 - 图标、字体、Webview 页面中嵌入了未压缩的 PNG/SVG/OTF 文件(单个图标包可占 20MB+)
必须配 .vscodeignore 而非仅靠 package.json 的 files 字段
files 字段只控制 npm publish 行为,vsce package 完全不读它;真正起效的是项目根目录下的 .vscodeignore,规则语法同 .gitignore:
- 必须显式写
node_modules/**(即使你用了 pnpm,也要加node_modules/.pnpm/**) - 加
out/**、dist/**、lib/**、test/**、docs/**、.vscode/** - 排除大资源:
**/*.psd、**/*.zip、**/fonts/**(若字体非运行必需) - 不要写
src/**—— 那会把源码也删掉;VS Code 插件要求源码(或编译后 JS)必须存在
检查 vsix 实际内容再上传
别信 ls -lh 看源码目录大小,要验证打包结果:
- 运行
vsce package --no-yarn(避免 yarn 自动装 devDeps)生成.vsix - 用
unzip -l your-extension-1.0.0.vsix | head -20查看顶层结构 - 用
unzip -l your-extension-1.0.0.vsix | grep -E '\.(png|svg|ttf|woff|map)$' | wc -l快速定位资源文件数量 - 若发现
node_modules/typescript/或out/test/存在,说明.vscodeignore没生效或路径写错
CI 中自动校验包体大小防上传失败
上传前加一行检查,避免因超限被市场拒收后返工:
vsce package --no-yarn && [ $(stat -c%s "your-extension-*.vsix" 2>/dev/null || stat -f%z "your-extension-*.vsix") -lt 52428800 ] || (echo "ERROR: .vsix larger than 50MB" && exit 1)
Linux/macOS 可用该命令;Windows CI 中可用 PowerShell:if ((Get-Item "your-extension-*.vsix").Length -gt 50MB) { throw "vsix too large" }。真正的瓶颈往往不在逻辑代码,而在你忘了删掉本地 out/ 目录里上个月留下的调试 build。











