Windows上的Node.js无法找到安装的模块

264

我目前正在Windows上学习Node.js。使用npm.cmd全局安装了多个模块,但是Node.js无法找到安装的这些模块。以jade为例,

npm install jade -g

Jade被安装在目录"C:\Program Files (x86)\nodejs\node_modules"中,但下面的代码将会因为"Cannot find module 'jade'"错误而失败。

var jade = require('jade');

然而,在本地安装jade(npm中不带-g选项)时,该代码将成功运行。我不想使用本地安装的模块,那对我来说浪费了磁盘空间。如何使全局安装的模块在Windows上工作?


https://dev59.com/VmUp5IYBdhLWcg3wJlEH#15471995 - Amol M Kulkarni
3
不确定这与此处的相关性。在Windows上添加“.js”到require中并不能解决问题。 - Dan Dascalescu
1
@DanDascalescu:我认为你误解了答案。那个答案中给出的代码是Node.js的代码,它展示了如何查找所需的包。因此,如果你理解它在哪里以及如何查找文件,那么你就可以更轻松地解决你的问题。 - Amol M Kulkarni
https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows - user3025289
根据 https://dev59.com/M2025IYBdhLWcg3wwYz4#5830153,运行 npm install forever -g 进行全局模块安装。 - Sharif Yazdian
修正路径并尝试使用另一个命令行,如PowerShell。 - Omar bakhsh
21个回答

375

添加一个名为NODE_PATH的环境变量,并将其设置为%USERPROFILE%\Application Data\npm\node_modules(Windows XP),%AppData%\npm\node_modules(Windows 7/8/10)或者在你的Windows版本上npm安装模块的位置。为了一劳永逸,可以在“系统属性”对话框的“高级”选项卡中将其作为系统变量添加(运行control.exe sysdm.cpl,System,3)。

在Windows 7+中的快速解决方案是只需运行:

rem for future
setx NODE_PATH %AppData%\npm\node_modules
rem for current session
set NODE_PATH=%AppData%\npm\node_modules
值得一提的是,在Node应用程序中导入模块时才会使用NODE_PATH。当你想要在CLI中使用全局安装的模块二进制文件时,你也需要将它添加到PATH中,但不包括node_modules部分(例如,在Windows 7/8/10中为%AppData%\npm)。

老故事

我对node.js还比较陌生,因此我可能不完全正确,但根据我的经验,它的工作方式如下:

  1. -g不是安装全局库的方式,它只是一种将它们放置在系统路径上的方式,以便您可以从命令行调用它们,而无需编写完整的路径。它非常有用,例如,当node应用程序转换本地文件(例如less)时,如果你全局安装它,你就可以在任何目录中使用它。
  2. node.js本身不会查看npm全局目录,它使用另一种算法来查找所需文件:http://nodejs.org/api/modules.html#modules_file_modules (基本上它会扫描路径中的每个文件夹,从当前文件夹开始搜索 node_modules 文件夹并检查它)。

更多详细信息请参见类似问题:如何使用npm全局安装模块?


17
非常感谢,您提供的链接非常有帮助,我现在更清楚了,尽管模块搜索算法看起来有些复杂。最后,我使用环境变量NODE_PATH来引用全局模块路径,即 set NODE_PATH=C:\Documents and Settings\DevUser\Application Data\npm\node_modules,并且它按预期工作。奇怪的是,全局安装的模块在Windows上放置在 '%USERPROFILE%\Application Data\npm\node_modules' 中,同时,NODE_PATH中不能有引号。 - Cosmore
2
很高兴能帮忙。更改NODE_PATH会破坏对标准node.js模块(如FS)的路径吗? - Alexey Ivanov
2
我也在想为什么我使用“npm install -g express”安装的模块在“C:\Program Files\nodejs\node_modules\npm\node_modules”中找不到,但是它可以在“C:\Documents and Settings\swapnil\Application Data\npm\node_modules”中找到。 - Swapnil Mhaske
1
在Windows 8中,该路径为%USERPROFILE%\AppData\Roaming\npm\node_modules - Yar
9
如果你想找到全局的 node_modules 目录在哪里,运行命令 npm list -g。输出的第一行将是全局 node_modules 目录的上级目录--换句话说,全局 node_modules 目录是 {输出}\node_modules。当你运行 npm install --global {xyz} 时,它也会打印出安装目录。 - cowlinator
显示剩余4条评论

41

我知道我可以唤醒一个僵尸,但我认为这仍然是个问题。如果你需要在Windows 7上全局访问节点模块,你需要将以下内容添加到你的全局变量路径中:

C:\Users\{USER}\AppData\Roaming\npm

重要提示:只需要删除 node_modules 部分,我花了半个小时才看到这一点。


4
对于Windows 8用户,可以选择使用以下路径: %USERPROFILE%\AppData\Roaming\npm - Benson
4
谢谢你关于删除node_modules部分的建议,我也在这方面苦苦挣扎! - danguilherme

34

如果您正在使用Windows 7平台,则可能需要像这样更改NODE_PATH:%AppData%\npm\node_modules


