我一般习惯使用node版本管理工具来安装node,这样方便随时切换node版本。以前用的nvm,这次尝试使用fnm。
首先安装fnm:
fnm提供了自动安装脚本。
在/tmp目录中新建install.sh文件,并编辑这个文件:
cd /tmp
touch install.sh
vim install.sh
把这些内容拷到install.sh文件中并保存(可在官方的自动安装脚本中找到):
set -e
RELEASE="latest"OS="$(uname -s)"
if [ -d "$HOME/.fnm" ]; then INSTALL_DIR="$HOME/.fnm"elif [ -n "$XDG_DATA_HOME" ]; then INSTALL_DIR="$XDG_DATA_HOME/fnm"elif [ "$OS" = "Darwin" ]; then INSTALL_DIR="$HOME/Library/Application Support/fnm"else INSTALL_DIR="$HOME/.local/share/fnm"fi
# Parse Flagsparse_args() { while [[ $# -gt 0 ]]; do key="$1"
case $key in -d | --install-dir) INSTALL_DIR="$2" shift # past argument shift # past value ;; -s | --skip-shell) SKIP_SHELL="true" shift # past argument ;; --force-install | --force-no-brew) echo "\`--force-install\`: I hope you know what you're doing." >&2 FORCE_INSTALL="true" shift ;; -r | --release) RELEASE="$2" shift # past release argument shift # past release value ;; *) echo "Unrecognized argument $key" exit 1 ;; esac done}
set_filename() { if [ "$OS" = "Linux" ]; then # Based on https://stackoverflow.com/a/45125525 case "$(uname -m)" in arm | armv7*) FILENAME="fnm-arm32" ;; aarch* | armv8*) FILENAME="fnm-arm64" ;; *) FILENAME="fnm-linux" esac elif [ "$OS" = "Darwin" ] && [ "$FORCE_INSTALL" = "true" ]; then FILENAME="fnm-macos" USE_HOMEBREW="false" echo "Downloading the latest fnm binary from GitHub..." echo " Pro tip: it's easier to use Homebrew for managing fnm in macOS." echo " Remove the \`--force-no-brew\` so it will be easy to upgrade." elif [ "$OS" = "Darwin" ]; then USE_HOMEBREW="true" echo "Downloading fnm using Homebrew..." else echo "OS $OS is not supported." echo "If you think that's a bug - please file an issue to https://github.com/Schniz/fnm/issues" exit 1 fi}
download_fnm() { if [ "$USE_HOMEBREW" = "true" ]; then brew install fnm else if [ "$RELEASE" = "latest" ]; then URL="https://github.com/Schniz/fnm/releases/latest/download/$FILENAME.zip" else URL="https://github.com/Schniz/fnm/releases/download/$RELEASE/$FILENAME.zip" fi
DOWNLOAD_DIR=$(mktemp -d)
echo "Downloading $URL..."
mkdir -p "$INSTALL_DIR" &>/dev/null
if ! curl --progress-bar --fail -L "$URL" -o "$DOWNLOAD_DIR/$FILENAME.zip"; then echo "Download failed. Check that the release/filename are correct." exit 1 fi
unzip -q "$DOWNLOAD_DIR/$FILENAME.zip" -d "$DOWNLOAD_DIR"
if [ -f "$DOWNLOAD_DIR/fnm" ]; then mv "$DOWNLOAD_DIR/fnm" "$INSTALL_DIR/fnm" else mv "$DOWNLOAD_DIR/$FILENAME/fnm" "$INSTALL_DIR/fnm" fi
chmod u+x "$INSTALL_DIR/fnm" fi}
check_dependencies() { echo "Checking dependencies for the installation script..."
echo -n "Checking availability of curl... " if hash curl 2>/dev/null; then echo "OK!" else echo "Missing!" SHOULD_EXIT="true" fi
echo -n "Checking availability of unzip... " if hash unzip 2>/dev/null; then echo "OK!" else echo "Missing!" SHOULD_EXIT="true" fi
if [ "$USE_HOMEBREW" = "true" ]; then echo -n "Checking availability of Homebrew (brew)... " if hash brew 2>/dev/null; then echo "OK!" else echo "Missing!" SHOULD_EXIT="true" fi fi
if [ "$SHOULD_EXIT" = "true" ]; then echo "Not installing fnm due to missing dependencies." exit 1 fi}
ensure_containing_dir_exists() { local CONTAINING_DIR CONTAINING_DIR="$(dirname "$1")" if [ ! -d "$CONTAINING_DIR" ]; then echo " >> Creating directory $CONTAINING_DIR" mkdir -p "$CONTAINING_DIR" fi}
setup_shell() { CURRENT_SHELL="$(basename "$SHELL")"
if [ "$CURRENT_SHELL" = "zsh" ]; then CONF_FILE=${ZDOTDIR:-$HOME}/.zshrc ensure_containing_dir_exists "$CONF_FILE" echo "Installing for Zsh. Appending the following to $CONF_FILE:" echo "" echo ' # fnm' echo ' export PATH="'"$INSTALL_DIR"':$PATH"' echo ' eval "`fnm env`"'
echo '' >>$CONF_FILE echo '# fnm' >>$CONF_FILE echo 'export PATH="'$INSTALL_DIR':$PATH"' >>$CONF_FILE echo 'eval "`fnm env`"' >>$CONF_FILE
elif [ "$CURRENT_SHELL" = "fish" ]; then CONF_FILE=$HOME/.config/fish/conf.d/fnm.fish ensure_containing_dir_exists "$CONF_FILE" echo "Installing for Fish. Appending the following to $CONF_FILE:" echo "" echo ' # fnm' echo ' set PATH "'"$INSTALL_DIR"'" $PATH' echo ' fnm env | source'
echo '# fnm' >>$CONF_FILE echo 'set PATH "'"$INSTALL_DIR"'" $PATH' >>$CONF_FILE echo 'fnm env | source' >>$CONF_FILE
elif [ "$CURRENT_SHELL" = "bash" ]; then if [ "$OS" = "Darwin" ]; then CONF_FILE=$HOME/.profile else CONF_FILE=$HOME/.bashrc fi ensure_containing_dir_exists "$CONF_FILE" echo "Installing for Bash. Appending the following to $CONF_FILE:" echo "" echo ' # fnm' echo ' export PATH="'"$INSTALL_DIR"':$PATH"' echo ' eval "`fnm env`"'
echo '' >>$CONF_FILE echo '# fnm' >>$CONF_FILE echo 'export PATH="'"$INSTALL_DIR"':$PATH"' >>$CONF_FILE echo 'eval "`fnm env`"' >>$CONF_FILE
else echo "Could not infer shell type. Please set up manually." exit 1 fi
echo "" echo "In order to apply the changes, open a new terminal or run the following command:" echo "" echo " source $CONF_FILE"}
parse_args "$@"set_filenamecheck_dependenciesdownload_fnmif [ "$SKIP_SHELL" != "true" ]; then setup_shellfi
执行该脚本:
sh install.sh
脚本执行完毕后fnm已安装完毕。
查看可用的node版本:
fnm ls-remote
根据自己的需要安装指定的node版本。(建议安装18版本以下的,18以上的版本会出现如下的报错)
我这里选择安装v17.9.1版本:
fnm install v17.9.1
安装完毕后可以查看本地已安装的node版本:
fnm ls
切换到对应的node版本:
//切换当前的node版本
fnm use v17.9.1
//设置默认的node版本,避免每次启动都要再次选择版本
fnm default v17.9.1
检查node和npm是否安装成功:
node -v
npm -v
到此nodejs安装完毕~