> For the complete documentation index, see [llms.txt](https://imarslo.gitbook.io/book/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://imarslo.gitbook.io/book/gitbook/node.md).

# node & npm

* [node](#node)
  * [install](#install)
    * [n](#n)
    * [nvm](#nvm)
    * [volta](#volta)
  * [upgrade](#upgrade)
  * [purge node](#purge-node)
    * [macOS](#macos)
* [npm](#npm)
  * [configuration](#configuration)
    * [registry](#registry)
    * [completion](#completion)
  * [usage](#usage)
    * [npm upgrade](#npm-upgrade)
  * [packages](#packages)
    * [view details](#view-details)
* [troubleshooting](#troubleshooting)
  * [empty of `npm ls -g`](#empty-of-npm-ls--g)
  * [env: node: No such file or directory](#env-node-no-such-file-or-directory)
  * [`dyld[70742]: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.73.dylib`](#dyld70742-library-not-loaded-usrlocalopticu4cliblibicui18n73dylib)

{% hint style="info" %}

> reference:
>
> * [package.json](https://deleav.gitbooks.io/hellojs-gitbook/content/npmAndHexo/packagejson/)
> * [NodeJs Quick Start](https://nodejs.dev/learn/introduction-to-nodejs)
>   {% endhint %}

## node

### install

> \[!NOTE|label:references:]
>
> * [How to install latest version of Node using Brew](https://stackoverflow.com/a/27008484/2940319)
> * [4 ways to update to the latest Node.js version on a Mac](https://bytearcher.com/articles/ways-to-get-the-latest-node.js-version-on-a-mac/)
> * [Installing Node.js via package manager](https://nodejs.org/en/download/package-manager)

#### [n](https://www.npmjs.com/package/n)

> \[!NOTE|label:references:]
>
> * [tj/n](https://github.com/tj/n)
> * [mklement0/n-install](https://github.com/mklement0/n-install)
> * [Install Node.js to install n to install Node.js?](https://stackoverflow.com/a/30967671/2940319)

```bash
# tj/n
$ git clone --depth=1 https://github.com/tj/n /tmp/n && cd $_
$ sudo make install
# or
$ curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash

# n-install
$ curl -L https://bit.ly/n-install | bash
# install n to ~/util/n
$ curl -L https://bit.ly/n-install | N_PREFIX=~/util/n bash -s -- -y
```

#### nvm

> \[!NOTE|label:references:]
>
> * [nvm-sh/nvm](https://github.com/nvm-sh/nvm)

```bash
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# or
$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# or
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

# or
$ brew install nvm
```

* configure

```bash
$ cat >> ~/.bash_profile <<EOF
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && \. "/usr/local/opt/nvm/nvm.sh"  # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/usr/local/opt/nvm/etc/bash_completion.d/nvm"
EOF

# or
$ cat >> ~/.bash_profile <<EOF
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
EOF

$ source ~/.bash_profile
```

* verify

  ```bash
  $ nvm install v12
  ```

#### volta

> \[!NOTE|label:references:]
>
> * [volta.sh](https://volta.sh/)

```bash
# install volta
$ curl https://get.volta.sh | bash
$ tail -n 2 ~/.bash_profile
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"

# install node@12
$ volta install node@12
success: installed and set node@12.22.12 (with npm@6.14.16) as default

# verify
$ node --version
v12.22.12
$ command -v node
/Users/marslo/.volta/bin/node
```

### upgrade

```bash
$ brew unlink node@12 --dry-run
Would remove:
/usr/local/include/node
/usr/local/lib/dtrace/node.d
/usr/local/share/doc/node
/usr/local/share/systemtap

$ brew unlink node@12
Unlinking /usr/local/Cellar/node@12/12.22.12_1... 4 symlinks removed.

$ brew link --overwrite node
Linking /usr/local/Cellar/node/21.6.2_1... 2019 symlinks created.
```

### purge node

#### macOS

> reference:
>
> * [uninstall node js from mac](https://www.codegrepper.com/app/profile.php?id=49492)

```bash
sudo rm -rf ~/.npm ~/.nvm ~/node_modules ~/.node-gyp ~/.npmrc ~/.node_repl_history
sudo rm -rf /usr/local/bin/npm /usr/local/bin/node-debug /usr/local/bin/node /usr/local/bin/node-gyp
sudo rm -rf /usr/local/share/man/man1/node* /usr/local/share/man/man1/npm*
sudo rm -rf /usr/local/include/node /usr/local/include/node_modules
sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /usr/local/lib/dtrace/node.d
sudo rm -rf /opt/local/include/node /opt/local/bin/node /opt/local/lib/node
sudo rm -rf /usr/local/share/doc/node
sudo rm -rf /usr/local/share/systemtap/tapset/node.stp

brew uninstall node
brew doctor
brew cleanup --prune-prefix
```

## npm

### configuration

#### registry

```bash
$ npm config -g set registry https://registry.npm.taobao.org
$ npm config -g get registry
https://registry.npm.taobao.org/
```

* default:

  ```bash
  $ npm config get registry
  https://registry.npmjs.org/

  $ npm config -g get registry
  https://registry.npmjs.org/
  ```

#### completion

* via npm

  ```bash
  $ command -v npm > /dev/null && source <( npm completion )
  # or
  $ command -v npm > /dev/null && eval $(npm completion)
  ```
* via [`Jephuff/npm-completion`](/book/gitbook/node.md)<https://github.com/Jephuff/npm-completion>

  ```bash
  $ npm i -g npm-completion
  # for windows
  $ npm i -g npm-completion@windows

  $ npm-completion-setup
  $ npm-completion-upgrade
  ```

  * config

    ```bash
    # https://github.com/Jephuff/npm-bash-completion
    $ NPM_COMPLETION_PATH="/usr/local/lib/node_modules/npm-completion"
    $ test -f "${NPM_COMPLETION_PATH}/npm-completion.sh" && source "${NPM_COMPLETION_PATH}/npm-completion.sh"
    ```

### usage

#### npm upgrade

```bash
$ npm install -g npm-check-updates
$ ncu -u
```

* [or](https://docs.npmjs.com/updating-packages-downloaded-from-the-registry)

  ```bash
  $ npm outdated -g --depth=0
  Package       Current  Wanted  Latest  Location
  react-sticky    5.0.8   5.0.8   6.0.3  global

  $ npm update -g react-sticky
  ```

### packages

#### view details

```bash
$ npm view <package>
```

* example

  ```bash
  $ npm view gitbook-cli

  gitbook-cli@2.3.2 | Apache-2.0 | deps: 11 | versions: 21
  CLI to generate books and documentation using gitbook
  https://www.gitbook.com

  bin: gitbook

  dist
  .tarball: https://registry.npm.taobao.org/gitbook-cli/download/gitbook-cli-2.3.2.tgz
  .shasum: 5e893582e1f743f6fa920c3c3eb36b62ea4a31a0

  dependencies:
  bash-color: 0.0.4 fs-extra: 3.0.1   npm: 5.1.0        optimist: 0.6.1   semver: 5.3.0     user-home: 2.0.0
  commander: 2.11.0 lodash: 4.17.4    npmi: 1.0.1       q: 1.5.0          tmp: 0.0.31

  maintainers:
  - aymeric-gb <aymeric@gitbook.com>
  - gitbook-bot <contact@gitbook.com>
  - jpreynat <johan.preynat@gmail.com>
  - samypesse <samypesse@gmail.com>

  dist-tags:
  latest: 2.3.2

  published over a year ago by aarono <aaron.omullan@gmail.com>
  ```

## troubleshooting

### empty of `npm ls -g`

```bash
$ npm ls -g
/usr/local/Cellar/node/15.0.1/lib
└── (empty)
```

* [solution](https://github.com/npm/cli/issues/1962#issuecomment-715436030)

  ```bash
  $ brew rm node
  Uninstalling /usr/local/Cellar/node/15.0.1... (3,331 files, 61MB)

  $ brew install node
  Updating Homebrew...
  ==> Auto-updated Homebrew!
  Updated 2 taps (homebrew/core and homebrew/cask).
  ==> Updated Formulae
  Updated 3 formulae.
  ==> Updated Casks
  ithoughtsx

  ==> Downloading https://homebrew.bintray.com/bottles/node-15.0.1.catalina.bottle.tar.gz
  ==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/9cdf039763f006eef0cc0aaebb13bc8173f017d961ac41c30f26d45a23ecffe0?response-content-dispositio
  ######################################################################## 100.0%
  ==> Pouring node-15.0.1.catalina.bottle.tar.gz
  ==> Caveats
  Bash completion has been installed to:
    /usr/local/etc/bash_completion.d
  ==> Summary
  ☕️ 🐸  /usr/local/Cellar/node/15.0.1: 3,331 files, 61MB
  ```
* verify

  ```bash
  $ npm ls -g
  /usr/local/lib
  ├── -@0.0.1
  ├── commitizen@4.2.1
  ├── ...
  └── verify-junit-xml@0.0.3
  ```
* how to reproduce

  ```bash
  $ npm --version
  7.0.3
  $ npm root -g
  /usr/local/lib/node_module

  $ npm i -g npm@latest
  removed 51 packages, and changed 197 packages in 4s
  2 packages are looking for funding
    run `npm fund` for details
  $ npm -v
  6.14.8
  $ npm root -g
  /usr/local/Cellar/node/15.0.1/lib/node_modules

  $ npm i -g npm@7.0.3
  /usr/local/Cellar/node/15.0.1/bin/npm -> /usr/local/Cellar/node/15.0.1/lib/node_modules/npm/bin/npm-cli.js
  /usr/local/Cellar/node/15.0.1/bin/npx -> /usr/local/Cellar/node/15.0.1/lib/node_modules/npm/bin/npx-cli.js
  + npm@7.0.3
  updated 248 packages in 6.481s
  $ npm -v
  6.14.8
  $ npm root -g
  /usr/local/Cellar/node/15.0.1/lib/node_modules
  ```
* [deep investigation](https://github.com/npm/cli/issues/1962#issuecomment-715911549)

  ```bash
  $ npm config -g ls -l | grep prefix
  ; prefix = "/usr/local/Cellar/node/15.0.1" ; overridden by builtin
  save-prefix = "^"
  tag-version-prefix = "v"
  prefix = "/usr/local"

  $ npm i -g npm@7.0.5
  changed 1 package in 6s
  10 packages are looking for funding
    run `npm fund` for details
  $ npm config -g ls -l | grep prefix
  prefix = "/usr/local/Cellar/node/15.0.1"
  save-prefix = "^"
  tag-version-prefix = "v"
  $ npm -v
  7.0.5
  $ npm ls -g
  /usr/local/Cellar/node/15.0.1/lib
  └── (empty)

  $ npm config -g set prefix '/usr/local'
  $ npm ls -g
  /usr/local/lib
  ├── -@0.0.1
  ├── commitizen@4.2.1
  ├── diff-so-fancy@1.3.0
  ├── ...
  ```

### env: node: No such file or directory

* possible cause

  ```bash
     ╭─────────────────────────────────────────────────────────────────╮
     │                                                                 │
     │      New patch version of npm available! 6.14.8 → 6.14.10       │
     │   Changelog: https://github.com/npm/cli/releases/tag/v6.14.10   │
     │                Run npm install -g npm to update!                │
     │                                                                 │
     ╰─────────────────────────────────────────────────────────────────╯

  $ npm i -g npm
  /usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js
  /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
  + npm@6.14.10
  added 435 packages from 887 contributors in 4.481s
  ```
* [solution](https://github.com/nvm-sh/nvm/issues/1702#issuecomment-444309875)

  ```bash
  $ which node
  /usr/local/opt/node@12/bin/node

  $ sudo chown -R $(whoami) $(brew --prefix)/*

  $ brew link --overwrite node@12
  Linking /usr/local/Cellar/node@12/12.20.0... 3808 symlinks created

  If you need to have this software first in your PATH instead consider running:
    echo 'export PATH="/usr/local/opt/node@12/bin:$PATH"' >> /Users/marslo/.bash_profile
  ```
* info

  ```bash
  $ brew info node@12
  ==> node@12: stable 12.22.12 (bottled) [pinned at 12.22.12_1, keg-only]
  Platform built on V8 to build network applications
  https://nodejs.org/
  Disabled because it is not supported upstream!
  /usr/local/Cellar/node@12/12.22.12_1 (3,875 files, 51.6MB) *
    Poured from bottle on 2022-09-21 at 05:19:58
  From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/node@12.rb
  License: MIT
  ==> Dependencies
  Build: pkg-config ✔, python@3.9 ✔
  Required: brotli ✔, c-ares ✔, icu4c ✔, libnghttp2 ✔, libuv ✔, openssl@1.1 ✔, macos-term-size ✔
  ==> Caveats
  node@12 is keg-only, which means it was not symlinked into /usr/local,
  because this is an alternate version of another formula.

  If you need to have node@12 first in your PATH, run:
    echo 'export PATH="/usr/local/opt/node@12/bin:$PATH"' >> /Users/marslo/.bash_profile

  For compilers to find node@12 you may need to set:
    export LDFLAGS="-L/usr/local/opt/node@12/lib"
    export CPPFLAGS="-I/usr/local/opt/node@12/include"

  $ brew info node
  ==> node: stable 20.8.0 (bottled), HEAD
  Platform built on V8 to build network applications
  https://nodejs.org/
  /usr/local/Cellar/node/20.5.1 (2,356 files, 58MB)
    Poured from bottle using the formulae.brew.sh API on 2023-08-14 at 23:26:23
  /usr/local/Cellar/node/20.6.0 (2,398 files, 58.4MB)
    Poured from bottle using the formulae.brew.sh API on 2023-09-06 at 22:37:08
  /usr/local/Cellar/node/20.7.0 (2,517 files, 59.3MB)
    Poured from bottle using the formulae.brew.sh API on 2023-09-21 at 23:31:27
  /usr/local/Cellar/node/20.8.0 (2,517 files, 59.2MB)
    Poured from bottle using the formulae.brew.sh API on 2023-10-05 at 13:31:50
  From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/node.rb
  License: MIT
  ==> Dependencies
  Build: pkg-config ✔, python@3.11 ✔
  Required: brotli ✔, c-ares ✔, icu4c ✔, libnghttp2 ✔, libuv ✔, openssl@3 ✔
  ==> Options
  --HEAD
    Install HEAD version
  ==> Caveats
  Bash completion has been installed to:
    /usr/local/etc/bash_completion.d
  ==> Analytics
  install: 236,495 (30 days), 613,011 (90 days), 1,316,363 (365 days)
  install-on-request: 202,391 (30 days), 538,160 (90 days), 1,166,207 (365 days)
  build-error: 360 (30 days)
  ```

### `dyld[70742]: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.73.dylib`

* info

  ```bash
  $ node --version
  dyld[73388]: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.73.dylib
    Referenced from: <EC40B82A-EB42-3D50-9D84-18BC05643BD3> /usr/local/Cellar/node/21.1.0/bin/node
    Reason: tried: '/usr/local/opt/icu4c/lib/libicui18n.73.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/icu4c/lib/libicui18n.73.dylib' (no such file), '/usr/local/opt/icu4c/lib/libicui18n.73.dylib' (no such file), '/usr/local/Cellar/icu4c/74.2/lib/libicui18n.73.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/icu4c/74.2/lib/libicui18n.73.dylib' (no such file), '/usr/local/Cellar/icu4c/74.2/lib/libicui18n.73.dylib' (no such file)
  Abort trap: 6

  $ which -a node
  /usr/local/Cellar/node/21.1.0/bin/node
  /usr/local/bin/node
  ```

  ```bash
  $ brew unlink node@12 --dry-run
  Would remove:
  /usr/local/include/node
  /usr/local/lib/dtrace/node.d
  /usr/local/share/doc/node
  /usr/local/share/systemtap
  ```
* debug

  > \[!NOTE|label:references:]
  >
  > * [Node installation in homebrew vs miniconda](https://stackoverflow.com/q/77998023/2940319)

  ```bash
  $ otool -L $(which node) | grep icu4c
    /usr/local/opt/icu4c/lib/libicui18n.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /usr/local/opt/icu4c/lib/libicuuc.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /usr/local/opt/icu4c/lib/libicudata.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /usr/local/opt/icu4c/lib/libicui18n.71.dylib (compatibility version 71.0.0, current version 71.1.0)
    /usr/local/opt/icu4c/lib/libicuuc.71.dylib (compatibility version 71.0.0, current version 71.1.0)
    /usr/local/opt/icu4c/lib/libicudata.71.dylib (compatibility version 71.0.0, current version 71.1.0)
  ```

  ```bash
  $ otool -L $(which node)
  /usr/local/Cellar/node/21.1.0/bin/node:
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.12)
    /usr/local/opt/libuv/lib/libuv.1.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/local/opt/brotli/lib/libbrotlidec.1.dylib (compatibility version 1.0.0, current version 1.1.0)
    /usr/local/opt/brotli/lib/libbrotlienc.1.dylib (compatibility version 1.0.0, current version 1.1.0)
    /usr/local/opt/c-ares/lib/libcares.2.dylib (compatibility version 2.0.0, current version 2.7.1)
    /usr/local/opt/libnghttp2/lib/libnghttp2.14.dylib (compatibility version 40.0.0, current version 40.0.0)
    /usr/local/opt/openssl@3/lib/libcrypto.3.dylib (compatibility version 3.0.0, current version 3.0.0)
    /usr/local/opt/openssl@3/lib/libssl.3.dylib (compatibility version 3.0.0, current version 3.0.0)
    /usr/local/opt/icu4c/lib/libicui18n.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /usr/local/opt/icu4c/lib/libicuuc.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /usr/local/opt/icu4c/lib/libicudata.73.dylib (compatibility version 73.0.0, current version 73.2.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 2048.1.255)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.151.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
  /usr/local/bin/node:
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
    /usr/local/opt/brotli/lib/libbrotlidec.1.dylib (compatibility version 1.0.0, current version 1.0.9)
    /usr/local/opt/brotli/lib/libbrotlienc.1.dylib (compatibility version 1.0.0, current version 1.0.9)
    /usr/local/opt/c-ares/lib/libcares.2.dylib (compatibility version 2.0.0, current version 2.5.1)
    /usr/local/opt/libnghttp2/lib/libnghttp2.14.dylib (compatibility version 38.0.0, current version 38.0.0)
    /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
    /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
    /usr/local/opt/icu4c/lib/libicui18n.71.dylib (compatibility version 71.0.0, current version 71.1.0)
    /usr/local/opt/icu4c/lib/libicuuc.71.dylib (compatibility version 71.0.0, current version 71.1.0)
    /usr/local/opt/icu4c/lib/libicudata.71.dylib (compatibility version 71.0.0, current version 71.1.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1858.112.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
  ```
* solution

  ```bash
  $ showpath
  ...
  /usr/local/Cellar/node/21.1.0/bin
  ..

  # issue fix
  $ NODE_HOME=$(brew --prefix node)
  $ export PATH=$NODE_HOME:$PATH

  # verify
  $ node --version
  v21.6.2
  $ otool -L $(which node) | grep icu4c
    /usr/local/opt/icu4c/lib/libicui18n.74.dylib (compatibility version 74.0.0, current version 74.2.0)
    /usr/local/opt/icu4c/lib/libicuuc.74.dylib (compatibility version 74.0.0, current version 74.2.0)
    /usr/local/opt/icu4c/lib/libicudata.74.dylib (compatibility version 74.0.0, current version 74.2.0)
  ```
