时不时会遇到这个问题,经常忘记,记录一下
适用场景
当你在 Apple Silicon Mac(M1/M2/M3)上执行 nvm install v14 失败,并出现类似以下编译报错时:
-Wenum-constexpr-conversionmake[1]: *** ... Error 1- 失败位置通常在
deps/v8/...
根因
- 当前机器是
arm64(Apple Silicon)。 node v14.21.3没有darwin-arm64官方预编译包。nvm下载二进制失败后会自动回退到源码编译。- Node 14 内置的 V8 与较新的 Apple clang(如 clang 15)存在兼容问题,导致源码编译失败。
一句话:不是 nvm 坏了,而是“老 Node + 新编译器 + arm64 源码编译”组合不兼容。
快速修复(推荐)
通过 Rosetta 在 x86_64 环境安装 Node 14,让 nvm 下载 darwin-x64 预编译包,避免源码编译。
# 1) 进入 x86_64 shell
arch -x86_64 zsh
# 2) 加载 nvm
export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"
# 3) 安装并启用 Node 14
nvm install 14.21.3
nvm use 14.21.3
# 4) 可选:设为默认版本
nvm alias default 14.21.3
验证安装结果
node -v
node -p "process.arch"
预期结果:
node -v输出v14.21.3process.arch输出x64
这是正常且可用的(即便机器本身是 arm64)。
通用排查模板(以后可复用)
# 看机器架构
uname -m
# 看编译器版本
clang --version
判断逻辑:
- 如果目标 Node 版本没有对应平台预编译包,nvm 会回退源码编译。
- 老版本 Node 在新系统上源码编译失败很常见。
- 优先尝试 Rosetta + x64 二进制安装,通常比降级 Xcode/clang 更省时稳定。
常见误区
-
误区 1:
nvm install失败就是 nvm 本身坏了。- 实际上多数是目标版本与系统编译环境不兼容。
-
误区 2:看到
--arch=x64就一定能在 arm64 shell 直接下载 x64 包。- 实际上常见情况下仍会按当前 shell 架构走下载逻辑。
- 最稳方式是直接在
arch -x86_64 zsh中执行 nvm。
本次问题结论(可直接复述)
你的安装失败原因是:Node 14 在 macOS arm64 上没有对应预编译包,nvm 回退源码编译时触发了 Node 14 的 V8 与 clang 15 的兼容问题。修复方式是在 Rosetta 的 x86_64 shell 下安装 Node 14.21.3,使用 x64 预编译包绕过源码编译。