7
在Windows 8上,它也在appdata\roaming文件夹中。 - JonnyRaa
6
我正在使用 Windows 8.1 和 npm 2.5.1,已经按照文档设置了 NODE_PATH,但它仍然找不到我安装的包。有什么想法吗? - JaKXz
5
在 Windows 10 中,应该只需输入 %AppData%\npm 即可。 - gkiely
在我的情况下(W10),它是%AppData%\Roaming\npm。 - Hinrich

28

为了让它在 Windows 10 上正常工作,我通过将文件夹 %USERPROFILE%\AppData\Roaming\npm 添加到我的 PATH 中解决了这个问题。像这样附加 \node_modules: %USERPROFILE%\AppData\Roaming\npm\node_modules\ 对我来说行不通。


7
更简单地说,"%AppData%\npm"。 - Dan Diplo
这太奇怪了,居然行了!我已经苦寻这个问题两天了,真的。这是我尝试过的最隐晦的解决方案,而且这还是第一个行得通的。非常感谢你。 - Will
是的,只需将其添加到“path”环境变量中,然后我们就可以在Windows 10中直接运行它。 - Zhu Xiaohu
1
它将展示如何通过示例实际执行此操作,而不是说诸如“只需添加到…”之类的内容。 - Gabe Hiemstra

14
我只引用这个节点的博客文章...
一般来说,经验法则是:
- 如果你想在程序中使用某些东西,使用require('whatever'),那么请将其安装到项目根目录下的本地环境中。 - 如果你想在shell、命令行或其他地方使用某些东西,请全局安装它,以便其二进制文件出现在PATH环境变量中。
当然,有些情况下你可能需要同时做到两者。Coffee-script和Express都是具有命令行界面和库的应用程序的好例子。在这些情况下,你可以采取以下措施之一:
- 在两个位置都进行安装。真的,你的磁盘空间不够吗?没关系,它们只是很小的JavaScript程序。 - 全局安装,然后npm link coffee-script或npm link express(如果你在支持符号链接的平台上)。然后你只需要更新全局副本就可以同时更新所有符号链接。

10
它们是微型的 JavaScript 程序。其中一些库确实不太微小! - UpTheCreek
1
@UpTheCreek 我相信他所指的是磁盘空间大小。它们是文本文件,客观来说很小。 - Phillip Copley

12

我曾经在全局模块的使用上遇到了很多麻烦。最终,我明确地将 C:\Users\yourusername\AppData\Roaming\npm 添加到系统变量中的 PATH 变量中。同时,我还需要将这个变量的位置放在 nodejs 路径变量之前。

我的操作系统是 Windows 10。


这是唯一对我有效的方法。运行在Windows 8上。 - salgmachine
1
这也是唯一对我有效的方法,谢谢! - devqon
这是我唯一成功的方法,但我必须在路径中使用正斜杠。 - Alex Hall

12

尝试添加/编辑环境变量并得出以下结论:

  1. 编辑/添加上方框中的User variables而不是下部分的System variables;否则,您必须以管理员身份运行才能使其正常工作。
  2. ;%AppData%\npm附加到Path中,以便将其用作命令行工具(如果支持,例如jshintgrunt-cli)。
  3. 创建NODE_PATH并将其设置为%AppData%\npm\node_modules,以便在脚本中使用require('<pkg_name>')而无需将其安装在项目目录中。(但是,如果您正在使用带有mklink的OS(如Vista及更高版本),建议使用npm link来实现此要求。)

测试环境:

  • Win 7(Ent.,64位,SP1),Node.js 4.2.4,npm 2.14.12
  • Win 8.1(Ent.,64位),Node.js 0.10.30,npm 1.4.21

12

简单来说,在您的应用程序目录中使用 npm link jade


4
似乎在Windows系统上无法使用npm link jade,npm会返回以下错误信息:npm ERR! Error: npm link not supported on windows - Cosmore
1
现在已经有了,自版本v0.8.9起。 - Gianfranco P.
@beyonddoor:你需要从管理员命令窗口运行 npm link - Mrchief

6
我在Windows 7上遇到了这个问题,运行了
npm install -g gulp

作为普通用户登录时,需要担任管理员职务。

解决方案: 当以普通用户身份执行相同的安装时(不要在cmd中使用“以管理员身份运行”),一切都很好。我猜这与默认的安装和搜索路径有关。


1
为了更清楚地表达这一点... 当 Node 被安装为管理员时,它会更新系统路径,包括对管理员全局 node 模块文件夹的引用。当新用户全局安装某些内容时,它会安装到另一个 node 模块文件夹中。除了安装 Node 的用户之外,每个用户都需要更新他们的路径,以包括他们的全局 node 模块文件夹。如果您在同一帐户上安装和使用节点,则不需要进行此操作。 - dpsthree
Windows 8.1专业版带有nodejs v6.9.4,设置路径请运行:C:\Program Files\nodejs\nodevars.bat - Robot70

4

对于我来说,在Windows 10上运行以下命令成功:

npm config set prefix %AppData%\npm\node_modules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接