Angular 7生产构建报错:JSON位置0处存在意外token
问题根因
- 报错中的
是UTF-8编码的BOM(字节顺序标记)不可见字符,Unexpected token in JSON at position 0说明被解析的JSON文件开头携带了该字符,原生JSON.parse方法不识别带BOM的JSON内容,直接抛出语法错误。 - 从错误调用栈可以定位,报错发生在
@angular-devkit/build-angular的Service Worker构建逻辑中:开发模式执行ng serve时不会触发PWA Service Worker的清单生成流程,只有生产构建时才会读取相关JSON配置生成最终的ngsw.json文件,因此开发环境运行完全正常,仅生产构建阶段报错。 - 对应Angular 7.2.2版本的
@angular-devkit/build-angular属于早期版本,读取文件时没有内置BOM头自动去除逻辑,你之前仅修改了package.json、angular.json、package-lock.json的编码,漏掉了Service Worker相关的配置文件:根据你的angular.json配置,项目开启了Service Worker,对应配置文件为根目录的ngsw-config.json,同时静态资源中引入了src/manifest.json,这两个文件(或其他被Service Worker构建流程读取的JSON资源)为带BOM的UTF-8格式,是报错的直接来源,该问题属于文件本身编码问题,与操作系统无关,因此Windows、Linux环境报错表现一致。
解决步骤
- 定位所有涉及的JSON文件:重点排查项目根目录的
ngsw-config.json、src目录下的manifest.json,以及所有被Service Worker缓存规则命中的JSON类静态资源。 - 转码处理:将上述文件全部转换为无BOM的UTF-8编码
- 使用VS Code操作:打开目标文件后,点击右下角状态栏的编码标识,选择「通过编码重新保存」,选中不带BOM的
UTF-8选项即可。注意不要用Windows系统自带记事本保存JSON文件,记事本默认会为UTF-8格式文件添加BOM头。 - 使用IDEA/WebStorm操作:打开目标文件后,依次点击菜单栏「文件-文件属性-移除BOM」即可完成转码。
- 使用VS Code操作:打开目标文件后,点击右下角状态栏的编码标识,选择「通过编码重新保存」,选中不带BOM的
- 问题验证:可以先临时把angular.json中build配置项的
"serviceWorker": true改为false,执行一次生产构建,如果构建顺利通过,即可确认问题确实出在Service Worker相关JSON文件的BOM头上,验证完成后改回Service Worker配置,将对应文件转码后即可正常构建。 - 可选兼容调整:Angular 7.2.2官方适配的Node最高版本为14.x,如果你完成上述转码操作后仍遇到其他构建异常,可以将Node版本降级到14.x,规避高版本Node与旧版Angular构建工具的兼容问题。
内容的提问来源于stack exchange,提问作者Afonso Dutra Nogueira Filho
相关产品推荐
相关产品推荐

