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

Han*_*pan 132 node.js npm

我正在尝试在Mac OSX Lion上设置Node.这一切似乎都运行正常,但我似乎无法从我的全局模块文件夹导入任何模块.我收到错误,

Error: Cannot find module <module>
Run Code Online (Sandbox Code Playgroud)

如果我运行这个: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' ]
Run Code Online (Sandbox Code Playgroud)

哪个是正确的,我的模块确实安装在/ 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)
Run Code Online (Sandbox Code Playgroud)

我的.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/"
Run Code Online (Sandbox Code Playgroud)

真的很感激一些帮助,我不知道为什么我不能导入任何库.

Tad*_*cik 105

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

然而,这并非没有问题.

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

作为替代方案,您可以在本地以及全局安装软件包.

有关其他信息,请参阅

  • 我正在读这个,不敢相信自己的眼睛.所以,如果我安装,说快递,然后在Express之上建立20个项目,我需要在每个项目文件夹中为每个项目安装20次,一遍又一遍?我对包管理员没有多少经验,但这有点糟糕...... (62认同)
  • 我也很难理解这个逻辑,但是看着我的Ruby朋友们在全球软件包更新方面苦苦挣扎,争论gemsets并且通常根本就没有升级,我已经承认在本地安装依赖项是绝对唯一理智的方式.做包管理*. (40认同)
  • 这是正确的,如果你考虑一下,这是有道理的.在本地管理依赖关系可以使所有内容保持独立,并允许您为任何给定项目指定特定版本的依赖项(例如,项目foo需要表达2.x,而项目栏可以使用express 3 beta). (22认同)
  • 我想在这种情况与静态链接与动态链接库之间进行平行,因为它与软件的分发有关.考虑到几乎所有在iOS App Store上分发的应用程序都必须静态链接iOS SDK未提供的依赖关系.为什么这样做?全球依赖地狱是一件非常真实的事情. (3认同)
  • 您还可以在`npm help folders`中阅读所有这些内容 (2认同)

Joe*_*l B 67

Node.js使用环境变量NODE_PATH来指定要包含在模块搜索路径中的其他目录.您可以使用npm它自己告诉您使用该npm root -g命令存储全局模块的位置.将这两者组合在一起,您可以使用以下命令确保全局模块包含在搜索路径中(在Linux-ish上)

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

  • 这应该是最重要的评论 (5认同)
  • 唯一有用的答案。 (4认同)
  • 感谢`NODE_PATH`环境变量提示.这帮了很多忙! (3认同)

Nic*_*ros 61

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

例:

$ npm install -g express
$ cd [local path]/project
$ npm link express
Run Code Online (Sandbox Code Playgroud)

它所做的就是创建一个本地node_modules文件夹,然后创建一个符号链接express - > [global directory] ​​/ node_modules/express,然后可以通过 require('express')


小智 21

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

$ npm install -g replace  // replace is one of the node module.
Run Code Online (Sandbox Code Playgroud)

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

因为使用require,您只能使用节点模块文件夹中存在的本地模块.

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

$ npm link replace
Run Code Online (Sandbox Code Playgroud)

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

如果需要进一步澄清,请告诉我.


lin*_*ing 13

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

require('/path/to/global/node_modules/the_module');
Run Code Online (Sandbox Code Playgroud)

在我的Mac上,我用这个:

require('/usr/local/lib/node_modules/the_module');
Run Code Online (Sandbox Code Playgroud)

如何找到全局模块的位置?- > npm安装包在哪里?


Ben*_* Xu 9

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

在 Windows 7 或更高版本中,路径类似于%AppData%\npm\node_modulesUNIX 中的路径,/home/sg/.npm_global/lib/node_modules/但它取决于用户配置。

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

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

export NODE_PATH=`npm config get prefix`/lib/node_modules/
Run Code Online (Sandbox Code Playgroud)