一、nodejs安装

144 阅读2分钟

我一般习惯使用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安装完毕~