From 5cdfc70818fab69bb17203e0ebe7c22ab275b7b0 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sat, 24 Oct 2026 08:11:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(dev):=20=E8=AF=BB=E5=8F=96=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=20JSON=20=E6=97=B6=E5=89=A5=E7=A6=BB=20UTF-8=20BOM=20?= =?UTF-8?q?=E5=B9=B6=E6=8D=95=E8=8E=B7=E8=A7=A3=E6=9E=90=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 外部编辑器/同步工具写入的 data/*.json 带有 BOM,直接 JSON.parse 会抛错并导致 vite dev server 退出。现在统一剥离 BOM,解析失败时返回 500 而非中断进程。 --- vite.config.mjs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/vite.config.mjs b/vite.config.mjs index 1f3cee3..cf4f3e0 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -103,9 +103,15 @@ const localFileStoragePlugin = () => { const filePath = path.join(dataDir, `${safeKey}.json`); if (fs.existsSync(filePath)) { - const data = fs.readFileSync(filePath, 'utf-8'); - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify({ success: true, data: JSON.parse(data) })); + try { + // 文件可能带 UTF-8 BOM(外部编辑器/同步工具写入),解析前需剥离,否则 JSON.parse 抛错 + const raw = fs.readFileSync(filePath, 'utf-8').replace(/^\uFEFF/, ''); + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({ success: true, data: JSON.parse(raw) })); + } catch (e) { + res.statusCode = 500; + res.end(JSON.stringify({ success: false, error: e.message })); + } } else { res.statusCode = 404; res.end(JSON.stringify({ success: false, error: 'Not found' }));