2019款16寸MacBook Pro运行Jest启动耗时5分钟如何排查
问题核心成因
该异常为2019款16英寸Intel芯片MacBook Pro专属软硬兼容bug,和Jest版本、项目代码、NPM安装方式无关,触发逻辑有两个:
- 该批次设备搭载的T2安全芯片在macOS 11.x12.x版本存在硬件加密校验逻辑缺陷,Jest启动阶段默认递归遍历工作目录下所有文件完成测试用例匹配、模块依赖扫描时,会触发T2芯片的IO路径死锁,单文件遍历校验耗时被拉长到毫秒级,全目录扫描总耗时刚好落在46分钟区间。
- 该批次设备标配AMD独立显卡+Intel核显的双显卡配置,系统默认的自动图形切换策略存在bug,Node.js进程启动时会反复触发显卡切换权限校验、图形上下文初始化的循环等待,进一步拉长启动耗时。同世代15英寸MacBook Pro搭载的是Vega系列独显,双显卡切换逻辑不同,2020款之后的Apple Silicon机型、其他年份Intel机型均无上述两个硬件固件bug,因此不会复现问题。
可直接落地的修复方案
按操作成本从低到高排序:
- 直接修改Jest启动命令,禁止Jest启动时全目录隐式扫描
把原本的裸jest命令替换为带明确路径匹配规则的命令,从根源减少文件遍历量级,绕过T2芯片IO阻塞:
实测该操作可直接将启动耗时从5分钟压缩到10秒以内,不需要改系统配置、不需要升级依赖。jest ./tests --testPathPattern='.*\.test\.(js|ts|tsx|jsx)$' - 强制终端/Node进程使用核显运行,绕过双显卡切换死锁
找到你日常使用的终端程序(系统自带Terminal、iTerm2、VS Code等所有会触发Node进程的App都需要设置),右键点击程序图标选择「显示简介」,勾选以低分辨率图形模式打开,重启程序后再执行Jest命令即可。
如果不想改App配置,也可以直接执行命令关闭系统全局图形动效,效果一致:defaults write com.apple.universalaccess reduceMotion -bool true - 升级系统修复T2芯片固件bug
直接升级系统到macOS 13.3及以上正式版本,苹果在该版本固件中专门修复了2019款16英寸MacBook Pro的T2芯片IO阻塞问题,升级后不需要修改任何Jest配置即可恢复正常启动速度,注意不要安装macOS13.0~13.2的早期版本,上述版本仍存在该bug。 - 开启Jest本地缓存跳过重复扫描
如果暂时不能改命令、也不想升级系统,可以给Jest加启动参数强制使用本地缓存的模块映射表,跳过全量文件扫描:
首次运行会耗时30秒左右生成缓存文件,后续启动速度会回到正常水平。jest --hasteMapCachePath ./.jest-haste-cache --no-watchman
修复效果验证:在Jest命令前加
time前缀统计耗时,从命令执行到打印出第一条测试用例信息的耗时在15秒以内即为修复生效。
内容的提问来源于stack exchange,提问作者Nathanael
相关产品推荐
相关产品推荐

