Skip to content

Rollup 指令集兼容性问题

问题描述

在 ARM64 (Apple Silicon) Mac 上运行包含 rollup 的构建脚本时出现指令集不兼容错误。

根本原因

系统最初启用了 Rosetta 2 转换层,导致:

  1. Homebrew 安装为 x86_64 版本 - 最早的基础软件都是 Intel 架构
  2. 连锁反应 - 后续通过 Homebrew 安装的 Node.js、npm 等都是 x86_64 版本
  3. npm 包架构不匹配 - 安装的 npm 包(包括 rollup)都编译为 x86_64 架构
  4. 混合架构冲突 - 某些场景下 ARM64 和 x86_64 代码混合执行导致崩溃

如何识别 Rosetta 状态

方法 1:通过活动监视器查看

  1. 打开"活动监视器"(Activity Monitor)
  2. 在进程列表中找到目标应用(如 Terminal)
  3. 查看"种类"列:
    • 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 模式

  1. 完全退出 Terminal 应用(Cmd+Q)
  2. 在 Finder 中打开 /Applications/Utilities/
  3. 右键点击 Terminal.app → 显示简介
  4. 取消勾选 "使用 Rosetta 打开"
  5. 重新打开 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 的构建脚本

Released under the MIT License.