Node 版本自动切换
在开发过程中,我们可能会遇到这样的问题:项目 A 需要 Node v14,项目 B 需要 Node v16,而我们虽然使用了 nvm 工具来控制 Node 的版本管理,但遇到同时开发的时候,还是会很影响开发效率
• 保证开发人员使用相同的 Node 版本
• 如果未安装对应版本,自动提示安装 Node 版本流程化
• 自动切换 Node 版本,减少心智负担
暂只支持 Windows
使用
原理
利用终端 shell 的别名(alias)功能,将 npm 命令重命名为 npmm,在执行 npmm 命令时,先执行 nvm use 切换到项目指定的 Node 版本,再执行 npm 命令
npmm run dev
配置
在项目的 package.json 中设置 engines 字段
{
“engines”: {
“node”: “>=14.21.3”
}
}
在终端 shell 中,键入 notepad $profile
打开 PowerShell 配置文件,添加下面代码
PowerShell 脚本源码
Set-Alias npmm Set-NpmAlias
function Set-NpmAlias {
$allArgs = $args
$verbose = $allArgs -contains “-Verbose”
if ($verbose) {
$allArgs = $allArgs | Where-Object { $_ -ne “-Verbose” }
}
Set-Nvm -Verbose:$verbose
npm $allArgs
}
function Set-Nvm {
[CmdletBinding()]
param()
检查 nvm 是否安装
$nvm =
(
G
e
t
−
C
o
m
m
a
n
d
n
v
m
−
E
r
r
o
r
A
c
t
i
o
n
S
i
l
e
n
t
l
y
C
o
n
t
i
n
u
e
)
i
f
(
(Get-Command nvm -ErrorAction SilentlyContinue) if (
(Get−Commandnvm−ErrorActionSilentlyContinue)if(null -eq $nvm) {
Write-Host “nvm 不存在`n” -ForegroundColor Red
Write-Host “- 如果已安装,请确认是否将 nvm 添加到环境变量” -ForegroundColor Yellow
Write-Host “- 如果未安装” -ForegroundColor Yellow
Write-Host " + 在 PowerShell 中执行 winget install CoreyButler.NVMforWindows" -ForegroundColor Yellow
Write-Host " + 访问 https://github.com/coreybutler/nvm-windows/releases 下载最新版本" -ForegroundColor Yellow
Write-Host “”
}
检查当前所在目录是否是前端项目
$packageJson =
(
G
e
t
−
C
h
i
l
d
I
t
e
m
−
P
a
t
h
.
−
F
i
l
t
e
r
p
a
c
k
a
g
e
.
j
s
o
n
−
E
r
r
o
r
A
c
t
i
o
n
S
i
l
e
n
t
l
y
C
o
n
t
i
n
u
e
)
i
f
(
(Get-ChildItem -Path . -Filter package.json -ErrorAction SilentlyContinue) if (
(Get−ChildItem−Path.−Filterpackage.json−ErrorActionSilentlyContinue)if(null -eq $packageJson) {
return
}
$nodeVersion = ‘’
$currentNodeVersion =
(
(
((node -v)).replace(‘v’, ‘’)
$versionFrom = ‘’
检查 package.json 中是否有 engines.node 字段
$enginesNode =
(
G
e
t
−
C
o
n
t
e
n
t
p
a
c
k
a
g
e
.
j
s
o
n
∣
C
o
n
v
e
r
t
F
r
o
m
−
J
s
o
n
)
.
e
n
g
i
n
e
s
.
n
o
d
e
i
f
(
(Get-Content package.json | ConvertFrom-Json).engines.node if (
(Get−Contentpackage.json∣ConvertFrom−Json).engines.nodeif(null -eq KaTeX parse error: Expected '}', got 'EOF' at end of input: …e) { if (VerbosePreference -eq “Continue”) {
Write-Host “package.json 中没有 engines.node 字段” -ForegroundColor Yellow
Write-Host “”
}
}
else {
# 处理 engines.node 字段
$nodeVersion = $enginesNode -replace ‘[>=< ]’, ‘’
v
e
r
s
i
o
n
F
r
o
m
=
′
p
a
c
k
a
g
e
.
j
s
o
n
′
i
f
(
versionFrom = 'package.json' if (
versionFrom=′package.json′if(VerbosePreference -eq “Continue”) {
Write-Host “当前项目的 package.json 中指定的 node 版本为 v$nodeVersion” -ForegroundColor Yellow
}
}
检查当前目录是否有 .nvmrc 文件
$nvmrc =
(
G
e
t
−
C
h
i
l
d
I
t
e
m
−
P
a
t
h
.
−
F
i
l
t
e
r
.
n
v
m
r
c
−
E
r
r
o
r
A
c
t
i
o
n
S
i
l
e
n
t
l
y
C
o
n
t
i
n
u
e
)
i
f
(
(Get-ChildItem -Path . -Filter .nvmrc -ErrorAction SilentlyContinue) if (
(Get−ChildItem−Path.−Filter.nvmrc−ErrorActionSilentlyContinue)if(null -eq KaTeX parse error: Expected '}', got 'EOF' at end of input: …c) { if (VerbosePreference -eq “Continue”) {
Write-Host “当前目录没有 .nvmrc 文件” -ForegroundColor Yellow
Write-Host “”
}
}
else {
$nodeVersion = $(Get-Content .nvmrc).replace(‘v’, ‘’)
v
e
r
s
i
o
n
F
r
o
m
=
′
.
n
v
m
r
c
′
i
f
(
versionFrom = '.nvmrc' if (
versionFrom=′.nvmrc′if(VerbosePreference -eq “Continue”) {
Write-Host “当前项目的 .nvmrc 文件中指定的 node 版本为 v$nodeVersion” -ForegroundColor Yellow
}
}
如果没有找到 node 版本,使用默认版本
if ($nodeVersion -eq ‘’) {
$nodeVersion = $currentNodeVersion
v
e
r
s
i
o
n
F
r
o
m
=
′
n
o
d
e
−
v
′
i
f
(
versionFrom = 'node -v' if (
versionFrom=′node−v′if(VerbosePreference -eq “Continue”) {
Write-Host “没有在项目下找到指定的 node 版本, 使用默认版本 v$nodeVersion” -ForegroundColor Yellow
}
}
如果版本一致,不需要切换
if ($nodeVersion -eq KaTeX parse error: Expected '}', got 'EOF' at end of input: …n) { if (VerbosePreference -eq “Continue”) {
Write-Host “当前 node 版本为 v$nodeVersion,无需切换” -ForegroundColor Yellow
Write-Host “”
}
return
}
Write-Host “指定 Node 版本( v e r s i o n F r o m ) : v versionFrom): v versionFrom):vnodeVersion” -ForegroundColor Green
$response = nvm use
n
o
d
e
V
e
r
s
i
o
n
i
f
(
nodeVersion if (
nodeVersionif(response -match ‘is not installed’) {
$confirmInstall = Read-Host “是否安装 node 版本
n
o
d
e
V
e
r
s
i
o
n
(
y
/
n
)
"
i
f
(
nodeVersion (y/n)" if (
nodeVersion(y/n)"if(confirmInstall -eq ‘y’) {
Write-Host “”
if ($response -match ‘64-bit’) {
nvm install $nodeVersion x64
}
else {
nvm install $nodeVersion x86
}
nvm use KaTeX parse error: Expected 'EOF', got '}' at position 19: …eVersion }̲ else { …currentNodeVersion 继续后面的操作” -ForegroundColor Yellow
Write-Host “”
return
}
}
else {
Write-Host $response
}
}