[TOC]

0x00 前言简介

1.Node.js 介绍

描述:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,它是目前非常火热的技术(正式开启JavaScript的后端开发之旅), 它在设计上类似于Ruby系统并受到Python的Twisted的影响启发,它作为异步事件驱动的JavaScript运行时,它旨在构建可伸缩的网络应用程序。

Node.js®起初作者是 Ryan Dahl , 当前项目由 Technical Steering Committee (TSC)Community Committee (CommComm) 共同管理,前者负责项目中高级别的技术负责指导,后者对扩展社区发展进行负责,由 OpenJS Foundation 提供维护。

Node.js 官网地址:https://nodejs.org/en/
GitHub 存储库:https://github.com/nodejs/node


发展简述
描述:作者 Ryan Dahl 他的工作是用C/C++写高性能Web服务,对于高性能,异步IO、事件驱动是基本原则,但是用C/C++写就太痛苦了。于是这位仁兄开始设想用高级语言开发Web服务。他评估了很多种高级语言,发现很多语言虽然同时提供了同步IO和异步IO,但是开发人员一旦用了同步IO,他们就再也懒得写异步IO了,所以最终Ryan瞄向了JavaScript;

因为 JavaScript 是单线程执行,根本不能进行同步IO操作,所以JavaScript的这一“缺陷”导致了它只能使用异步IO。于是在2009年Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node一下子就火了起来。


小小插曲
因为 Node.js 是开源项目虽然由社区推动但幕后一直由Joyent公司资助。由于一群开发者对Joyent公司的策略不满,于2014年从Node.js项目fork出了io.js项目,决定单独发展,但两者实际上是兼容的,分家后没多久,Joyent公司表示要和解,于是io.js项目又决定回归 Node.js。
具体做法是将来io.js将首先添加新的特性,如果大家测试用得爽,就把新特性加入Node.js,io.js是“尝鲜版”,而Node.js是线上稳定版,相当于Fedora Linux和RHEL的关系。


Node.js 优点有哪些?

  • JavaScript语言本身是完善的函数式语言,使用最新的ECMAScript6标准
  • 使用模块化的JS代码,使用函数式编程
  • 事件驱动、非阻塞式 I/O 的模型使其轻量又高效
  • 适用后端开发(包括 文件IO、进程管理、网络通信)
  • 针对于前端开发者学习成本低,也适合初学者学习



2.应用场景

Node上运行的JavaScript相比其他后端开发语言有何优势?

答:Npde.js 借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。

Node上线程能否实现多核优势?
描述:Node.js 被设计为没有线程并不意味着你不能接受在您的环境中使用多核的优势, 通过使用我们 child_process.fork() 的 API 可以产生子进程,并且被设计为易于使用与交流,建立在相同的界面上的是 cluster 模块, 它允许您在进程之间共享套接字以启用负载平衡在你的核心之上。


Node.js 应用在哪些场景?
Node.js 非常适合开发可伸缩系统非常合理
Node.js 非常适合作为Web的基础库或框架。
Node.js 非常适合作为网络socket通信。


3.版本支持

描述: 当前【2022年9月16日 10:14:23】最新版本为 V18.9.0 ,稳定长期支持版本为 16.17.0 LTS 。
发布规则:LTS 发布版若为奇数(诸如 9、11 等)将变为不支持状态(预览版本),若为偶数版本(诸如 10、12 等)变成活跃LTS状态(正式版本),如果其状态是“长期维护版”,意味着重大的 Bug 将在后续的 30 个月内持续得到不断地修复,上线环境时应仅使用活跃 LTS 或者是维护 LTS 版,学习环境当然可以选择Node.js主版本。

Node.js 所有已发布版本截止维护日期(最新):https://nodejs.org/zh-cn/about/releases/

发布 状态 代号 首发日 长期维护版(主推)开始日期 长期维护版开始日期 (服务)终止日期
v14 长期维护版 Fermium 2020-04-21 2020-10-27 2021-10-19 2023-04-30
v16 长期维护版(主推) Gallium 2021-04-20 2021-10-26 2022-10-18 2023-09-11
v18 当前版 2022-04-19 2022-10-25 2023-10-18 2025-04-30
v19 待定 2022-10-18 2023-04-01 2023-06-01
v20 待定 2023-04-18 2023-10-24 2024-10-22 2026-04-30

注意:上述日期可能会发生变化。


0x01 环境部署

描述:Node.js 支持Windows/Linux/Unix/ARM等多个操作系统平台以及Docker容器化安装部署,此处对于Windows安装不详细说明,对于一个运维开发工程师来说更侧重于在linux下面进行开发和编程Node.js;

1.Windows 安装

方式1、Windows 平台直接安装

从官网(https://nodejs.org/en/download/)安装下载最新稳定版本的 Node.js msi 安装包(node-v16.17.0-x64.msi), 下载地址:https://nodejs.org/dist/v16.17.0/node-v16.17.0-x64.msi

下载完成后,按照其提示安装完成后,在Windows环境下,请打开命令提示符,然后输入 node -v,如果安装正常,你应该看到这样的输出:

1
2
C:\Users\WeiyiGeek>node -v
v16.17.0

然后进行Windows环境变量,配置npm的全局模块的存放路径以及cache的路径

1
2
3
#便在NodeJs下建立“node_global”及“node_cache”两个文件夹。我们就在cmd中键入两行命令:
npm config set prefix "D:\Program Files\nodejs\node_global"
npm config set cache "D:\Program Files\nodejs\node_cache"

设置系统变量流程,进入我的电脑→属性→高级→环境变量在系统变量下新建“NODE_PATH”,输入“D:\Program Files\nodejs\node_global\node_modules”


方式2、Windows WSL 2平台中安装

安装环境:Windows WSL2 Linux 子系统中使用Ubuntu系统,通过适用于 Linux 的 Windows 子系统 (WSL),可以安装首选的 Linux 分发版(默认为 Ubuntu),以便在开发环境(编写代码的位置)和生产环境(部署代码的服务器)之间保持一致性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 必须依赖于 WSL2 否则不能安装,你可以按照如下进行升级
# 1.确认目前版本是WSL还是WSL2
wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 1

# 2.启用虚拟化功能(注意需要重启机器)
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# 3.将 WSL 2 设置为默认版本
wsl --set-default-version 2

# 4.将 Ubuntu-20.04 分发转换为 2 版本(管理员权限)或者直接重新安装分发(推荐)。
# wsl --set-version Ubuntu-20.04 2
# 正在进行转换,这可能需要几分钟时间...
# 有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
wsl --unregister Ubuntu-20.04
# 正在注销...
# 貌似直接安装不好用,只有通过Miscrosoft Store安装
# wsl --list --online
# wsl --install -d Ubuntu
# 正在下载: Ubuntu

# 5.离线安装 Ubuntu2204 分发
New-Item D:\Tools\Ubuntu -ItemType Directory
Set-Location D:\Tools\Ubuntu
Invoke-WebRequest -Uri https://aka.ms/wslubuntu2204 -OutFile Ubuntu.appx -UseBasicParsing

# 下载后解压 Ubuntu.appx 然后再解压 Ubuntu_2204.0.10.0_x64.appx 到目录中,即D:\Tools\Ubuntu\Ubuntu_2204.0.10.0_x64 , 然后运行 ubuntu2204.exe
D:\Tools\Ubuntu\Ubuntu_2204.0.10.0_x64\ubuntu2204.exe

# 6.验证其分发的版本是为2
c:\Windows\System32>wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2

# 7.执行wsl命令进入WSL2子系统查看其信息
wsl
$ uname -a
Linux Security 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Li
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy

# 8.更新为仓库国内源
cp source.list{,.bak}
sed -i "s#archive.ubuntu.com#mirrors.tuna.tsinghua.edu.cn#g" /etc/apt/source.list

# 9.更新软件以及安装常用工具
apt update && apt upgrade
sudo apt install -y nano vim git unzip wget ntpdate dos2unix net-tools tree htop ncdu nload sysstat psmisc bash-completion fail2ban gcc g++ make jq zsh

WeiyiGeek.安装ubuntu2204分发

WeiyiGeek.安装ubuntu2204分发


安装流程:安装 nvm、node.js 和 npm , 针对开发环境建议使用版本管理器, 因为版本变更速度非常快, 当我们不同项目有不同版本需求时建议使用 Node 版本管理器(通常称为 nvm)是安装多个版本的 Node.js。

1.打开 Ubuntu 命令行(或所选的发行版)。

2.使用以下命令安装 CURL (用于在命令行中从 Internet 下载内容的工具):sudo apt-get install curl

3.使用以下命令安装 nvm 包管理器。

1
2
su root
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash

WeiyiGeek.nvm包管理器

WeiyiGeek.nvm包管理器

4.若要验证安装以及列出当前安装的 Node 版本(此时应为无)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# NVM安装NodeJs时需要更改NVM更改镜像源,否则一直无法获取
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node/
export NVM_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs

command -v nvm
# nvm

$ nvm --version
# 0.39.1

$ nvm ls
# N/A
# iojs -> N/A (default)
# node -> stable (-> N/A) (default)
# unstable -> N/A (default)

# 查看远程可用
$ nvm ls-remote
....
v16.17.0 (Latest LTS: Gallium)
v17.0.0
....
v18.8.0
v18.9.0

5.安装 Node.js 的当前版本和稳定的 LTS 版本, 即v16.17.0版本。

  • 安装 Node.js 的当前稳定的 LTS 版本(推荐用于生产应用程序):nvm install –lts
  • 安装 Node.js 的当前版本(用于测试最新的 Node.js 功能和改进,但更容易出现问题):nvm install node
1
2
3
4
5
6
7
8
nvm install --lts
# Installing latest LTS version.
# Downloading and installing node v16.17.0...
# Downloading https://npm.taobao.org/mirrors/node//v16.17.0/node-v16.17.0-linux-x64.tar.xz..
# Computing checksum with sha256sum
# Checksums matched!
# Now using node v16.17.0 (npm v8.15.0)
# Creating default alias: default -> lts/* (-> v16.17.0)

6.验证查看安装的Node与Npm版本,至此安装完毕!

1
2
3
4
5
$ node --version
v16.17.0

$ npm --version
8.15.0

虽然 nvm 目前是最常用的节点版本管理器,但需要考虑一些替代版本管理器:

  • n 是长期存在的 nvm 替代方法,该方法使用略微不同的命令来完成相同的操作,并通过 npm 而不是 bash 脚本来安装。( Link: https://www.npmjs.com/package/n#installation
  • fnm 是较新的版本管理器,它声称比 nvm 快得多。 (它还使用 Azure 管道。)
  • Volta 是来自 LinkedIn 团队的新版本管理器,它声称改进了速度和跨平台支持。
  • asdf-vm 是适用于多种语言的单个 CLI,例如将 ike gvm、nvm、rbenv & pyenv(等)整合在一起。
  • nvs(Node 版本切换器)是跨平台的 nvm 替代方法,可与 VS Code 集成。

安装参考地址:https://docs.microsoft.com/zh-cn/windows/dev-environment/javascript/nodejs-on-wsl?source=recommendations#install-nvm-nodejs-and-npm


2.Linux Ubuntu 安装

二进制方式安装
描述:此处还是安装稳定版本的 node, 其 Linux Binaries (x64) 二进制包下载地址:https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz

源码编译安装
描述:此处还是安装稳定版本的 node, 其 Linux Binaries (x64) 二进制包下载地址:https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz


3.Linux CentOS 安装

使用NVM方式安装
安装环境:CentOS Linux release 7.6.1810 (Core) [强烈建议使用Centos 7.x]
安装步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#1.使用nvm维护多个版本的node.js
https://github.com/creationix/nvm

$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
$ source /root/.bashrc
$ command -v nvm #返回nvm 表示安装成功
[root@Master-data1 nodejs]$ nvm --version
0.34.0
#配置加速镜像
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node/

#2.安装node.js
$ nvm ls-remote #查看nodejs版本
v10.15.3 (Latest LTS: Dubnium)

$ nvm install 10.15.3 #安装当前稳定版本
Creating default alias: default -> 10.15.3 (-> v10.15.3)
#查看当前脚本
$ node -v
v10.15.3

#3.安装npm(安装插件依赖)
$ npm -v #其实安装node后默认已经被安装
6.7.0


4.开发环境配置

描述:我们需要一个IDE集成开发环境让我们能在一个环境里编码、运行、调试,这样就可以大大提升开发效率。

Java的集成开发环境有Eclipse,Intellij idea等,C#的集成开发环境有Visual Studio,Node.js的集成开发环境推荐使用Visual Studio Code

在VS Code中我们可以非常方便地运行JavaScript文件,VS Code以文件夹作为工程目录(Workspace Dir),所有的JavaScript文件都存放在该目录下。此外VS Code在工程目录下还需要一个.vscode的配置目录,里面存放里VS Code需要的配置文件。

可以用VS Code快速创建 launch.json 然后修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"version": "0.2.0",
"configurations": [
{
"name": "Run hello.js",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/hello.js",
"stopOnEntry": false,
"args": [],
"cwd": "${workspaceRoot}",
"preLaunchTask": null,
"runtimeExecutable": null,
"runtimeArgs": [
"--nolazy"
],
"env": {
"NODE_ENV": "development"
},
"externalConsole": false,
"sourceMaps": false,
"outDir": null
}
]
}

有了配置文件,即可使用VS Code调试JavaScript

1
2
3
4
'use strict'
var name = "Weiyi";
var hello = `你好,${name}Geek 欢迎学习NODE.JS`;
console.log(hello);

WeiyiGeek.VScode

WeiyiGeek.VScode


VScode 编辑器添加 WSL2 终端配置以及终端优化
01.配置文件 settings.json 进行追加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"terminal.integrated.profiles.windows": {
"Ubuntu-22.04 (WSL)": {
"path": "C:\\Windows\\System32\\wsl.exe",
"args": [],
"icon": "terminal-bash"
},
"PowerShell": {
"source": "PowerShell",
"icon": "terminal-powershell"
},
"Command Prompt": {
"path": [
"${env:windir}\\Sysnative\\cmd.exe",
"${env:windir}\\System32\\cmd.exe"
],
"args": [],
"icon": "terminal-cmd"
},
"Git Bash": {
"source": "Git Bash"
}
},
"terminal.integrated.defaultProfile.windows": "Ubuntu-22.04 (WSL)",

02.使用oh-my-zsh进行终端优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装 zsh
sudo apt-get install zsh

# 设置 zsh 为默认shel 设置 -> 重启终端。
chsh -s /bin/zsh

# 拉取 oh-my-zsh 项目
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

# 配置文件
$ls ~/.zshrc
root/.zshrc

# 默认主题是 robbyrussell(更多主题参考来源)
sed -r -i.bak 's#ZSH_THEME="[a-z].+"#ZSH_THEME="agnoster"#' ~/.zshrc

# 更新配置
$ source ~/.zshrc

其他终端配置优化尽在此篇博客文章之中( https://blog.weiyigeek.top/2019/6-28-209.html )。


VScode + WLS + Node.js 开发环境验证

描述:采用 Node.js 编写的 JavaScript 代码将直接在你的计算机上以命令行的方式运行;

步骤 01.进入WSL终端执行node命令进入Node.js的交互环境,在交互环境下你可以输入任意JavaScript语句例。

1
2
3
4
5
6
7
8
9
#  Node交互模式 和 命令行模式 
[root@centos7 ~]$ node
> 1024 * 4
4096
> console.log("Hello wrold!Node.js")
Hello wrold!Node.js
> function add(x,y){console.log(x + "+" + y + "=",x+y)}; add(6,9)
6+9 = 15
> process #调用执行系统级别的API

步骤 02.直接使用node进行执行helloworld.js文件

1
2
3
4
5
6
7
$ vim helloworld.js
# 第一行总是写上'use strict',是因为我们总是以严格模式运行JavaScript代码,避免各种潜在陷阱。
'use strict';
console.log('Hello, world.');

$ node helloworld.js
Hello world! Node.js

温馨提示:我们可以利用npm安装nodemon包(cnpm install nodemon -g)让文件自动检测执行js变化:

1
2
3
4
5
6
7
8
9
ls -alh index.js
-rw-r--r-- 1 root root 36 4月 11 09:25 index.js
[root@secuirty Day01]$ nodemon index.js
[nodemon] 1.18.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node index.js`
Hello World!Node.js
[nodemon] clean exit - waiting for changes before restart

温馨提示:注意绝对不能用Word和写字板, 导致程序运行出现莫名其妙的错误;


cnpm 环境快速安装与使用
cnpm是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。由阿里推出的淘宝镜像(即cnpm),它把npm官方的”包”全部搬到国内,供广大开发者使用。

  • 快速安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 0.临时使用
    npm --registry https://registry.npmmirror.com install [依赖的名称]

    # 1.使用的是最新的淘宝的镜像源(临时),如`-g`则为全局持久使用(慎用),可能会影响到内部私有包发布。
    npm config set registry https://registry.npmmirror.com
    # 2.配置之后可以验证是否成功(返回刚刚设置的地址即成功)
    npm config get registry
    # 3.也可一条命令搞定,使用 npm 安装 cnpm
    npm install -g cnpm --registry=https://registry.npmmirror.com

    # 5.或者通过添加npm参数alias一个新命令:
    alias cnpm="npm --registry=https://registry.npm.taobao.org \ ​ --cache=$HOME/.npm/.cache/cnpm \ ​ --disturl=https://npm.taobao.org/dist \ ​ --userconfig=$HOME/.cnpmrc"
    $ echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \ --cache=$HOME/.npm/.cache/cnpm \ --disturl=https://npm.taobao.org/dist \ --userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc
  • 快速使用:从registry.npm.taobao.org 安装所有模块. 当安装的时候发现安装的模块还没有同步过来, 淘宝 NPM 会自动在后台进行同步, 并且会让你从官方 NPMregistry.npmjs.org进行安装. 下次你再安装这个模块的时候, 就会直接从 淘宝 NPM 安装了.

1
2
3
4
5
6
7
# 1.安装完成后便可使用 cnpm 安装需要的模块。
cnpm install [package]

# 2.直接通过 sync 命令马上同步一个模块, 注意只有 cnpm 命令行才能使用该功能。
cnpm sync connect
# 当然, 你可以直接通过 web 方式来同步: /sync/connect
$ open https://npm.taobao.org/sync/connect

0x02 命令解析

nvm 命令 - nodejs 版本管理工具

语法参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Usage
nvm --help Show this message
--no-colors Suppress colored output
nvm --version Print out the installed version of nvm
nvm install [<version>] Download and install a <version>. Uses .nvmrc if available and version is omitted.
The following optional arguments, if provided, must appear directly after `nvm install`:
-s Skip binary download, install from source only.
-b Skip source download, install from binary only.
--reinstall-packages-from=<version> When installing, reinstall packages installed in <node|iojs|node version number>
--lts When installing, only select from LTS (long-term support) versions
--lts=<LTS name> When installing, only select from versions for a specific LTS line
--skip-default-packages When installing, skip the default-packages file if it exists
--latest-npm After installing, attempt to upgrade to the latest working npm on the given node version
--no-progress Disable the progress bar on any downloads
--alias=<name> After installing, set the alias specified to the version specified. (same as: nvm alias <name> <version>)
--default After installing, set default alias to the version specified. (same as: nvm alias default <version>)
nvm uninstall <version> Uninstall a version
nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.
nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.
nvm use [<version>] Modify PATH to use <version>. Uses .nvmrc if available and version is omitted.
The following optional arguments, if provided, must appear directly after `nvm use`:
--silent Silences stdout/stderr output
--lts Uses automatic LTS (long-term support) alias `lts/*`, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm exec [<version>] [<command>] Run <command> on <version>. Uses .nvmrc if available and version is omitted.
The following optional arguments, if provided, must appear directly after `nvm exec`:
--silent Silences stdout/stderr output
--lts Uses automatic LTS (long-term support) alias `lts/*`, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm run [<version>] [<args>] Run `node` on <version> with <args> as arguments. Uses .nvmrc if available and version is omitted.
The following optional arguments, if provided, must appear directly after `nvm run`:
--silent Silences stdout/stderr output
--lts Uses automatic LTS (long-term support) alias `lts/*`, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm current Display currently activated version of Node
nvm ls [<version>] List installed versions, matching a given <version> if provided
--no-colors Suppress colored output
--no-alias Suppress `nvm alias` output
nvm ls-remote [<version>] List remote versions available for install, matching a given <version> if provided
--lts When listing, only show LTS (long-term support) versions
--lts=<LTS name> When listing, only show versions for a specific LTS line
--no-colors Suppress colored output
nvm version <version> Resolve the given description to a single local version
nvm version-remote <version> Resolve the given description to a single remote version
--lts When listing, only select from LTS (long-term support) versions
--lts=<LTS name> When listing, only select from versions for a specific LTS line
nvm deactivate Undo effects of `nvm` on current shell
--silent Silences stdout/stderr output
nvm alias [<pattern>] Show all aliases beginning with <pattern>
--no-colors Suppress colored output
nvm alias <name> <version> Set an alias named <name> pointing to <version>
nvm unalias <name> Deletes the alias named <name>
nvm install-latest-npm Attempt to upgrade to the latest working `npm` on the current node version nvm reinstall-packages <version> Reinstall global `npm` packages contained in <version> to current version
nvm unload Unload `nvm` from shell
nvm which [current | <version>] Display path to installed node version. Uses .nvmrc if available and version is omitted.
--silent Silences stdout/stderr output when a version is omitted
nvm cache dir Display path to the cache directory for nvm
nvm cache clear Empty cache directory for nvm
nvm set-colors [<color codes>] Set five text colors using format "yMeBg". Available when supported.
Initial colors are: g b y r e
Color codes:
r/R = red / bold red
g/G = green / bold green
b/B = blue / bold blue
c/C = cyan / bold cyan
m/M = magenta / bold magenta
y/Y = yellow / bold yellow
k/K = black / bold black
e/W = light grey / white

使用演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 查看node版本信息
nvm ls # 当前本地所有版本信息
nvm current # # 显示当前的版本信息
nvm ls-remote # 远程版本信息

# Node 安装
# 安装node最新版本
nvm install node
# 安装node最新稳定版本
nvm install --lts
# 安装指定版本
nvm install 16.17.0

# Node 卸载
nvm uninstall 16.17.0

# 切换 node 版本
nvm use 8.0
# Run app.js using node 6.10.3
nvm run 6.10.3 index.js
# Run `node app.js` with the PATH pointing to node 4.8.3
nvm exec 4.8.3 node app.js

# 为 node 设置默认版本
# 在shell上设置默认节点版本
nvm alias default 8.1.0
# 始终默认为shell上的最新可用节点版本
nvm alias default node

# 删除已定义的别名
nvm unalias <name>

# 当前版本 node 环境下重新全局安装指定版本号的 npm 包
nvm reinstall-packages <version>

示例1.项目下面指定版本号,采用此版本直接执行。

1
2
3
$ vim .nvmrc 
10.15.3
$ nvm use #进行使用该版本运行(通过我们项目文件nvmrc读取版本号进行切换)


node 命令 - nodejs 程序命令

语法参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Usage: 
node [options] [ script.js ] [arguments]
node inspect [options] [ script.js | host:port ] [arguments]

# Options:
- script read from stdin (default if no file name is provided, interactive mode if a tty)
-- indicate the end of node options (指示节点结束选项)
--abort-on-uncaught-exception aborting instead of exiting causes a core file to be generated for analysis
--build-snapshot Generate a snapshot blob when the process exits.Currently only supported in the node_mksnapshot binary.
-c, --check syntax check script without executing
--completion-bash print source-able bash completion script
-C, --conditions=... additional user conditions for conditional exportsand imports
--cpu-prof Start the V8 CPU profiler on start up, and write the CPU profile to disk before exit. If --cpu-prof-dir is not specified, write the profile to the current working directory.
--cpu-prof-dir=... Directory where the V8 profiles generated by --cpu-prof will be placed. Does not affect --prof.
--cpu-prof-interval=... specified sampling interval in microseconds for theV8 CPU profile generated with --cpu-prof. (default: 1000)
--cpu-prof-name=... specified file name of the V8 CPU profile generated with --cpu-prof
--diagnostic-dir=... set dir for all output files (default: current working directory)
--disable-proto=... disable Object.prototype.__proto__
--disallow-code-generation-from-strings disallow eval and friends
--dns-result-order=... set default value of verbatim in dns.lookup.
Options are 'ipv4first' (IPv4 addresses are placed
before IPv6 addresses) 'verbatim' (addresses are in
the order the DNS resolver returned)
--enable-fips enable FIPS crypto at startup
--enable-source-maps Source Map V3 support for stack traces
-e, --eval=... evaluate script
--experimental-fetch experimental Fetch API
--experimental-global-customevent expose experimental CustomEvent on the global scope
--experimental-global-webcrypto expose experimental Web Crypto API on the global scope
--experimental-import-meta-resolve experimental ES Module import.meta.resolve() support
--loader, --experimental-loader=... use the specified module as a custom loader
--experimental-network-imports experimental https: support for the ES Module loader
--experimental-policy=... use the specified file as a security policy
--es-module-specifier-resolution, --experimental-specifier-resolution=...
Select extension resolution algorithm for es
modules; either 'explicit' (default) or 'node'
--experimental-vm-modules experimental ES Module support in vm module
--experimental-wasi-unstable-preview1
experimental WASI support
--experimental-wasm-modules experimental ES Module support for webassembly modules
--force-context-aware disable loading non-context-aware addons
--force-fips force FIPS crypto (cannot be disabled)
--force-node-api-uncaught-exceptions-policy
enforces 'uncaughtException' event on Node API asynchronous callbacks
--frozen-intrinsics experimental frozen intrinsics support
--heap-prof Start the V8 heap profiler on start up, and write
the heap profile to disk before exit. If
--heap-prof-dir is not specified, write the profile
to the current working directory.
--heap-prof-dir=... Directory where the V8 heap profiles generated by --heap-prof will be placed.
--heap-prof-interval=... specified sampling interval in bytes for the V8 heap profile generated with --heap-prof. (default:512 * 1024)
--heap-prof-name=... specified file name of the V8 heap profile generated with --heap-prof
--heapsnapshot-near-heap-limit=... Generate heap snapshots whenever V8 is approaching the heap limit. No more than the specified number of heap snapshots will be generated.
--heapsnapshot-signal=... Generate heap snapshot on specified signal
-h, --help print node command line options (currently set)
--huge-max-old-generation-size increase default maximum heap size on machines with 16GB memory or more
--icu-data-dir=... set ICU data load path to dir (overrides NODE_ICU_DATA) (note: linked-in ICU data is present)
--input-type=... set module type for string input
--insecure-http-parser use an insecure HTTP parser that accepts invalid HTTP headers
--inspect[=[host:]port] activate inspector on host:port (default:127.0.0.1:9229)
--inspect-brk[=[host:]port] activate inspector on host:port and break at start of user script
--debug-port, --inspect-port=[host:]port set host:port for inspector
--inspect-publish-uid=... comma separated list of destinations for inspector uid(default: stderr,http)
-i, --interactive always enter the REPL even if stdin does not appear to be a terminal
--interpreted-frames-native-stack help system profilers to translate JavaScript interpreted frames
--jitless disable runtime allocation of executable memory
--max-http-header-size=... set the maximum size of HTTP headers (default:16384 (16KB))
--no-addons disable loading native addons
--no-deprecation silence deprecation warnings
--no-experimental-repl-await experimental await keyword support in REPL
--no-force-async-hooks-checks disable checks for async_hooks
--no-global-search-paths disable global module search paths
--no-warnings silence all process warnings
--node-memory-debug Run with extra debug checks for memory leaks in Node.js itself
--openssl-config=... load OpenSSL configuration from the specified file (overrides OPENSSL_CONF)
--openssl-shared-config enable OpenSSL shared configuration
--pending-deprecation emit pending deprecation warnings
--policy-integrity=... ensure the security policy contents match the specified integrity
--preserve-symlinks preserve symbolic links when resolving
--preserve-symlinks-main preserve symbolic links when resolving the main module
-p, --print [...] evaluate script and print result
--prof Generate V8 profiler output.
--prof-process process V8 profiler output generated using --prof
--redirect-warnings=... write warnings to file instead of stderr
--report-compact output compact single-line JSON
--report-directory, --report-dir=...
define custom report pathname. (default: current working directory)
--report-filename=... define custom report file name. (default: YYYYMMDD.HHMMSS.PID.SEQUENCE#.txt)
--report-on-fatalerror generate diagnostic report on fatal (internal) errors
--report-on-signal generate diagnostic report upon receiving signals
--report-signal=... causes diagnostic report to be produced on provided signal, unsupported in Windows. (default: SIGUSR2)
--report-uncaught-exception generate diagnostic report on uncaught exceptions
-r, --require=... module to preload (option can be repeated)
--secure-heap=... total size of the OpenSSL secure heap
--secure-heap-min=... minimum allocation size from the OpenSSL secure heap
--test launch test runner on startup
--test-only run tests with 'only' option set
--throw-deprecation throw an exception on deprecations
--title=... the process title to use on startup
--tls-cipher-list=... use an alternative default TLS cipher list
--tls-keylog=... log TLS decryption keys to named file for traffic analysis
--tls-max-v1.2 set default TLS maximum to TLSv1.2 (default:TLSv1.3)
--tls-max-v1.3 set default TLS maximum to TLSv1.3 (default:TLSv1.3)
--tls-min-v1.0 set default TLS minimum to TLSv1.0 (default:TLSv1.2)
--tls-min-v1.1 set default TLS minimum to TLSv1.1 (default:TLSv1.2)
--tls-min-v1.2 set default TLS minimum to TLSv1.2 (default:TLSv1.2)
--tls-min-v1.3 set default TLS minimum to TLSv1.3 (default:TLSv1.2)
--trace-atomics-wait trace Atomics.wait() operations
--trace-deprecation show stack traces on deprecations
--trace-event-categories=... comma separated list of trace event categories to record
--trace-event-file-pattern=... Template string specifying the filepath for the trace-events data, it supports ${rotation} and ${pid}.
--trace-exit show stack trace when an environment exits
--trace-sigint enable printing JavaScript stacktrace on SIGINT
--trace-sync-io show stack trace when use of sync IO is detected after the first tick
--trace-tls prints TLS packet trace information to stderr
--trace-uncaught show stack traces for the `throw` behind uncaught exceptions
--trace-warnings show stack traces on process warnings
--track-heap-objects track heap object allocations for heap snapshots
--unhandled-rejections=... define unhandled rejections behavior. Options are
'strict' (always raise an error), 'throw' (raise an
error unless 'unhandledRejection' hook is set),
'warn' (log a warning), 'none' (silence warnings),
'warn-with-error-code' (log a warning and set exit
code 1 unless 'unhandledRejection' hook is set).(default: throw)
--use-bundled-ca use bundled CA store (default)
--use-largepages=... Map the Node.js static code to large pages. Options are 'off' (the default value, meaning do not map),
'on' (map and ignore failure, reporting it tostderr), or 'silent' (map and silently ignore failure)
--use-openssl-ca use OpenSSL's default CA store
--v8-options print V8 command line options
--v8-pool-size=... set V8's thread pool size
--zero-fill-buffers automatically zero-fill all newly allocated Buffer and SlowBuffer instances
-v, --version print Node.js version

# Environment variables:
FORCE_COLOR when set to 'true', 1, 2, 3, or an empty stringcauses NO_COLOR and NODE_DISABLE_COLORS to beignored. (当设置为"true"时,1、2、3或空字符串会导致忽略`NO_COLOR`和`NODE_DISABLE_COLORS`)
NO_COLOR Alias for NODE_DISABLE_COLORS
NODE_DEBUG ','-separated list of core modules that should print debug information (应打印调试信息的核心模块的单独列表)
NODE_DEBUG_NATIVE ','-separated list of C++ core debug categories that should print debug output (应打印调试输出的C++核心调试类别的分隔列表)
NODE_DISABLE_COLORS set to 1 to disable colors in the REPL (设置为1可禁用REPL中的颜色)
NODE_EXTRA_CA_CERTS path to additional CA certificates file. Only read once during process startup. (其他CA证书文件的路径。在进程启动期间只读取一次。)
NODE_NO_WARNINGS set to 1 to silence process warnings (设置为1以使进程警告静音)
NODE_PATH ':'-separated list of directories prefixed to the module search path (":"-以模块搜索路径为前缀的目录分隔列表)
NODE_PENDING_DEPRECATION set to 1 to emit pending deprecation warnings (设置为1将发出挂起的弃用警告)
NODE_PENDING_PIPE_INSTANCES set the number of pending pipe instance handles on Windows (设置Windows上挂起的管道实例句柄数)
NODE_PRESERVE_SYMLINKS set to 1 to preserve symbolic links when resolving and caching modules (设置为1可在解析和缓存模块时保留符号链接)
NODE_REDIRECT_WARNINGS write warnings to path instead of stderr (将警告写入路径而不是stderr)
NODE_REPL_HISTORY path to the persistent REPL history file (永久REPL历史记录文件的路径)
NODE_TLS_REJECT_UNAUTHORIZED set to 0 to disable TLS certificate validation (0以禁用TLS证书验证)
NODE_V8_COVERAGE directory to output v8 coverage JSON to (将v8覆盖率JSON输出到的目录)
UV_THREADPOOL_SIZE sets the number of threads used in libuv's threadpool (设置libuv线程池中使用的线程数)


使用实践:

1
2
# 1.使用严格模式执行 node.js 脚本
node --use_strict node.js


npm 命令 - nodejs 包管理工具

描述:npm其实是 Node.js 的包管理工具(package manager),它通过 CommonJS 实现, 大家都把自己开发的模块打包后放到npm官网上,然后通过npm安装就可以直接用;

使用 npm 的好处 😋?

  • 解决依赖性问题,解放双手;
  • 学习如何版本控制,下载/删除包等等操作
  • 升级 node 就升级了npm

语法参数

温馨提示:使用 npm 安装包时会产生一个 package.json 配置信息 (项目依赖/开发依赖)。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 初始化项目产生 package.json 配置信息
npm init

# 指定模板安装或者安装安package.json 包里模块
npm install <pkg>
npm i 模块名@版本 # 模板及其版本
npm install request --save # 将下载的包保存在项目配置信息里面 (删除就是uninstall)
npm install babel-cli --save-dev # -D => 将下载的包保存在项目配置信息(开发依赖)里面

# 使用淘宝镜像源来全局安装 cnpm 模块 (比较快),国内环境通常需要配置。
npm install --registry=https://registry.npmmirror.com -g cnpm #--global = 全局安装
npm install --registry=https://registry.npmmirror.com -g nodemon
npm config set registry http://www.npmjs.org # 全局配置切换到官方源
npm config set registry https://registry.npmmirror.com # 全局配置切换到淘宝源

# 更新 npm 与 node.js 版本
npm install n -g

# 显示项目里面安装那些模块
npm list

# 查看模块名可用版本及相关包信息
npm info 模块

# 显示项目中需要更新的模块 在 pakeage.json (^1.1.0)保留主版本号不变, (~1.1.2) (*) 表示更新更新安装最新版本。
npm outdated

# 指定要安装更新的模块
npm update <package_name>

# 在全局中删除forever包
npm uninstall forever -g

# 清除模块下载缓存
npm cache clean

# 符号链接包文件夹,首先把这个包在本地标记下为全局包便可以给其他项目使用
npm link <package_name>
# 取消关联
npm unlink <packagename>

# 测试源的链接时间
npm test


实践案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1.当前项目模块路径与系统全局模块路径查看你
npm root
# /app/fzxt-clientfront-master/
npm root -g
# /usr/local/lib/node_modules/


# 2.全局模块安装路径或者与设置
npm config get prefix
npm config set prefix /usr/local
npm config delete prefix /usr/local
npm config list [--json]
npm config edit
# 显示全局设置详细信息
npm config ls -l

# 3.安装指定dependencies或者devDependencies中的依赖模块内容
npm install --dependencies
npm install --devDependencies

# 4.安装、更新、卸载全局包
npm install -g jshint
npm update -g jshint
npm uninstall -g jshint

# 5.查看全局中那些包需要更新
npm outdated -g --depth=0

# 6.查看环境中所有的全局包
npm list -g --depth=0
# /root/.nvm/versions/node/v16.17.0/lib
# ├── corepack@0.12.1
# └── npm@8.15.0

# 7.使用NPM Link链接本地私有项目
npm link # 私有包目录后执行
npm link ..//packagename # 使用相对路径关联这个包
npm unlink ../packagename # 取消关联