Node.js在Windows上找不到已安装的模块


240

我目前正在Windows上学习nodejs。通过npm.cmd在全局安装了几个模块,nodejs无法找到已安装的模块。以玉为例

npm install jade -g

Jade安装在目录中"C:\Program Files (x86)\nodejs\node_modules",但以下代码将失败并显示"Cannot find module 'jade'"错误,

var jade = require('jade');

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



3
@AmolMKulkarni:不确定在这里有什么意义。在需求中添加“ .js”并不能解决Windows上的问题。
Dan Dascalescu 2014年

1
@DanDascalescu:我认为您误解了答案。该答案中给出的代码是Node.js的代码,该代码显示了它如何查找所需的软件包。因此,如果您了解文件的查找位置和查找方式,则可以更轻松地解决问题。
Amol M Kulkarni 2014年


Answers:


349

添加一个名为的环境变量NODE_PATH,并将其设置为%USERPROFILE%\Application Data\npm\node_modules(Windows XP),%AppData%\npm\node_modules(Windows 7/8/10)或npm最终在您的Windows风味上安装模块的位置。要一劳永逸地完成此操作,请在“系统属性”对话框(运行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_PATH是,仅在Node应用程序中导入模块时使用。如果要在CLI中使用全局安装的模块的二进制文件,则需要将其也添加到您的中PATH,但不要添加任何node_modules部分(例如,%AppData%\npm在Windows 7/8/10中)。


旧故事

我本人对node.js相当陌生,因此我可能并不完全正确,但是根据我的经验,它是这样工作的:

  1. -g并不是安装全局库的方法,它只是将它们放置在系统路径上的一种方法,因此您可以从命令行调用它们,而无需编写它们的完整路径。例如,这很有用,那么节点应用程序将转换本地文件,而不是更少。如果在全球范围内安装它,则可以在任何目录中使用它。
  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 2012年

2
乐意效劳。更改NODE_PATH不会破坏FS等标准node.js模块的路径吗?
阿列克谢·伊凡诺夫

2
甚至我都在想为什么我C:\Program Files\nodejs\node_modules\npm\node_modules没有刚刚安装的模块,而该模块npm install -g expressC:\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目录是{output}\node_modules。运行时,它还会打印出安装目录npm install --global {xyz}
cowlinator

34

如果您使用的是Windows7平台,则应该这样更改NODE_PATH: %AppData%\npm\node_modules


7
它也在Windows 8的appdata \
roam中

6
我使用的是npm 2.5.1的Windows 8.1,并且已经按照文档中的说明设置了NODE_PATH,但是仍然找不到我安装的软件包。有什么想法吗?
JaKXz 2015年

5
在Windows 10中,它应该只是%AppData%\ npm
gkiely,2016年

以我的情况(W10)为%AppData%\ Roaming \ npm
Hinrich,

32

我知道我可以唤醒僵尸,但是我认为这仍然是一个问题,如果您需要对Windows 7上的节点模块进行全局访问,则需要将其添加到全局变量路径中:

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

重要提示:只有这个没有内容node_modules,我花了半个小时才看到这个。


4
或者,对于Windows 8用户%USERPROFILE%\ AppData \ Roaming \ npm
Benson

4
感谢您提出的移除node_modules零件的建议,也为此付出了很多努力!
danguilherme 2016年

20

为了使其在Windows 10上正常工作,我通过将文件夹添加%USERPROFILE%\AppData\Roaming\npm到PATH来解决了该问题。已经\node_modules附加这样的:%USERPROFILE%\AppData\Roaming\npm\node_modules\没有为我工作。


7
或者更简单地说,'%APPDATA%\ npm`
丹DIPLO

伙计,这很奇怪!从字面上看,我已经搜寻了两天。这是我尝试过的最模糊的解决方案,也是第一个可行的解决方案。非常感谢。
威尔

是的,只需添加path环境变量,然后我们就可以直接在Windows 10中运行它了
Zhu

1
它将用一个示例
演示

14

我只引用该节点的博客文章 ...

通常,经验法则是:

  • 如果要安装要在程序中使用的东西,请使用require('whatever'),然后在项目的根目录本地安装。
  • 如果要在外壳程序中安装要使用的东西,在命令行或其他东西上,请全局安装它,以便其二进制文件最终位于PATH环境变量中。

...

当然,在某些情况下您需要同时执行这两种操作。Coffee-script和Express都是具有命令行界面和库的应用程序的很好示例。在这种情况下,您可以执行以下任一操作:

  1. 在两个地方都安装它。说真的,您的磁盘空间不足吗?很好,真的。它们是很小的JavaScript程序。
  2. 全局安装它,然后安装npm link coffee-script或npm link express(如果您在支持符号链接的平台上。)然后,您只需更新全局副本即可更新所有符号链接。

10
They’re tiny JavaScript programs.这些库中有些肯定不是很小的!
UpTheCreek

1
@UpTheCreek我相信他指的是磁盘空间范围内的大小。它们是文本文件。他们客观上很小。
菲利普·科普利

12

为了简短起见,请npm link jade在您的应用目录中使用。


4
似乎npm link jade无法在Windows上运行,npm返回如下错误消息:npm ERR! Error: npm link not supported on windows
Cosmore 2012年

1
现在就可以了,就像v0.8.9版一样-Gianfranco
P.

@beyonddoor:您需要npm link从管理员命令窗口运行。
Mrchief

12

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

  1. 编辑/添加User variables(在上面的框)而不是System variables(在下面的)框;否则,您必须“以管理员身份运行”才能正常工作。
  2. 附加;%AppData%\npmPath以便将其用作命令行工具(如果支持,如jshintgrunt-cli)。
  3. 为了在脚本中创建NODE_PATH和设置它%AppData%\npm\node_modulesrequire('<pkg_name>')而无需将其安装在项目目录中。(但是,如果您正在使用Vista和更新版本的操作系统,npm link建议使用此要求mklink。)

测试环境:

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

9

我花了很多时间来使全局模块起作用。最终,我C:\Users\yourusername\AppData\Roaming\npm在系统变量下显式添加了PATH变量。我还需要让此变量位于列表中的nodejs路径变量之前。

我正在运行Windows 10。


这是唯一对我有用的东西。在Windows 8上运行
查理·卡弗

1
这也是唯一对我有用的东西,谢谢!
devqon

6

我在Windows 7上运行时遇到此问题

npm install -g gulp

以管理员身份同时以普通用户身份登录。

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


1
为了更清楚地说明这一点...当以管理员身份安装Node时,它将更新系统路径,以包括对管理员全局节点模块文件夹的引用。新用户在全局安装某些内容时,会将其安装到其他节点模块文件夹中。除安装Node的用户外,每个用户都需要更新其路径以包括其全局节点模块文件夹。如果您在同一帐户上安装和使用节点,则没有必要。
dpsthree

带有nodejs v6.9.4的Windows 8.1 pro,设置运行路径:C:\ Program Files \ nodejs \ nodevars.bat
Robot70'3

4

从我对Win8.1的经验来看,npm会在上安装模块,C:\Users\[UserName]\AppData\Roaming\npm\node_modules 但会在上 逐行搜索它们 C:\Users\[UserName]\node_modules

通过完整路径在应用程序中提供一个简单的解决方案参考模块:

var jsonminify = require("C:/Users/Saulius/AppData/Roaming/npm/node_modules/jsonminify");

4

对于Windows,每个人都说您应该为nodejs和npm模块设置环境变量,但是您知道为什么吗?对于某些模块,它们具有命令行工具,安装模块后,在C:\ Program Files \ nodejs中有[module] .cmd文件,该文件用于在window命令中启动。因此,如果不将包含cmd文件的路径添加到环境变量%PATH%,则不会通过命令窗口成功启动它们。


2

我有同样的问题,试图安装凉亭 npm install -g bower

我认为这是因为节点是由另一个用户而非我安装的

我卸载了节点,然后重新安装了它。在安装过程中,我看到了添加到PATH> npm modules选项的文本:

节点安装中的消息

在此处输入图片说明

节点安装后,我npm install -g bower再次执行。现在凉亭起作用了。

当然不必像我一样用自己的用户重新安装节点。如其他用户所解释的,解决方案必须通过NODE_PATHPATH变量进行。

这仅是为了说明仅当节点已由其他用户安装(或者在安装过程中未标记添加到路径> npm模块选项)时,才会出现此问题。



1

或者,您可以添加到~/.npmrcright prefix。我有C:\Program Files\nodejs64位Win7。


1

我偶然发现了这个问题,因为我想在装有Windows 10的新计算机上使用带有Visual Studio 2015的node.js。我在Windows 7、8和8.1上使用了node.js,从来没有问题的node.js找到模块。我使用旧版node.js 0.10.39,因为由于串行和RFXCOM模块,我必须使用此版本。

Windows 10的答案是使用C:\ Users \ User \ node_modules在环境变量中设置NODE_PATH。


1
呃没有。(视窗10这里..)我看到一些模块在C:\Users\User\node_modules 我看到一些模块在C:\Users\User\AppData\Roaming\npm\node_modules 我看到的一些模块C:\Users\User\node_modules 也位于C:\Program Files (x86)\nodejs\node_modules\npm\node_modules 不知道这是如何发生。哪个是哪个,为什么他们要这样做呢?
zipzit

1

对于Windows 10,我必须在本地文件夹中安装gulp:

C:\ Users \ myaccount \ AppData \ Roaming \ npm \ node_modules

npm install gulp

这解决了我的“无法识别吞咽”的问题


0

只需下载并重新安装从节点,这将解决所有路径问题。

不要忘记重新启动命令提示符或终端。


0

以上所有答案均不适用于我。只是,最终工作的事情是添加%APPDATA%\ NPM环境Path变量,删除这两个文件纳克在C:\ Program Files文件\的NodeJS。

ng软件包未安装在C:\ Program Files \ nodejs \ node_modules中,因此很明显,无法使用nodejs目录中的ng二进制文件。

我不确定为什么要在此目录中搜索,因为我已经在C:\ Users \ MyUser中配置了-PATH环境变量-.npmrc-试图添加系统变量和/或NODE_PATH


-4

如果您使用的是Windows,则需要执行以下步骤:1)创建一个名为package.json的文件

 {
  "name": "hello"
, "version": "0.0.1"
, "dependencies": {
    "express": "*"
  }
}

其中hello是软件包的名称,*表示依赖项的最新版本

2)代码到您的项目目录并运行以下命令

npm安装

它安装依赖项


4
这不会在全球范围内安装(问题会询问)。这将依赖关系引入了应用程序
bryanmac 2014年

我已经尝试了上面列出的所有内容,试图说服我的node.js安装来识别全局安装的模块,但没有一个起作用。即使在卸载并重新安装了节点(v8.11.3 LTS)之后,每次我尝试在node.js脚本中发出require(“ mongodb”)命令时,也会出现相同的错误:“找不到模块mongodb”。但是,如果我发出命令“ npm ll -g mongodb”,则NPM会告诉我模块已安装。有人可以给我一些确认以解决此问题吗?
戴维·爱德华兹

更新:上面的Saulius提供了一种实际可行的解决方法,即在JavaScript require语句中指定模块的完整路径。但是,如果他关于在不正确的文件夹中搜索已安装模块的node.js的陈述观察是正确的,那么有人可以提醒node.js开发人员这一点吗?因为问题仍然影响v8.11.3 LTS。
David Edwards
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.