如何在Node中导入全局模块?我收到“错误:找不到模块<module>”?


145

我正在尝试在Mac OSX Lion上设置Node。一切似乎都正常,但是我似乎无法从全局模块文件夹中导入任何模块。我得到了错误

Error: Cannot find module <module>

如果我运行this node -e require.paths:,得到的响应是:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

没错,我的模块确实安装在/ usr / local / lib / node_modules中。但是,当我尝试运行脚本时,却得到以下信息:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

我的.bash_profile看起来像这样:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

非常感谢您的帮助,我不知道为什么不能导入任何库。


1
您知道这不是做事的首选方式,对吗?
thejh 2011年

1
你能详细说明吗?您是说我不应该将库安装到我的全局文件夹中吗?
汉班2011年

3
@Hanpan:首选方式是通过require()在本地安装要使用的模块。
thejh 2011年

1
npm link可以在这里找到一个更好,更更新的答案(不依赖):stackoverflow.com/a/15646750/2671392
GGG 2016年

1
我是老学校,曾经在全球各地安装图书馆。我从未见过任何令人信服的理由来大量使用本地库安装。我完成的mongodb类到完成时将在大约一百个小项目中结束,每个项目都包含一组几乎重复的库-mongodb,express,consolidate等。向交互式语言的转移会留下很多积淀。各地的本地图书馆。我必须在本地Scala存储库中拥有数千个Scala库。同上流星,时髦和红宝石。
Stephen W. Wright

Answers:


116

如果您使用的npm> = 1.0,则可以npm link <global-package>用来创建指向已全局安装的软件包的本地链接。(警告:操作系统必须支持符号链接。

但是,这并非没有问题。

npm link是一个开发工具。这是真棒对当地的发展框管理包。但是使用npm链接进行部署本质上是在问问题,因为它使得在没有意识到的情况下更新事物变得非常容易。

或者,您可以在本地或全局安装软件包。

有关更多信息,请参见


69
我正在阅读此书,无法相信我的眼睛。因此,如果我说安装Express,然后在Express的基础上构建20个项目,我需要一遍又一遍地在每个项目文件夹中安装20次,每次安装一次?我在包裹管理人员方面没有太多经验,但是有点烂……
treznik 2012年

25
没错,如果您考虑一下,那是有道理的。在本地管理依赖项可以使所有内容保持独立,并允许您为任何给定项目指定依赖项的特定版本(例如,项目foo需要express 2.x,而项目栏可以使用express 3 beta)。
grahamb 2012年

43
我也很难理解这种逻辑,但是在观看我的Ruby朋友苦于全局软件包更新,争论gemsets并常常根本就不升级之后,我承认本地安装依赖项绝对是唯一明智的方法。包装管理
timoxley

3
我想在这种情况与静态链接库与动态链接库的情况之间建立一个相似之处,因为它与软件的发行有关。请考虑,几乎所有在iOS App Store上分发的App都必须静态链接iOS SDK未提供的依赖项。为什么要这样做?全局依赖地狱是非常现实的事情。
史蒂文·卢

1
据我了解,npm的缓存(位于中~/.npm)将使在您不同位置执行的重新安装过程更为方便。
史蒂文·卢

85

Node.js使用环境变量NODE_PATH来允许指定其他目录以包含在模块搜索路径中。您可以使用npm自身来告诉您全局npm root -g命令在哪里存储。因此,使用以下命令将这两个模块放在一起,可以确保全局模块包含在搜索路径中(在Linux平台上)

export NODE_PATH=$(npm root --quiet -g)


3
感谢您提供NODE_PATH环境变量提示。这很有帮助!
rekire

7
这应该是最高的评论
Adam Prax

我必须设置NODE_PATH为等效的posix路径才能使npm在MSYS2上工作。谢谢。
Joyce Babu

也适用于Windows和Git bash。完善。:-)
inf3rno

这样可以.node_modules搜索您的文件夹,但是为了使用导入模块require(),它们仍应安装在本地项目目录中(或使用链接npm link)。全局模块不能导入项目中,只能从那里运行二进制文件/脚本。
Prahlad Yeri

65

您可以使用npm链接在项目文件夹中创建指向全局包的符号链接。

例:

$ npm install -g express
$ cd [local path]/project
$ npm link express

它所做的只是创建一个本地node_modules文件夹,然后创建一个符号链接express-> [global directory] ​​/ node_modules / express,然后可以通过以下方式对其进行解析: require('express')


该跨操作系统兼容吗?
UpTheCreek

从此版本开始,较新版本的Windows就支持它:github.com/npm/npm/commit/… 对于较旧的Windows版本,请尝试npmjs.com/package/npm-junction
Alex

22

全局安装任何软件包,如下所示:

$ npm install -g replace  // replace is one of the node module.

由于此替换模块是全局安装的,因此,如果您看到节点模块文件夹,则看不到替换模块,因此无法使用require('replace')使用此软件包。

因为有要求,您只能使用节点模块文件夹中存在的本地模块。

现在要使用全局模块,您应该使用以下命令将其与节点模块路径链接。

$ npm link replace

现在返回并查看您的节点模块文件夹,您现在可以在其中看到替换模块,并且可以将其与应用程序中的require('replace')一起使用,因为它与本地节点模块链接了。

请让我知道是否需要进一步澄清。


14

您可以将require与全局模块目录的路径一起用作参数。

require('/path/to/global/node_modules/the_module');

在我的Mac上,我使用以下命令:

require('/usr/local/lib/node_modules/the_module');

如何找到您的全局模块在哪里?-> npm在哪里安装软件包?


7

将环境变量NODE_PATH设置为指向您的全局node_modules文件夹。

在Windows 7或更高版本中,路径类似,%AppData%\npm\node_modules而在UNIX中则可能类似,/home/sg/.npm_global/lib/node_modules/但这取决于用户配置。

该命令npm config get prefix可以帮助找出正确的路径。

在UNIX系统中,您可以使用以下命令来完成它:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

我正在使用Docker。我正在尝试创建一个安装了我所有节点依赖项的docker映像,但是可以在容器运行时使用我的本地应用程序目录(而不用node_modules目录或链接对其进行污染)。在这种情况下,这会导致问题。我的解决方法是从模块的确切路径进行请求,例如require('/ usr / local / lib / node_modules / socket.io')


-1

require.paths 不推荐使用。

转到您的项目文件夹并输入

npm install socket.io

应该将其安装在本地./node_modules文件夹中,节点将在其中查找它。

我保持这样的事情:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

创建一个app.js文件

// app.js
var socket = require('socket.io')

现在运行我的应用

node app.js

确保您正在使用npm >= 1.0node >= 4.0


8
他在询问使用全局安装的npm软件包。
UpTheCreek

@贾蒙德 您正在显示如何使用本地安装的软件包,但是最初的问题是关于全局软件包的。
Vitaliy Markitanov
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.