[Node翻译]Volta vs. nvm:JavaScript工具的问题

2,839 阅读3分钟

本文由 简悦SimpRead 转码,原文地址 sirre.al

我在几个使用nvm(Node Version Manager)管理Node.js版本的JavaScript项目上工作,......

我在几个使用nvm(Node Version Manager)来管理Node.js版本的JavaScript项目上工作。我最近开始使用Volta来替代nvm,并且印象非常深刻。

我将解释Volta和nvm的区别,以及为什么我对Volta感到兴奋。Volta的优势来自于以下两个方面的改进。

  • Volta自动安装和使用项目定义的工具。
  • Volta对全局脚本有更好的处理。

在我们开始之前,请注意

下面所有的内容都假设我们在一个有增加对Volta的支持的项目上工作。这就像找到首选的Node.js和npm或yarn版本并运行volta pin一样简单。

# cat .nvmrc
lts/*
# grep -A3 engines package.json
        " engines": {
                "node": ">=10.0.0",
                "npm": ">=6.9.0"
        },
# volta pin node@lts npm@6
success: pinned node@14.15.5 in package.json
success: pinned npm@6.14.11 in package.json

这将为package.json添加一个volta属性,这是Volta跟踪版本的方式。

神奇地得到正确的工具

nvm的存在是为了处理Node.js的版本,是什么让Volta变得更好? nvm要求你在切换项目时总是运行命令(nvm use)或者在你的shell中添加助手。这些都是可以克服的,但Volta只是处理它。

nvm可以很好地处理Node.js,但是npmyarn呢?当人们从npm v6转移到v7时,你是否在为package-lock.json的版本变化而苦恼?

Volta为你解决了这个问题,我们把这个工具钉在了我们的项目中,所以我们会一直使用这个版本。看看吧。

# node --version
v14.15.5
# npm --version
6.14.11
# cd ..
# npm --version
7.5.2
# node --version
v15.8.0
# cd -
# node --version
v14.15.5

神奇地得到了正确的工具的正确版本

这可真酷。我的项目刚刚升级了Node.js,那是什么感觉?

videos.files.wordpress.com/r6PgXGia/vo…

Volta知道正确的工具是什么

我有没有提到Volta知道正确的工具?

我做了很多TypeScript的开发,并大量使用tsc(TypeScript编译器的命令行接口)。tsc在全球范围内可用是很方便的,但不同的版本支持不同的语言特性。

我可以用npm install --global typescript安装tsc在任何地方使用,但当我切换到我的项目时,我必须记得从node_modules/.bin/tsc使用 它的 tsc

Volta则不然。如果你的项目中包含了bin,它就会神奇地使用bin,否则就使用全局安装。

# volta install typescript@beta
success: installed typescript@4.2.0-beta with executables: tsc, tsserver
# tsc --version
Version 4.2.0-dev
# cd gutenberg/
# tsc --version
Version 4.1.3

很好,对吗?

还有什么?

nvm将你的全局npm安装与Node.js的特定版本联系起来。这很好,因为当你切换版本时,它们不会中断,但令人讨厌的是,当你改变Node.js版本时,可用的脚本完全不同。

是的,Volta可以处理这个问题。全局脚本与安装它们的Node.js版本相关,所以它们是稳定的。

动心了吗?

我也是。前往Volta docs开始工作,或者运行他们的安装程序,开始工作。

curl https://get.volta.sh | bash
volta install node@lts

你应该能够在不完全投入的情况下试用nvm和Volta,方法是在你的shell的rc(例如~/.bashrc)中注释掉相关的块。寻找诸如export NVM_DIR=export VOLTA_HOME=这样的块,并注释掉你想禁用的块。