CircleCI执行Angular应用ng test报SyntaxError错误排查
故障根因
报错核心原因是CircleCI环境的Node版本与项目依赖的Angular CLI版本不兼容。
你当前配置使用的基础镜像为circleci/node:7.10.1-browsers,对应Node 7.10.1、npm 4.2.0,该版本Node发布时间远早于当前主流Angular CLI版本,不支持ES2017+的函数参数尾逗号、async/await等新语法,Angular CLI入口脚本执行时,解析器无法识别高版本语法,直接抛出SyntaxError: Unexpected token )错误终止流程。
修复方案
按以下步骤调整配置即可解决问题:
- 替换匹配Angular版本要求的Node基础镜像
先确认本地项目Angular版本对应的Node兼容要求:- Angular 12+ 要求Node版本不低于12.20.0/14.15.0/16.10.0
- Angular 13~15 推荐使用Node 16/18 LTS长期支持版本
将config.yml中的Docker镜像替换为对应Node版本的预装浏览器镜像,例如Node 16版本使用cimg/node:16.18-browsers,弃用老旧的7.x版本镜像。
- 补充Chrome浏览器安装步骤
配置中已经引入了browser-toolsorb,但未添加Chrome安装步骤,Node版本问题修复后,执行测试时会因找不到Chrome Headless环境再次报错,需要在步骤中显式安装Chrome。 - 迭代缓存key版本
原有v1版本的缓存是基于Node 7环境生成的,切换Node版本后旧缓存会导致依赖冲突,需要升级缓存key版本,同时建议CI环境使用npm ci代替npm install,依赖安装速度更快、版本完全遵循lock文件,结果更稳定。
修正后的完整config.yml参考如下:
version: 2.1 orbs: node: circleci/node@5.0.2 browser-tools: circleci/browser-tools@1.2.3 jobs: build: docker: # 请根据实际项目Angular版本替换为匹配的Node版本镜像,示例为Node 16 LTS - image: cimg/node:16.18-browsers steps: - checkout # 安装Chrome供Headless模式测试使用 - browser-tools/install-chrome - restore_cache: keys: - v2-dependencies-{{ checksum "package.json" }} - v2-dependencies- - run: npm ci - save_cache: paths: - node_modules key: v2-dependencies-{{ checksum "package.json" }} - run: npm run test
- 额外注意:需要提前在项目的
karma.conf.js中配置ChromeHeadlessCI自定义启动器,否则执行测试时会报启动器不存在错误,参考配置:
// karma.conf.js module.exports = function (config) { config.set({ // 保留原有其他配置项 browsers: ['Chrome', 'ChromeHeadlessCI'], customLaunchers: { ChromeHeadlessCI: { base: 'ChromeHeadless', flags: ['--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage'] } }, singleRun: true }) }
内容的提问来源于stack exchange,提问作者Toseef_Ahmed
相关产品推荐
相关产品推荐

