You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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做兼容性比对
解决方法

按推荐优先级排序:

  1. 升级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'
    
  2. 锁定间接依赖版本(仅适合无法升级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"
        }
      }
      
    修改后重新提交lock文件到代码仓库,流水线安装依赖时就会拉取兼容Node 10的jest-worker版本。
  3. 流水线依赖安装优化
    将流水线中的npm install替换为npm ci,该命令会严格按照lock文件记录的版本安装依赖,不会自动升级符合版本范围的包,从流程上避免间接依赖静默升级导致的不兼容问题,修改后的安装步骤:
    - script: |
        npm ci
      displayName: 'Install dependencies'
    

内容的提问来源于stack exchange,提问作者D S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:16:00