# 问题解决

URL: https://caijiao.org/nvm/use/problems
Source: docs/nvm/use/problems.md
Description: 这些问题解决方案涵盖了在使用 nvm 过程中可能遇到的各种故障，包括安装失败、macOS 特定问题、WSL 故障以及针对 Apple Silicon 芯片的适配问题。

如果尝试安装某个 Node.js 版本失败，请务必运行 `nvm cache clear` 来删除缓存的 Node.js 下载文件，否则可能会遇到以下错误：

```
curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume.
```

## macOS 故障排除

- **nvm node 版本在 vim shell 中找不到**

  如果将 node 版本设置为非系统版本（例如 `nvm use 6.2.1`），然后在 vim 中运行 `:!node -v` 发现显示的是系统版本（例如 `v0.12.7`），则需要运行以下命令：

  ```bash
  sudo chmod ugo-x /usr/libexec/path_helper
  ```

  有关此问题的更多信息，请参见 dotphiles/dotzsh。

- **nvm 与 npm 配置中的 "prefix" 选项不兼容**

  一些解决此问题的方法可以在此处找到。

  还有一个导致此问题的特例，即 `$HOME` 路径与用户的实际主目录名称不匹配。

  你必须确保 `$HOME` 中的用户目录名称与通过运行 `ls /Users/` 查看到的用户目录名称以相同的方式大写（请参阅此问题）。

  要更改用户目录和/或帐户名称，请按照此处的说明进行操作。

- **Homebrew 使 zsh 目录不安全**

  zsh compinit: insecure directories, run compaudit for list.

  Homebrew 会导致不安全的目录，例如 `/usr/local/share/zsh/site-functions` 和 `/usr/local/share/zsh`。这不是一个 nvm 问题 - 它是一个 Homebrew 问题。有关与此问题相关的一些解决方案，请参见此处。

- **具有 Apple Silicon 芯片的 Mac**

  在 node.js v15.3 中添加了对 Apple Silicon 芯片架构的实验性支持，完整的支持是在 v16.0 中添加的。因此，如果尝试像往常一样安装旧版本的 node，可能会在安装 node 时遇到编译错误，或者在运行代码时遇到内存不足错误。

  因此，如果想在 Apple Silicon Mac 上运行低于 v16.0 的版本，则最好编译 node，以针对 x86_64 Intel 架构，这样 Rosetta 2 就可以将 x86_64 处理器指令转换为基于 ARM 的 Apple Silicon 指令。你需要做以下操作：

  - 安装 Rosetta，如果尚未安装

    ```bash
    $ softwareupdate --install-rosetta
    ```

  - 打开一个使用 Rosetta 运行的 shell

    ```bash
    $ arch -x86_64 zsh
    ```

    注意：这个终端会话现在正在运行 zsh。如果 zsh 不是你通常使用的 shell，nvm 可能不会像对于你通常的 shell 通过你的 dotfiles 自动 source 那样。如果是这种情况，请确保 source nvm。

    ```bash
    $ source "${NVM_DIR}/nvm.sh"
    ```

  - 安装你感兴趣的旧版本的 node。让我们以 v12.22.1 为例。这将获取 node 源代码并编译它，这将需要几分钟。

    ```bash
    $ nvm install v12.22.1 --shared-zlib
    ```

    注意：你可能想知道为什么包括 `--shared-zlib`。最近版本的苹果系统 clang 编译器中存在一个错误。如果你的系统上安装了其中一个损坏的版本，即使你没有包含 `--shared-zlib` 标志，上面的步骤也可能成功。但是，当你尝试使用旧版本的 node.js 安装 npm 包时，你将看到不正确的数据检查错误。如果要避免可能出现的麻烦，建议包含该标志。更多细节，请参见此问题和此注释。

  - 退出回到你的本机 shell。

    ```bash
    $ exit
    ```

    ```bash
    $ arch
    arm64
    ```

    注意：如果在第二步中选择了标记为 "Open using Rosetta" 的框，而不是运行 CLI 命令，则会看到 i386。除非你有另一个原因选择了该框，否则现在可以取消选中它。

  - 检查架构是否正确。x64 是 x86_64 的缩写，这是你希望看
