# 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`](https://imarslo.gitbook.io/book/gitbook/node)<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)
  ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://imarslo.gitbook.io/book/gitbook/node.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
