Azure Pipeline构建React项目npm build报Unexpected token错误
问题描述
在Azure DevOps流水线执行npm run build步骤时失败,错误来自间接依赖,具体报错:
jest-worker/build/index.js:110 _ending; SyntaxError: Unexpected token ";"
相关错误截图:
当前使用的pipeline.yaml配置如下:
trigger: - master pool: vmImage: ubuntu-latest steps: - task: NodeTool@0 inputs: versionSpec: '10.x' displayName: 'Install Node.js' - script: | npm install displayName: 'npm install ' - script: | npm run build displayName: 'npm run build' - task: ArchiveFiles@2 inputs: rootFolderOrFile: 'build' includeRootFolder: true archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip' replaceExistingArchive: true - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
根因分析
这个语法错误是Node.js运行时和依赖版本不匹配导致的:
- 流水线当前配置安装的是Node.js 10.x版本,该版本早在2021年就结束生命周期,不支持ES类公共字段语法
- 报错位置的
_ending;就是jest-worker包使用的类公共字段写法,jest-worker 28.0及以上版本最低要求Node.js 12.13.0,更高版本要求Node 14+,完全无法在Node 10环境下运行 - 流水线用
npm install安装依赖时,没有锁定间接依赖版本,会自动拉取符合上游依赖版本范围的最新jest-worker,最终拉到不兼容版本触发报错
排查步骤
- 本地复现验证:将本地Node版本切换到10.x,删除
node_modules目录和lock文件后重新执行依赖安装和构建命令,会复现和流水线完全一致的报错 - 依赖溯源:在本地项目目录执行
npm ls jest-worker,可以查看jest-worker是被哪个上游构建依赖(通常是webpack、terser-webpack-plugin、jest、react-scripts等)引入的 - 版本核对:查看项目使用的构建框架官方文档,确认其要求的最低Node.js版本,和当前流水线使用的Node 10做兼容性比对
解决方法
按推荐优先级排序:
- 升级Node.js版本(推荐)
这是最彻底的解决方案,Node 10已经停止维护,存在大量安全漏洞和兼容性问题,建议升级到官方维护的LTS版本(16.x/18.x/20.x),和本地开发环境使用的Node版本保持一致即可。修改pipeline.yaml中Node工具任务的版本配置:- task: NodeTool@0 inputs: versionSpec: '18.x' # 替换为你项目实际兼容的LTS版本 displayName: 'Install Node.js' - 锁定间接依赖版本(仅适合无法升级Node的历史项目)
如果项目因为历史原因暂时无法升级Node版本,可以通过包管理器的版本强制覆盖功能,将jest-worker锁定到支持Node 10的最后一个版本27.5.1:- 使用npm(v8及以上版本):在
package.json中添加overrides字段{ "overrides": { "jest-worker": "27.5.1" } } - 使用yarn:在
package.json中添加resolutions字段{ "resolutions": { "jest-worker": "27.5.1" } }
- 使用npm(v8及以上版本):在
- 流水线依赖安装优化
将流水线中的npm install替换为npm ci,该命令会严格按照lock文件记录的版本安装依赖,不会自动升级符合版本范围的包,从流程上避免间接依赖静默升级导致的不兼容问题,修改后的安装步骤:- script: | npm ci displayName: 'Install dependencies'
内容的提问来源于stack exchange,提问作者D S
相关产品推荐
相关产品推荐

