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
这可以实现吗?如果是这样,怎么样?如果没有,为什么不呢?
最简单的,只是将路径解析为绝对路径,对于大多数情况(即使不是所有情况),这将是推荐的方法.
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,这是最不推荐的方法,但这确实在所有模块中全局应用.
为了避免问题或修改源代码,我将使用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在本地使用而不是将全局变量设置为@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文件夹中的内容.
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |