设置Node.js REPL模块路径

20
我不知道如何将路径添加到我的Node.js安装中(在Mac OS X上v.0.4.7)。我已经安装了npm,并且全局安装在/usr/local/lib/node_modules。然而,当我安装npm时,它并没有通知Node全局模块的位置(它应该这样做吗?)。现在当我在命令行模式下使用Node时,我不能简单地require()我的全局安装模块。因此,我想知道是否有一种Node配置文件或环境变量,可以添加我的全局npm模块安装路径?
我知道当我在Node的命令行中时,我可以将其添加到require.paths数组中,但我希望一劳永逸地添加这个全局模块文件夹,这样当我从命令行中require()它们时,Node将始终搜索那个目录中的模块。感谢您提前提供关于使npm和Node共存的任何帮助和指针!

你使用的是哪个版本的npm?如何在命令行中进行require操作?你是使用require("./module");还是require("module"); - Giacomo
我正在使用npm 1.0.5版本。我在Node命令行中使用了require('module')。我使用-g选项安装了这些模块,并将它们安装到全局模块目录,但由于某种原因,Node不知道这个目录的存在... - ampersand
4个回答

18

1
缺点是这会给你旧的“一切都是全局的”行为,这在npm 1.0中是不鼓励的(即使没有在repl中启动node,全局模块也会添加到路径中)。另一种方法是拥有一个专门用于node repl会话的文件夹,并在本地安装所有所需的模块。然后当我想使用repl时,我只需cd到该文件夹即可。 - Giacomo
它如何实现“一切都是全局的”行为? - ampersand
1
自从您将全局模块路径添加到.bashrc中后,所有的node调用都会使用它。我更愿意将全局行为限制在交互式(repl)会话中。 - Giacomo

4
该死,我误解了。对此感到抱歉。
回到主题,您可以将这两行代码放在set-repl-paths.js文件中。
require.paths.unshift('/usr/lib/node_modules');
require("repl").start();

然后执行node set-repl-paths.js,你将会得到一个已经设置好路径的repl。你可以写一个简单的bash脚本或者设置一个shell别名,这样你只需要键入node-repl或类似的东西。
在npm 1.x中,应该使用本地安装,并将全局安装留给提供命令行实用程序的模块。
如果你真的想要全局安装模块foo,那么在你的模块文件夹中输入npm link foo。现在你可以在你的模块中使用require("foo")
最佳实践是使用本地安装。
请参考nodejs博客上的npm 1.0: 全局安装和本地安装

我已经阅读了npm文档,并且知道全局安装和本地安装的区别。但这并没有告诉我如何设置node.js路径。 - ampersand
+1。谢谢,rjack,这是一个不错的解决方法。但是你不知道Node存储用于搜索模块的路径吗? - ampersand

2

安装一个全局包(通常由命令行使用)

npm install --global PACKAGE_NAME

在我的情况下,我想要将jslint作为一个命令行工具安装。所以我运行了以下命令:

npm install --global jslint

这会将包安装到

/usr/local/lib/node_modules/

那么为什么要这样做?如果一个包只用于特定项目中,您不应该将其全局安装。

欲了解更多信息,请查阅帮助页面。

npm help install

npm help global

我还在npmFAQ中找到了相关内容。


1
作为回应: https://dev59.com/Dm025IYBdhLWcg3wpHh-#5923898 你可以将以下内容添加到你的.bashrc文件中,这样只有在运行repl时才会设置NODE_PATH,因为要求全局模块是一种反模式。
node() {
  if (( $# == 0 )); then
    NODE_PATH=$(npm root -g) command node
  else
    command node "$@"
  fi
}

当没有参数传递给node时,它会设置NODE_PATH。因此,它不能与像node -i这样的东西一起使用。您需要添加更多的参数检查来覆盖所有运行repl的情况。
这将使repl始终设置NODE_PATH。如果您想选择是运行具有全局模块的repl还是脚本,可以将其添加到您的.bashrc中。
node_global() {
  NODE_PATH=$(npm root -g) node "$@"
}

然后只需运行node_global。我选择了第二个选项。


那么你是在回答哪个问题,这个还是你链接的那个? - Joe C
我所链接的问题与此问题相同。我没有足够的声望在那个答案下进行评论。我指的是Giacomo提到的在不在repl中时可以要求全局模块的问题。 https://dev59.com/Dm025IYBdhLWcg3wpHh-#E3vinYgBc1ULPQZFN-Sy我的回答与Giacomo的回答类似,但它不需要额外的文件。这有点像两个答案的合并。 - dosentmatter
那么你应该做的是在这里提供与此特定问题相关的答案部分,然后在那里提供与其他问题相关的答案部分。即使已经有一个答案被接受了,也并不意味着你不能再添加一个答案。(此外,其他问题的提问者并没有收到关于这个新答案的通知,因此当它在这里时对他们的帮助很小。) - Joe C

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