- Published on
Apple Silicon 與 Node.js 安裝那些事:理解 Rosetta、arch、arm64、i386
- Authors
- Name
由於在 Mac 中安裝相當舊版本的 node JS 的過程中,碰到一些問題,沒想到就順手了解 Rosetta、arch、arm64、i386 這些名詞的意義 💻。
什麼是 Rosetta?
官方文件描述:「Rosetta 2 可讓配備 Apple 晶片的 Mac 使用專為配備 Intel 處理器的 Mac 所開發的 App。」
稍微詳細的解釋 Rosetta 是 Apple 為了協助 Mac 電腦在 架構過渡期間(從 Intel x86_64 轉向 Apple 自家晶片 ARM 架構,如 M1、M2)而推出的轉譯層(translation layer)。
簡單說,它讓原本只能在 Intel CPU 上執行的 App,也能在 Apple Silicon 上執行。
常見使用場景
要執行的工具或 App 沒有支援 ARM 架構(例如某些老工具:nvm, node, docker, brew,尤其是它們早期版本)
例如,在 M1 Mac 上想執行只支援 Intel 架構的 node 或 nvm: arch -x86_64 zsh
這指令會啟動一個模擬 Intel 架構的 zsh 環境,並透過 Rosetta 執行。
安裝方式
如果系統提示 Rosetta 尚未安裝,可以用這條指令安裝: softwareupdate --install-rosetta
arch、arm64、i386 是什麼?
arch
是指令,而 arm64
、i386
是 CPU 架構模式。
在 macOS(或其他類 Unix 系統)裡,arch
這個指令會顯示目前這個 shell(或程式)是在什麼 CPU 架構下執行。
arch 指令常見輸出 arm64
→ Apple Silicon(M1/M2/M3)原生模式
i386
→ Intel x86_64 模式(在 Apple Silicon 上,通常是透過 Rosetta 轉譯執行)
arch -x86_64 zsh
意思是:用 Rosetta(x86_64 架構)啟動一個新的 zsh shell。這樣做可以在 Apple Silicon 上執行需要 Intel 架構的工具或二進位檔。
簡單來說
arch
→ 查詢或指定執行程式的 CPU 架構arch -x86_64 <command>
→ 以 Intel 模式跑這個<command>
arch -arm64 <command>
→ 以 ARM 模式跑這個<command>
(通常不必手動指定)
--shared-zlib
的意思是?
安裝 node 指令中 --shared-zlib
編譯 Node.js 時,使用系統中共用的 zlib(壓縮函式庫)而不是內建的 zli
這個參數是給需要自己編譯 Node.js 原始碼時使用的 flags。
nvm 安裝 Node.js 時會從原始碼或預編譯的版本來安裝,這個 flag 會改變:
- 使用本機系統安裝的 zlib 庫(共享)
- 而非使用 Node.js 預設內建的版本
用途很專業化,通常只有在你需要:
- 減少 binary 大小
- 或與系統上的 zlib 保持一致性(例如在某些 Linux 環境下)
想解決的問題 & 解法:
Problem 需要安裝 node 14 左右的舊版本來跑 gulp,但在 mac 筆電中無法正確安裝
Answer 執行順序
softwareupdate --install-rosetta
→ 安裝 Rosettaarch -x86_64 zsh
→ zsh shell 執行 Intel 架構工具export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
→ 若 zsh 中找不到 nvm 指令,啟用 nvmnvm install v14.xx.xx --shared-zlib
→ 安裝 node 14,指定安裝時使用系統共用的 zlib 壓縮函式庫來編譯