这是典型的BOM头干扰问题,Node.js读取UTF-8带BOM的JSON文件时,开头的\uFEFF字符导致SyntaxError;需在VSCode中设为UTF-8无BOM编码,或在代码中用replace(/^\uFEFF/, '')清除。

Node读取JSON文件报SyntaxError: Unexpected token \uFEFF
这是典型的BOM头干扰问题。Node.js的fs.readFileSync或fs.readFile读取UTF-8带BOM的文件时,会在字符串开头插入\uFEFF(即EF BB BF字节),导致JSON解析器把这仨字节当作非法字符处理。
常见现象:SyntaxError: Unexpected token \uFEFF in JSON at position 0,或者在BeJson等校验工具里直接标红第一个{前的空白区域。
- 不是文件编码选错(UTF-8无BOM才安全),而是编辑器默认保存时加了BOM
- VSCode本身不加BOM,但某些插件(如“Auto Rename Tag”旧版)、外部工具(Notepad++、某些IDE导出)或Windows记事本可能悄悄写入
- 用
Buffer.from(data).toString('hex')能一眼看到开头是否为efbbbf
vscode里如何避免保存带BOM的JSON文件
VSCode默认保存为UTF-8无BOM,但需确认当前文件编码设置没被意外覆盖。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 右下角状态栏点击编码名称(如“UTF-8”),选择
Reopen with Encoding → UTF-8(不是“UTF-8 with BOM”) - 若已打开带BOM文件,先选
Save with Encoding → UTF-8,它会自动剥离BOM并重存 - 全局禁用BOM:在VSCode设置里搜索
files.autoGuessEncoding,设为true;再搜files.encoding,设为utf8(非utf8bom) - 对
.json文件类型单独加固:在settings.json里加"files.encoding": "utf8",并确保没有针对json语言的覆盖配置
Node端兼容读取带BOM的JSON文件
不能总指望前端/编辑器不写BOM,服务端代码得有兜底能力。
- 读取后手动剔除BOM:
const content = fs.readFileSync('./config.json', 'utf8').replace(/^\uFEFF/, '') - 更稳妥的做法是用
fs.readFileSync(path, null)读成Buffer,再手动解码:Buffer.from(fs.readFileSync('./config.json')).toString('utf8').replace(/^\uFEFF/, '') - 如果用
require('./config.json'),Node内部已处理BOM,但仅限CommonJS模块且文件必须是纯JSON(不能含注释、尾逗号等) - ESM环境下
import不支持JSON,必须用fs读取,此时BOM必须显式清除
为什么__dirname + JSON路径组合后仍报错
当package.json里写了"type": "module",且你用fs.readFileSync(path.join(__dirname, 'data.json'))读取时,BOM问题会和ESM限制叠加——__dirname在ESM中未定义,而你手动定义的__dirname若没处理BOM,错误依旧。
- 先确保
__dirname定义正确:import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); - 再对读取结果做BOM清洗:
JSON.parse(content.replace(/^\uFEFF/, '')) - 别依赖
require()在ESM项目里加载JSON,它会直接报ERR_REQUIRE_ESM - 如果用
fetch()从本地file://读JSON,浏览器也认BOM,得同样清洗
BOM是个隐形问题,它不报编码错误,只让JSON解析器卡在第一个字符。排查时别只盯括号和引号,先看十六进制输出——efbbbf一出现,基本就是它。

















