Repository navigation
Expand file tree
/
Copy pathvite.vscode.config.ts
More file actions
143 lines (140 loc) · 5.72 KB
/
Copy pathvite.vscode.config.ts
File metadata and controls
143 lines (140 loc) · 5.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import { defineConfig } from 'vite'
/**
* 擴充的建置——**一份設定、兩個目標**。
*
* ```
* SEMORPHE_VSCODE_TARGET=extension CJS · node · 'vscode' external
* SEMORPHE_VSCODE_TARGET=webview ESM · browser · 🔴 膠囊登錄表在這一側
* ```
*
* ## 為什麼是一份設定而不是兩份
*
* 兩份會**各自漂移**,而它們有一半的設定共用。這個專案付過那個學費
* (`history/072`:`c-style-parity` 10/10 全綠,**而瀏覽器上仍然產出
* `<iostream>`**——兩條產出路徑,一條綠一條錯)。
*
* ## 🔴 為什麼**必須**是 Vite(不是 esbuild、不是 tsc 直出)
*
* `src/core/component/registry.ts:22-48` 逐字記著實測結果:
*
* ```
* Vite → CJS 269 KB → node 跑得動 → 189 顆膠囊全部載入 🟢
* esbuild → CJS 4.6 KB → 🔴 import_meta.glob is not a function
* ```
*
* ⚠️ 而 4.6 KB 那個數字才是重點:**esbuild 建得出來,只是膠囊一顆都沒被
* 打包進去**,只發一則 warning,執行期才炸。
*
* > **一個在建置期只發警告、在執行期才炸的相依,
* > 會讓「它建得起來」被讀成「它能用」。**
*
* 🟢 **而網頁版的 `vite.config.ts` 一個字都不動**(FR-006)。
*/
const target = process.env.SEMORPHE_VSCODE_TARGET ?? 'webview'
const OUT = 'build/vscode/dist'
/**
* 🔴 **網頁版的擴充主機是第三個目標**(2026-09-10,使用者在 Codespaces 撞到)。
*
* ```
* command 'semorphe.openBlocks' not found
* ```
*
* 指令沒被註冊,因為**擴充根本沒有啟動**:manifest 只宣告了 `main`,
* 而 `main` 是給 node 擴充主機的。vscode.dev/github.dev/瀏覽器裡的
* Codespaces 用的是 **web worker 擴充主機**,它只讀 `browser` 那一格。
*
* > **一個只宣告了 `main` 的擴充,在網頁版裡不是「壞掉」——
* > 它是【不存在】,而畫面上只看得到一句「找不到那個指令」。**
*
* 🟢 而這一份程式碼**本來就跑得動**:`src/vscode/` 底下一個 node 內建都沒用到
* (`fs`/`path`/`child_process` 全都是零,量過)。所以這是建置的事,不是重寫。
*
* ⚠️ 三個差別,缺一個就是安靜地壞:
*
* ```
* platform browser 打包進 node 的 polyfill 會讓 worker 當場炸
* formats cjs web worker 擴充主機用 `module.exports` 拿 activate
* 檔名 extension.web.js 與 node 那份分開——它們的 platform 不同
* ```
*/
const EXTENSION_ENTRY = 'src/vscode/extension.ts'
export default defineConfig(
target === 'extension-web'
? {
publicDir: false,
build: {
outDir: OUT,
emptyOutDir: false,
// ⚠️ **不是 `ssr: true`**——那會把它當成 node 產物,
// 於是 `platform` 跑掉,而 worker 裡沒有 `process`/`require`。
lib: {
entry: EXTENSION_ENTRY,
formats: ['cjs'],
},
rollupOptions: {
external: ['vscode'],
output: { entryFileNames: 'extension.web.js' },
},
minify: false,
},
}
: target === 'extension'
? {
// 網頁版的 `public/` 不屬於擴充——連 3.6 MB 的 tree-sitter wasm 都會被
// 複製過來,而本輪一個都用不到。Blockly 的 media 由建置腳本明確複製。
publicDir: false,
build: {
outDir: OUT,
emptyOutDir: false,
ssr: true,
lib: {
entry: EXTENSION_ENTRY,
formats: ['cjs'],
},
// `vscode` 由宿主在執行期提供——打包進去的話會找不到。
//
// ⚠️ `entryFileNames` 是必要的:lib 模式的 `fileName` 會被格式覆寫,
// cjs 產出的是 `extension.cjs`,而 manifest 的 `main` 指的是
// `extension.js`——**而 vsce 會擋下來**(實測 2026-08-17)。
rollupOptions: {
external: ['vscode'],
output: { entryFileNames: 'extension.js' },
},
minify: false,
},
}
: {
// 網頁版的 `public/` 不屬於擴充——連 3.6 MB 的 tree-sitter wasm 都會被
// 複製過來,而本輪一個都用不到。Blockly 的 media 由建置腳本明確複製。
publicDir: false,
build: {
outDir: OUT,
emptyOutDir: true,
lib: {
entry: 'src/vscode/webview/main.ts',
formats: ['es'],
fileName: () => 'webview.js',
},
// 🔴 Webview 裡沒有 node_modules——**全部打包進去**,零外部相依。
//
// ⚠️ `inlineDynamicImports` 是刻意的:`i18n/loader.ts` 用
// `await import('./${localeId}/blocks.json')`,而動態 import 會讓
// Rollup 切出額外的 chunk。切出來的話**每一塊都要各自過 CSP 與
// `localResourceRoots`**,而少算一塊的症狀是「積木顯示 `%{BKY_…}`」
// ——又是一個安靜的壞。一個檔案就沒有這個問題。
rollupOptions: {
external: [],
output: {
inlineDynamicImports: true,
// ⚠️ Vite 用 lib 的名字命名 CSS(`semorphe.css`),而 HTML 那側
// 寫的是 `webview.css`——🔴 **對不上的症狀是 404,而面板【還是會出來】,
// 只是沒有樣式**。又是一個「不會拋錯的壞」。
assetFileNames: 'webview[extname]',
},
},
minify: false,
// Blockly 很大;這個門檻只是不要每次都噴警告。
chunkSizeWarningLimit: 4096,
},
},
)