node版本管理器:nvm 和 n区别
node版本管理器:nvm 和 n区别
在 node
的版本管理工具中,nvm
自然声名远扬,然而我们也不能忘了来自 TJ
的 n
。这两种,是目前最主流的方案。
关于这两个工具如何安装和使用,这里不再多说,请见它们各自的主页:
接下来我们着重关注一下 nvm
和 n
的运作机制和特性。
n
-
n
依赖于node
n 是一个需要全局安装的
npm package
。
npm install -g n
这意味着,我们在使用 n
管理 node
版本前,首先需要一个 node
环境。我们或者用 Homebrew
来安装一个 node
,或者从官网下载 pkg
来安装,总之我们得先自己装一个 node
——n
本身是没法给你装的。
然后我们可以使用 n
来安装不同版本的node
。在安装的时候,n
会先将指定版本的node
存储下来,然后将其复制到我们熟知的路径/usr/local/bin
,非常简单明了。当然由于n
会操作到非用户目录,所以需要加 sudo
来执行命令。
所以这样看来,n
在其实现上是一个非常易理解的方案。
but ,n
会出现全局模块无法更新的问题
nvm
我们再来看 nvm
。不同于 n
,nvm
不是一个 npm package
,而是一个独立软件包。这意味着我们需要单独使用它的安装逻辑:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
或者使用 Homebrew
来安装。安装完后,还需要修改一下 shell 配置(~/.zshrc or whatever)
,具体参见官方文档。
然后我们可以使用 nvm
来安装不同版本的 node
。
在安装的时候,nvm
将不同的 node
版本存储到 ~/.nvm/<version>/
下,然后修改 $PATH
,将指定版本的node
路径加入,这样我们调用的 node
命令即是使用指定版本的 node
。
nvm
显然比n
要复杂一些,但是另一方面,由于它是一个独立软件包,因此它和 node 之间的关系看上去更合乎逻辑:nvm
不依赖node
环境,是node
依赖nvm
;而不像n
那样产生类似循环依赖的问题。
- 如何选择?
这样看下来,nvm
和 n
的差异还是比较大的,具体体现在:
- 安装简易度。
nvm
安装起来显然是要麻烦不少;n
这种安装方式更符合node
的惯性思维。见仁见智吧。 - 系统支持。注意,
nvm
不支持Windows
。 - 对全局模块的管理。
n
对全局模块毫无作为,因此有可能在切换了node
版本后发生全局模块执行出错的问题;
nvm
的全局模块存在于各自版本的沙箱中,切换版本后需要重新安装,不同版本间也不存在任何冲突。关于
node
路径。n
是万年不变的/usr/local/bin;
nvm
需要手动指定路径。
所以,如何选择?真心见仁见智了,不过这里可以给出大体的建议:
1. 如果你使用 Windows
,那没得选了,使用 n
,或者换一台 Mac
。
2. 如果你会频繁切换 node
版本(比如本地经常测试最新版的特性,同时又要兼顾代码在生产环境的兼容性),那么从全局模块兼容性的角度考虑,只能使用 nvm
。
3. 如果你是一个轻量级的用户,不需要担心兼容性的问题,更关心 node
安装和使用上的体验,那么选择 n
。
4. 你如果要问,博主最终选用了谁?我会说,我选择了更流行的那一个。
- es6 Symbol
- 使用Windbg和SoS扩展调试分析.NET程序
- WordPress 路径相关函数总结(四):路径相关常量
- .net和java互操作
- WordPress 路径相关函数总结(三):插件路径相关函数
- 修改WordPress 搜索结果页面url 形式,安全有保障
- C# Enum设计和使用的相关技巧
- 小程序如何利用更低成本获得高流量?
- 使用System.Net.Mail通过gmail发送电子邮件
- 删除 WordPress 导航菜单的多余 CSS 选择器(id或class)
- es6 对象的扩展
- 自定义WordPress 标签云小工具相关参数
- 检查.NET程序平台目标(Platform Target)工具CorFlags
- 哪些行业最适合抢驻小程序?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版
- graph attention network(ICLR2018)官方代码详解(tensorflow)
- 在SAP Spartacus产品明细页面用outlet显示自定义数据
- 如何在SAP Spartacus自定义Component里消费数据
- 使用ConfigModule.withConfig替换SAP Spartacus标准Component
- pod 资源对象
- 在Java8的foreach()中使用return/break/continue
- JavaScript 覆盖对象字段级别
- Zabbix5.0 问题记录
- 「查缺补漏」巩固你的Nginx知识体系
- 超级帐本合约调用——fabric SDK Node调用TBaaS的合约
- TBaaS合约调用_fabric SDK Node 不使用Connection Profile
- helm安装、使用、实践
- 浅析asp .net core 中间件
- 玩转jenkins - 在自己的服务器上安装jenkins