如何加载节点模块,就像当前模块位于其他位置一样?

Rya*_*ugh 16 javascript module require node.js

我在某个模块中运行了一些nodejs代码.从这个模块,我想加载一个位于文件系统中完全不同位置的模块 - 例如,给定路径"/another/dir"和模块名称"foo",我希望Node表现得好像运行的模块/another/dir已经调用require("foo"),而不是比我自己的模块.

  My code is running here
/some/folder/node_modules/mine/my_module.js

  I have the path "/another/dir/", the string "foo",
    and want to load this module
/another/dir/node_modules/foo/index.js
Run Code Online (Sandbox Code Playgroud)

换句话说,模块文档引用过程"需要(X)来自路径Y的模块",我想指定我自己的值Y

这可以实现吗?如果是这样,怎么样?如果没有,为什么不呢?

Cas*_*yer 7

最简单的,只是将路径解析为绝对路径,对于大多数情况(即使不是所有情况),这将是推荐的方法.

var path = require('path');

var basedir = '/another/dir';
var filename = 'foo'; // renamed from dirname

var filepath = path.join(basedir, 'node_modules', filename);
var imports = require(filepath);
Run Code Online (Sandbox Code Playgroud)

如果您确实需要将require视为位于不同的目录中,则可以将基目录推送到module.paths

module.paths.unshift('/another/dir/node_modules');

var imports = require('foo');

module.paths.shift();
Run Code Online (Sandbox Code Playgroud)

module.paths也可以通过环境变量进行外部修改NODE_PATH,这是最不推荐的方法,但这确实在所有模块中全局应用.


Mar*_*rcs 7

带有npm链接的符号链接

为了避免问题或修改源代码,我将使用npm链接,在您的示例中:

第一:

cd /another/dir/node_modules/foo  # go into the package directory
npm link                          # creates global link
Run Code Online (Sandbox Code Playgroud)

这将为foo模块创建一个全局链接,在Linux上,您需要root权限才能执行此操作.

然后:

cd /some/folder/ # go into some other package directory.
npm link foo     # link-install the package
Run Code Online (Sandbox Code Playgroud)

/some/folder/package.json应该包含foodep作为dep,不是强制性的,没有它你会得到一个extraneous警告npm ls:

"dependencies": {
    [...]
    "foo": "*"
  }
Run Code Online (Sandbox Code Playgroud)

没有符合本地NODE_PATH的符号链接

你不喜欢符号链接吗?您仍然可以NODE_PATH在本地使用而不是将全局变量设置为@rocketspacer建议,因为正如他所说的那样,不建议全局使用它.

:在任何情况下,我会用一个用户变量没有一个全系统的变量,同事可以登录在同一台机器上的一个不同的用户名,仍然可以得到修改NODE_PATH.

但对于只是这样做本地一个在Linux上调用,你可以简单地调用:

NODE_PATH=$NODE_PATH:/another/dir/node_modules npm start
Run Code Online (Sandbox Code Playgroud)

它将NODE_PATH 用于该调用.

在Windows上进行同一次调用:

@ECHO OFF

SET BASE_NODE_PATH=%NODE_PATH%
SET NODE_PATH=%BASE_NODE_PATH%;C:\another\dir\node_modules\
node index.js
SET NODE_PATH=%BASE_NODE_PATH%
Run Code Online (Sandbox Code Playgroud)

和...

您还可以使用本地dep,如:

"dependencies": {
  "foo": "file:/another/dir/node_modules/foo"
}
Run Code Online (Sandbox Code Playgroud)

但是需要一个npm install,它会复制foo当前包node_modules文件夹中的内容.