Skip to content

Commit b2a704c

Browse files
committed
fix(compiler): improve error handling in worker compilation process
1 parent e189998 commit b2a704c

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

fe/packages/compiler/src/index.js

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,17 @@ function runCompileInWorker(script, ctx, task) {
128128
const totalTasks = Object.keys(ctx.pages.mainPages).length
129129
+ Object.values(ctx.pages.subPages).reduce((sum, item) => sum + item.info.length, 0)
130130

131+
let isResolved = false
132+
let workerError = null
133+
134+
// 统一的错误处理函数,防止重复 reject
135+
const handleError = (error) => {
136+
if (isResolved) return
137+
isResolved = true
138+
worker.terminate()
139+
reject(error)
140+
}
141+
131142
worker.postMessage({ pages: ctx.pages, storeInfo: ctx.storeInfo })
132143
// 接收 Worker 完成后的消息
133144
worker.on('message', (message) => {
@@ -142,8 +153,10 @@ function runCompileInWorker(script, ctx, task) {
142153
}
143154

144155
if (message.success) {
145-
resolve()
156+
if (isResolved) return
157+
isResolved = true
146158
worker.terminate()
159+
resolve()
147160
}
148161
else if (message.error) {
149162
const error = new Error(message.error.message || message.error)
@@ -153,20 +166,29 @@ function runCompileInWorker(script, ctx, task) {
153166
error.file = message.error.file
154167
if (message.error.line)
155168
error.line = message.error.line
156-
reject(error)
157-
worker.terminate()
169+
handleError(error)
158170
}
159171
}
160172
catch (err) {
161-
reject(new Error(`Error processing worker message: ${err.message}\n${err.stack}`))
162-
worker.terminate()
173+
handleError(new Error(`Error processing worker message: ${err.message}\n${err.stack}`))
163174
}
164175
})
165176

166-
worker.on('error', reject)
177+
worker.on('error', (err) => {
178+
// 保存错误信息,可能在 exit 事件中使用
179+
workerError = err
180+
handleError(err)
181+
})
167182
worker.on('exit', (code) => {
168-
if (code !== 0) {
169-
reject(new Error(`Worker stopped with exit code ${code}`))
183+
if (code !== 0 && !isResolved) {
184+
// 如果已经有 workerError,使用它;否则创建新的错误
185+
// 退出码 1 通常表示内存溢出或其他致命错误
186+
const error = workerError || new Error(
187+
code === 1
188+
? 'Worker terminated due to reaching memory limit: JS heap out of memory'
189+
: `Worker stopped with exit code ${code}`
190+
)
191+
handleError(error)
170192
}
171193
})
172194
}))

0 commit comments

Comments
 (0)