通过NVM管理Node.js多版本

0x00 背景概述

本文将展示如何在腾讯云服务器(如CVM或Lighthouse实例)中,通过NVM这一工具在不同的项目中切换Node.js版本,并更新至最新的v14版。

Node.js版本背景

Node.js拥有一个开发迭代稳定且快速的社区。它的当前最新主版本(Current Release)会通常持续半年,用来给社区的工具库的开发者足够的时间来作兼容等支持处理。而半年后,奇数的发布版本(如9、11等)会被过期且明确不支持,而偶数的发布版本(如目前的12版本等)将会进入Active LTS状态,而后进入Maintenance LTS状态提供长期维护。LTS版本即“Long-term support”,由Node.js官方社区保证5年内,典型的重要缺陷都会被及时修复。生产环境中的软件应该例仅使用这些LTS版本(即Acitve LTS版或者Maintenance LTS版)。其实类似的发布模式在开源社区中也很常见,比如Ubuntu等。

如图所示,目前Nodes.j的Active LTS版是12版(12.18.3),它的从2019年开始发布,LTS阶段从2019至2022年共5年时间。而目前的当前版本(Current)是14版本,将于今年(2020年)下半年进入LTS状态,14版相比12版由非常大的提升和特性更新。对于任何前端/Node.js开发者,此刻应该是了解熟悉其特性最佳时机,提早把握趋势未雨绸缪。

多版本的应用

如果你需要在不同地项目中用不同版本地Nodes.js,那么,NVM类似地工具几乎是必需的。类似地工具可以大大提升Node.js地开发生态环境,因为我们大部分开发者都会用到很多Node.js生态中地库如用于构建地Gulp.js、用于Web服务地Express.js、渲染页面地React.js以及更加上层的应用框架Next.js等等,而这些库/框架往往需要特定版本地Node.js版本。这个时候,NVM就派上用场了。当然,如果你的开发过程完全是基于Docker容器的,也能解决这个烦恼(没有免费的午餐,用Docker也会有额外的成本,后续教程中我们还会专门提到)。

那么,现在我们上路吧~

0x01 环境准备

首先还是必须的云服务器实验环境。如果你已经有了一台云服务器,无论是CVM和还是Lighthouse实例,并在其上安装了Node.js,那么可以跳过本节内容,进入NVM安装环节。反之,强烈推荐腾讯云的Lighthouse(轻量应用服务器)实例,因为它在选购体验、使用体验、性价比、易用程度等多个方面都有这更加突出的优势,更加时候中小项目或综合实验用途。

该产品以套餐形式提供了便捷的云主机选购,网络流量包、应用镜像以及免密登录等特性也更加注重了人性化的体验。Lighthouse作为目前最炙手可热的面向个人开发者及中小企业的新一代云服务产品,特别适合搭建个人博客、网站、论坛、小型应用等多种场景。另外,其良心的价格和促销力度也是前所未有,其持续运营的策略是相对面向未来的。总之,如果需要一台CVM(云服务器),可以考虑先使用Lighthouse。

详细的产品介绍可以参考这里:Lighthouse产品介绍,点击前往 购买传送门,如下图所示:

可以看到,一页选项就购买出了默认安装Node.js开发环境的云服务器。确实方便。

然而瑕瑜互见,Lighthouse的Node.js的版本是v12.16.1,其并非当前最新的Current Release,甚至不是最新的LTS版本。当然作为较新的LTS的版本,此版本摆在官网没有任何不妥。但对于有更高追求的开发者而言,的确需要更加灵活炫酷的方案。

0x02 安装NVM

我们将用NVM工具来管理多版本的Node.js。NVM,即Node Version Manager(最新版本是v0.35.3),是目前最流行地Node.js版本管理工具。它可以运行在任何与POSIX兼容的shell上(如bash、zsh、dash、ksh等等),并且可以运行在Linux/Unix、MacOS、甚至Windows WSL等多中系统。用它可以轻松实现,不同用户以及不同shell终端,所用的Nodes.js都版本各异。

附上NVM官方文档:https://github.com/nvm-sh/nvm

注意:如果机器上已经存在先前安装了的Node.js(如按照官方文档说明,已经装在/usr/local目录下的先前版本),完全不用担心也无需卸载。已安装的版本仍然能用NVM统一管理。NVM对已有的Node.js是无侵入地增量式管理。这点其实非常赞。

