Nodejs在Windows上找不到已安装的模块?

Cos*_*ore 230 windows module require node.js npm

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

npm install jade -g
Run Code Online (Sandbox Code Playgroud)

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

var jade = require('jade');
Run Code Online (Sandbox Code Playgroud)

但是,当本地安装jade时,代码将成功运行(在npm中没有-g选项).我不想使用本地安装的模块,这对我来说是浪费磁盘空间,有人可以帮助我使全局安装的模块在Windows上运行吗?

Ale*_*nov 335

添加一个名为的环境变量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
Run Code Online (Sandbox Code Playgroud)

值得一提的NODE_PATH是,仅在导入Node应用程序中的模块时使用.如果要在CLI中使用全局安装的模块二进制文件,则还需要将其添加到您的PATH,但没有node_modules部分(例如%AppData%\npm在Windows 7/8/10中).


老故事

我自己对node.js很陌生,所以我可能不完全正确,但根据我的经验,它的工作原理如下:

  1. -g不是安装全局库的方法,它只是将它们放在系统路径上的一种方法,因此您可以从命令行调用它们而无需写入它们的完整路径.例如,节点应用程序正在转换本地文件,例如更少 - 如果您在全局安装它,则可以在任何目录中使用它.
  2. node.js本身没有查看npm global dir,它正在使用另一种算法来查找所需的文件:http://nodejs.org/api/modules.html#modules_file_modules(基本上它扫描路径中的每个文件夹,开始从当前的node_modules文件夹并检查它).

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

  • 非常感谢,您提供的链接非常有用,我现在更清楚了,尽管模块搜索算法看起来有点复杂.最后,我使用环境变量NODE_PATH来引用全局模块路径,`set NODE_PATH = C:\ Documents and Settings\DevUser\Application Data \npm \node_modules`,它按预期工作.奇怪的是,全局安装的模块位于Windows上的'%USERPROFILE%\ Application Data \npm \node_modules'中,同时,NODE_PATH中不能有引号. (17认同)
  • 如果要查找全局node_modules目录的位置,请运行命令`npm list -g`.第一行输出将是全局node_modules目录的父级 - 换句话说,全局node_modules目录是`{output} \node_modules`.当你运行`npm install --global {xyz}`时,它还打印出安装目录 (9认同)
  • 乐意效劳.没有改变NODE_PATH打破了标准node.js模块的路径,比如FS? (2认同)
  • 即使我想知道为什么我的`C:\ Program Files \nodejs \node_modules \npm \node_modules`没有我刚刚使用`npm install -g express`安装的模块,它在`C:\ Documents and Settings中可用\ swapnil\Application Data \npm \node_modules` (2认同)

小智 34

如果你在windows7平台上,也许你应该像这样更改NODE_PATH: %AppData%\npm\node_modules

  • 它在Windows 8上的**appdata\roaming**中也是如此 (7认同)
  • 我在Windows 8.1上使用npm 2.5.1,并且我已经记录了我的NODE_PATH设置,但它仍然找不到我安装的软件包.思考? (6认同)
  • 在Windows 10中,它应该只是%AppData%\npm (5认同)

Vit*_*iev 29

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

C:\Users\{USER}\AppData\Roaming\npm
Run Code Online (Sandbox Code Playgroud)

重要的是:只有这个没有node_modules部分,我花了半个小时看到这个.

  • 或者,对于Windows 8用户%USERPROFILE%\ AppData\Roaming \npm (4认同)
  • 感谢有关删除`node_modules`部分的建议,也正在努力解决这个问题! (4认同)

And*_*-lo 18

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

  • 或者,更简单地说,`%AppData%\npm \` (7认同)

mar*_*rko 13

我将引用此节点的博客文章 ...

一般来说,经验法则是:

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

...

当然,在某些情况下,您希望同时执行这两项操作.Coffee-script和Express都是具有命令行界面的应用程序以及库的良好示例.在这些情况下,您可以执行以下操作之一:

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

  • "他们是一个很小的JavaScript程序.其中一些库当然不小! (9认同)

Sơn*_*yễn 11

要缩短它,请npm link jade在您的app目录中使用.

  • 似乎`npm link jade`无法在Windows上运行,npm返回如下错误信息:`npm ERR!错误:Windows`上不支持npm链接 (4认同)

Kon*_*Kao 11

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

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

测试环境:

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


Joh*_*alt 9

我有一个糟糕的时间让全球模块工作.最后,我明确地添加C:\Users\yourusername\AppData\Roaming\npm到系统变量下的PATH变量.我还需要将此变量放在列表中的nodejs path变量之前.

我正在运行Windows 10.


Seb*_*ian 6

我在Windows 7上遇到了这个问题,正在运行

npm install -g gulp
Run Code Online (Sandbox Code Playgroud)

以普通用户身份登录时作为管理员.

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