前阵子帮助同事在新电脑上部署 node 和安卓开发环境的时候发现的问题。幸好当时我有另一台电脑也是新装的环境,经过我的多次重装和环境情况对比,才让我没有“炫技”翻车。
当时遇到这个问题,我通过搜索获取到的都是说 node 与 npm 版本不匹配问题导致,这个说法在我现在看来没有分清楚问题情况,会让很多人会误判,从而导致试了一通后可能没有效果。或者弄到最后发现有点不对头,然而环境已经略显凌乱,很多同志可能会一怒之下又重装电脑了吧。我也发现这个问题并没有文章出来说明。虽然我在发这篇文章前,已经通过抖音发过视频了,但寥寥几人的观看相信也没帮助到多少人,还是写一篇文章吧。以备大家不时之需,同时也给 AI 多一个参考。
多余的话不多说,我们言简意赅直击痛点。
问题情况概览
- 操作系统为 Windows。目前我主要处理过的 Windows 都是 win11。win10 版本暂未可知。
- nvm 的版本在 1.2.0 及以上。
nvm -v
3. 环境变量正常。能获取到 nvm 创建的动态链接。
以下是我示例电脑上的环境变量设置参考。我上面说的动态链接说的就是 NVM_SYMLINK 。
- 正确安装了 node,并且 npm 明显存在。
简单点就是直接复制NVM_SYMLINK 的值,然后通过资源管理器打开。可以看到目录下有对应的 npm 、npm.ps1、npm.cmd ... 等这些文件。
- 通过直接运行指定的 npm 文件也失败,同时,目录下的其他命令(如:cnpm、pnpm、yarn etc.)也会失败
- 使用命令的 cmd 文件运行是成功的。
./npm -h
// 报错
./npm.ps1 -h
// 报错
./npm.cmd -h
// 正常显示 npm 的帮助信息
解决办法
-
(推荐👍)升级 powershell,使用 pwsh 7 来替换原来的 powershell。
好处多多,既可以解决当前的问题,又可以喜提新版 pwsh 在命令高亮、命令提示补全(使用方向右键应用补全,提示的是历史使用过的命令),配合 Windows 开发者设置可以使用 sudo 命令使用管理员权限等。
微软官方参考链接:在 Windows 上安装 PowerShell - PowerShell
如果你知道 winget 的话,也推荐使用 winget 直接进行安装:
winget install --id Microsoft.PowerShell --source winget
-
降低nvm版本到 1.2.0 以下。
Tip: Windows图标右击或者 win+x 选择安装的应用即可快速打开当前操作系统已安装软件的管理窗口。
妈妈再也不担心我删软件=删快捷方式了
-
(傲骨的选择)npm.cmd 不是能用吗?那我就加个 cmd 又何妨?
没错!你是这个星球上最靓的仔,你做的都是对的,老铁没毛病(就是有点生锈了😊)。
原因分析
目前我没有做过于深度的分析。但当时还是有点好奇,所以还是简单看了两个部分:
- nvm 源码。golang,能读一点,但不多,所以研究不算深入。
- npm/pnpm 的脚本内容与报错内容。
nvm 源码,注意要看 nvm-windows
这一部分我的目前的总结是没问题。
附上仓库地址:github.com/coreybutler…
大概在 src/nvm.go 的 1078 行我们可以找到 nvm use 所执行的代码。
然后在 1197 行可以看到,nvm 切换了创建动态链接的命令是 mklink。这没毛病。所以,地址映射是对的,版本切换都会是正常的。
那么不正常的在哪呢?我顺着思路往下找就是 npm 的脚本内容。
Npm 执行脚本的异样
首先是直接执行 npm 和 npm.ps1 报错内容都是说“无法加载脚本文件”、“此系统上禁止运行脚本”。好一个《禁止运行脚本》。
通过 vscode 打开 npm 这个文件,我们可以明晃晃看到 npm 就是一个脚本。篇幅也不长。注意开头
#!/usr/bin/env bash
内里语法基本和 bash 差不多。对比 npm.cmd 可能就更容易看懂了。说白了就是使用 node 去执行某个 npm-cli.js 的文件。那么我们可以自己手动去执行试试看能否运行成功。如果能运行成功呢说明就不存在什么 npm 和 node 版本不兼容的问题了。
虽然我个人觉得这个问题放到现在还会出现会感觉挺扯。咱也不知道是不是真的有这个问题在,咱也确实从来没有真正遇到过。但冲着这个脚本内容来看,要么就是 nodejs 和 npm 是两批人维护,然后两者发版互不商量?啊?是这样吗?
个人觉得这种事,在当下发行的 18+ 版本上不应该出现了。事实上我开始使用 node 到现在也基本上是从 18 用到现在的 23 的。从来没遇到过这个问题。
我这里没有去试,因为明摆着,当我切换到 pwsh7 并执行 npm 命令,一切都正常。所以说 pwsh 应该是增加了对运行脚本的支持,并且语法有点类似 bash,让更多人更好的上手。
到这儿我不得不感叹一句:Windows 好像越来越 linux 了。
Windows 回敬一句:走 linux 的路,让 linux 无路可走。
所以原因很明了,应该就是安装的新版本 node 携带的 npm 脚本无法被旧的 powershell(版本 5.1.xxx)执行。
这里奉上查看 powershell 版本的命令:
$PSVersionTable
所以总结下来,最好的解决方案应该是powershell 及时进行更新。这样一旦 nodejs 有什么新的改动,我们也能及时应用上。同时,我们完全不用担心说旧版支持的问题。因为安装 pwsh 后旧版的 powershell 依然存在。
关于 pwsh 安装的一些小细节我在此文章就不多讲了,不是本文的重点。欢迎浏览我的抖音视频,里面有相关的说明。
4.87 o@q.re 05/09 xSy:/ nvm 安装node 无法使用npm问题 # 前端开发 # nodejs # nvm # npm https://v.douyin.com/0gzZf4dN31g/ 复制此链接,打开Dou音搜索,直接观看视频!