安装过程非常简单,分两步:

1. 下载安装

NVM的下载安装过程非常方便,一行命令即可:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

执行如下:

~ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13527  100 13527    0     0   733k      0 --:--:-- --:--:-- --:--:--  733k
=> Downloading nvm from git to '/home/lighthouse/.nvm'
=> Cloning into '/home/lighthouse/.nvm'...
remote: Enumerating objects: 290, done.
remote: Counting objects: 100% (290/290), done.
remote: Compressing objects: 100% (257/257), done.
remote: Total 290 (delta 35), reused 97 (delta 20), pack-reused 0
Receiving objects: 100% (290/290), 163.27 KiB | 708.00 KiB/s, done.
Resolving deltas: 100% (35/35), done.
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/lighthouse/.bashrc
=> Appending bash_completion source string to /home/lighthouse/.bashrc
=> You currently have modules installed globally with `npm`. These will no
=> longer be linked to the active version of Node when you install a new node
=> with `nvm`; and they may (depending on how you construct your `$PATH`)
=> override the binaries of modules installed with `nvm`:
/usr/local/lib
├── http-server@0.12.3
=> If you wish to uninstall them at a later point (or re-install them under your
=> `nvm` Nodes), you can remove them from the system Node as follows:

     $ nvm use system
     $ npm uninstall -g a_module

=> Close and reopen your terminal to start using nvm or run the following to use it now:

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

2. 终端生效

如果默认用bash,退出终端直接重新登录即可,因为安装脚本修改了我们主目录下的.bashrc文件。但如果像我一样,用的是zsh的话,那么需要手动将以下内容添加到用户主目录下的.zshrc配置文件,并重新登录zsh。

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 --version
0.35.3

0x03 切换系统和LTS版本

安装新版本: install 子命令

我们安装目前最新的LTS版本(v12.18.3)

nvm install v12.18.3

查看已安装版本:list/ls 子命令

nvm list

蓝色:系统已安装版本;绿色:当前使用版本;另外还有暗黄色的系统先前已经安装的版本。

生效新版本:use 子命令

默认新安装的会生效,如果指定切换某一个版本,通过use子命令:

nvm use v12.18.3

注意!nvm use后的版本是全局生效的,即后续新打开的全部teminal里都会生效的。如果需要某个终端里用不同的版本,直接在该终端里执行nvm use即可覆盖。

切换会之前的系统版本

nvm use system

0x04 安装最新的14版本

最新的Node.js版本(Current Release)是14.9.0,我们可以直接安装它。

~ nvm install v14.9.0
Downloading and installing node v14.9.0...
Downloading https://nodejs.org/dist/v14.9.0/node-v14.9.0-linux-x64.tar.xz...
############################################################################# 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v14.9.0 (npm v6.14.8)
Creating default alias: default -> v14.9.0

.nvmrc文件

虽然用上节的 nvm use XXX 命令也可以做到切换不同版本,但仍然感觉不是很方便。我们可以在项目根目录下创建.nvmrc文件,仅一行内容

v14.9.0

后续就可以用如下更简单的命令灵活切换了。

nvm use

0x05 通过Alias管理

其实,大多数情况,我们不需要特别关注小版本号。通过Alias(别名)来管理,可以更加方便。

如最新的LTS版本的默认Alias为lts/erbium,而最新的版本为default。当然还可以重新设置系统里的分支名字,即可以自定义关联。这也是非常实用的特性,可以大大简化切换的操作和理解成本。

0x06 Node.js 14的特性更新

Nodes.js版本14相比目前的LTS版本由很多重要的特性更新,是最新一代的更快更强的基于事件驱动的服务器端JavaScript引擎。

重要的特性如:

  • libuv更新至最新的1.39.0;
  • V8引擎升级之8.4版,增加object print等调试输出功能;
  • 新增了’fs/promises’:可以直接在fs模块中使用promise而不再用promisify了;
  • async_hooks
  • EventTarget API
  • 更快的zlib
  • CallTrackers
  • V8 Array Buffer API

有兴趣的朋友可以持续关注下,后续还会由专门的教程详细介绍。

0x07 小结一下

相信阅读到此,你已经可以在自己的腾讯云服务器上安装下载NVM管理工具,并轻松地管理/切换多个Node.js版本了。

那么从现在起,尝试在下一个项目中用最新版本的Node.js吧!

0x08 参考资料

正文完