M1 macbook 使用nvm安装旧版本node踩坑
nvm安装
官方提供的安装命令是:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
我在安装之前看了网上的反馈,普遍说使用此方法安装,nvm的相关环境变量(也就是下面几行)信息会被写入.bash_profile
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
因为macos的默认shell是zsh,最终导致每次启动shell不能加载nvm命令。
怀疑跟最后的bash命令有关?决定手动安装:
# 手动下载install.sh脚本
curl -O https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh
# 赋予执行权限
chmod +x install.sh
# 执行安装
./install.sh
安装完成后,上面几行环境变量被正确写入.zshrc
中,重启终端后即可使用nvm命令。
安装node
看了一下官方文档,直接使用nvm install $version
即可安装对应版本的node
安装最新版本
先安装一个最新版本:
# node是最新版本的alias
nvm install node
一切正常,看下载的文件名是arm64的版本
安装v14旧版本
公司服务器使用的是v14.17.0
,去node.js
官网看了版本发布日期在2021年5月,按理说应该支持m1了。
➜ nodetest nvm install 14.17.0
Downloading and installing node v14.17.0...
Local cache found: ${NVM_DIR}/.cache/bin/node-v14.17.0-darwin-x64/node-v14.17.0-darwin-x64.tar.xz
Checksums match! Using existing downloaded archive ${NVM_DIR}/.cache/bin/node-v14.17.0-darwin-x64/node-v14.17.0-darwin-x64.tar.xz
Now using node v14.17.0 (npm v6.14.13)
从执行下载的文件名node-v14.17.0-darwin-x64.tar.xz
可以看出,使用nvm安装v14时,默认安装的是x64版本,不是arm版本。(缓存信息请忽略,因为我之前跑过一遍了)
根据node官方示例,服务倒是能正常启动,就是心里有点不爽,想要使用原生arm版本。
从源码编译安装arm64原生版本
经过查看nvm官方文档和一些node版本相关的信息:
- node在v15以前的版本不提供mac arm64架构的二进制预编译包
- nvm install会默认拉取预编译包
所以默认安装的v14是x64版本。
解决办法nvm也给出了,安装时可以使用-s
选项强制从源码安装。
实操一下:
➜ nodetest nvm install -s 14.17.0
Detected that you have 8 CPU core(s)
Running with 7 threads to speed up the build
Clang v3.5+ detected! CC or CXX not specified, will use Clang as C/C++ compiler!
Downloading https://nodejs.org/dist/v14.17.0/node-v14.17.0.tar.xz...
############################################## 100.0%
Computing checksum with shasum -a 256
Checksums matched!
$>./configure --prefix=/Users/cogear/.nvm/versions/node/v14.17.0 <
...
可以看到果然从源码编译了。
自测一下
安装完成后,测试一下:
➜ nodetest nvm current
v14.17.0
➜ nodetest nvm alias work 14.17.0 # 顺便给常用的版本设置一个别名
work -> 14.17.0 (-> v14.17.0)
➜ nodetest node app.js
Server running at http://127.0.0.1:3000/
到活动监视器检查一下node进程:
可以看到node是原生的arm进程。
转载自:https://juejin.cn/post/7057451578176831495