🐛 fix(vscode): 修复 0.2.270 装上后激活失败:jsonc-parser 改打 ESM 版,打包时先试加载产物
This commit is contained in:
1 parent
a7b85b4370
commit
6d419210c6
3 files changed
+37
-1
No files matched your search
@@ -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)
|
||||||
|
}
|
||||||
@@ -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
@@ -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 .",
|
||||||
|
|||||||
Reference in new issue
Block a user