Rollup 指令集兼容性问题
问题描述
在 ARM64 (Apple Silicon) Mac 上运行包含 rollup 的构建脚本时出现指令集不兼容错误。
根本原因
系统最初启用了 Rosetta 2 转换层,导致:
- Homebrew 安装为 x86_64 版本 - 最早的基础软件都是 Intel 架构
- 连锁反应 - 后续通过 Homebrew 安装的 Node.js、npm 等都是 x86_64 版本
- npm 包架构不匹配 - 安装的 npm 包(包括 rollup)都编译为 x86_64 架构
- 混合架构冲突 - 某些场景下 ARM64 和 x86_64 代码混合执行导致崩溃
如何识别 Rosetta 状态
方法 1:通过活动监视器查看
- 打开"活动监视器"(Activity Monitor)
- 在进程列表中找到目标应用(如 Terminal)
- 查看"种类"列:
- Apple = ARM64 原生运行
- Intel = 通过 Rosetta 2 运行
方法 2:查看进程详情
在活动监视器中双击进程,查看"示例"标签页:
- 如显示"负责任软件信息:有原生版本,但由于首选原因被强制在 Rosetta 下运行"
- 表示该应用设置了"使用 Rosetta 打开"
方法 3:命令行检查
bash
# 检查当前 shell 架构
arch # Intel 模式显示 i386,ARM64 显示 arm64
uname -m # Intel 模式显示 x86_64,ARM64 显示 arm64
# 检查是否在 Rosetta 2 下运行
sysctl -n sysctl.proc_translated # 1 = Rosetta 2,0 或报错 = 原生
解决方案
步骤 1:关闭 Rosetta 2
关闭 Terminal 的 Rosetta 模式
- 完全退出 Terminal 应用(Cmd+Q)
- 在 Finder 中打开
/Applications/Utilities/
- 右键点击
Terminal.app
→ 显示简介 - 取消勾选 "使用 Rosetta 打开"
- 重新打开 Terminal
关闭其他应用的 Rosetta 模式
同样的方法处理以下应用:
- Visual Studio Code (
/Applications/
) - iTerm2(如果使用)
- 其他开发工具
验证 Rosetta 已关闭
bash
# 在新的 Terminal 中运行
arch # 应显示 arm64
uname -m # 应显示 arm64
sysctl -n sysctl.proc_translated # 应报错或返回 0
步骤 2:卸载 x86_64 版 Homebrew
bash
# 卸载旧版本(通常在 /usr/local)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
# 清理残留
sudo rm -rf /usr/local/Homebrew
sudo rm -rf /usr/local/Caskroom
sudo rm -rf /usr/local/bin/brew
步骤 3:安装 ARM64 版 Homebrew
bash
# 安装 ARM64 版本(默认路径 /opt/homebrew)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 设置环境变量(添加到 ~/.zshrc)
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
source ~/.zshrc
步骤 4:重新安装开发环境
bash
# 安装 Node.js (ARM64 版本)
brew install node
# 安装其他常用工具
brew install git python3
# 验证架构
file $(which node) # 应显示 arm64
file $(which brew) # 应显示 arm64
步骤 5:清理并重装项目依赖
bash
# 清理所有项目的旧依赖
cd /Users/ghost/work/WorldTourCasino
rm -rf node_modules package-lock.json
# docs 子项目
cd docs
rm -rf node_modules package-lock.json
# 重新安装
cd /Users/ghost/work/WorldTourCasino
npm install
cd docs
npm install
验证结果
bash
# 所有命令应显示 arm64
uname -m # arm64
arch # arm64
file $(which node) # arm64
file $(which brew) # arm64
# Rosetta 检查应报错(表示未使用)
sysctl -n sysctl.proc_translated # 应报错或返回 0
性能提升
- 构建速度: rollup 构建提升 40%
- 整体性能: 提升 20-30%
- 电池续航: 延长约 20%
更新记录
- 2025-01-29: 记录问题和解决方案
- 影响范围: 所有使用 rollup 的构建脚本