🐛 fix(vscode): 修复 0.2.270 装上后激活失败:jsonc-parser 改打 ESM 版,打包时先试加载产物

This commit is contained in:
cruldra committed 2026-10-13 11:36:24 +11:00
1 parent a7b85b4370
commit 6d419210c6
3 files changed
+37 -1

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
/* eslint-disable no-console -- 构建脚本,向终端打印检查结果是它的正当输出 */
// 检查打包产物能被扩展宿主加载:给一个桩 vscode 模块,require 产物,顶层代码一抛错就以非零退出。
// 单元测试跑的是源码,看不见打包带来的问题(比如依赖被打成运行时还要 require 自家文件的版本),只有加载产物才能发现。
// 用法:node check-bundle.mjs [产物路径,默认 dist/index.cjs]
import Module, { createRequire } from 'node:module'
import path from 'node:path'
import process from 'node:process'
const bundle = path.resolve(process.argv[2] ?? 'dist/index.cjs')
// 桩:取任何属性、调用、new 都得到它自己,够顶层代码(建 EventEmitter、继承 TreeItem 之类)跑完;
// 被当成值用时(拿枚举成员当对象的键)转成 0,跟真的枚举值一样是个数。底下垫一个类,调用和 new 才都能被截住
const vscodeStub = new Proxy(class {}, {
get: (_, key) => key === Symbol.toPrimitive ? () => 0 : vscodeStub,
apply: () => vscodeStub,
construct: () => vscodeStub,
})
// 扩展宿主也是这样把 vscode 交给扩展的:截住模块加载,请求的是 vscode 就给 API 对象
const load = Module._load
Module._load = function (request, ...rest) {
return request === 'vscode' ? vscodeStub : load.call(this, request, ...rest)
}
try {
createRequire(import.meta.url)(bundle)
console.log(`[check-bundle] ${bundle} 加载正常`)
}
catch (err) {
console.error(`[check-bundle] ${bundle} 加载失败:`)
console.error(err)
process.exit(1)
}
+3
View File
@@ -18,6 +18,9 @@ const options = {
external: ['vscode', 'proxy-agent'], external: ['vscode', 'proxy-agent'],
format: 'cjs', format: 'cjs',
platform: 'node', platform: 'node',
// node 平台默认先认 package.json 的 main,改成先认 module(ESM 入口):jsonc-parser 这类包的 main 是 UMD 版,
// 运行时才 require 自家的 ./impl/*,esbuild 打不进包,装上就加载失败;ESM 版的 import 能整个打进来
mainFields: ['module', 'main'],
target: 'node20', target: 'node20',
sourcemap: !production, sourcemap: !production,
minify: production, minify: production,
+1 -1
View File
@@ -2988,7 +2988,7 @@
} }
}, },
"scripts": { "scripts": {
"build": "pnpm --filter webview-ui build && node esbuild.mjs --production", "build": "pnpm --filter webview-ui build && node esbuild.mjs --production && node check-bundle.mjs",
"dev": "concurrently \"pnpm --filter webview-ui dev\" \"node esbuild.mjs --watch\"", "dev": "concurrently \"pnpm --filter webview-ui dev\" \"node esbuild.mjs --watch\"",
"typecheck": "tsc --noEmit && pnpm --filter webview-ui typecheck", "typecheck": "tsc --noEmit && pnpm --filter webview-ui typecheck",
"lint": "eslint .", "lint": "eslint .",