客户端I使用SystemJS截取到模块的路径,比如这个
var systemJsConfig = {
baseURL: "./",
defaultJSExtensions: true,
map: {
'root-components': 'applicationRoot/rootComponents'
}
};
因此CCD_ 1将映射到CCD_。
问题是,如果我在Mocha中运行一个带有require('root-components/foo');
的模块,Node不知道该路径意味着什么。有没有一种合理的方法可以在Node中完成这种路径映射?
Proxyquire能够做到这一点吗?我通读了他们的文件,但没有发现任何迹象表明这是真的。
这只是用于单元测试,所以我对任何使用他们的任何一方实用程序的解决方案都很满意。
如果您唯一的需求如此简单,您可以创建一个覆盖require
的实用程序函数。
new require将映射应用于路径参数,在新路径中查找模块,并且您可以选择回退映射路径中不存在的模块。代码应该看起来像这个
const oldRequire = require;
require = (path) => {
try {
const mapped = oldRequire(path.replace('root-components/foo', 'applicationRoot/rootComponents/foo'));
if (!mapped) {
throw new Error('module not found in mapped directory');
}
console.log('module resolved with mapping', path);
return mapped;
} catch (e) {
console.log('using old require without mapped path', path);
return oldRequire(path);
}
};
选项1-修改NODE_PATH
(不推荐):
在启动node.js.之前,修改NODE_PATH
以在shell中包含模块路径
exports NODE_PATH=./path/to/module:$NODE_PATH
这不是一个好的选择,因为它需要一个预启动步骤,而且由于NODE_PATH
包含许多路径,所以并不总是清楚模块从哪里加载,并且存在名称冲突的可能性。
选项2-将模块移至外部回购
假设您将组件移动到GitHub配置文件中的一个单独的"rootcomponents"repo中。
然后你可以通过直接安装
npm install --save github:arackaf/rootcomponents
然后,您应该能够将项目源映射到System.js别名。
var systemJsConfig = {
baseURL: "./",
defaultJSExtensions: true,
map: {
'root-components': 'github:arackaf/rootcomponents'
}
};
从那里开始,它应该像你预期的那样工作:
require('root-components/foo');
选项3-通过相对路径加载模块:
config.map
选项仅用于将外部依赖项映射到别名。
一个简单的替代方案是提供相对路径。亲属路径基于基本URL。
例如,如果你试图加载:
src/rootComponents/foo.js
要求是:
require('./src/rootComponents/foo')
注意:这一切都假设require()
语句遵循System.js模式/规则
另一个可能的选项是提供require('root-components/foo');
0选项,该选项创建本地路径的别名。我无法验证这将如何/是否有效(即我从未尝试过),但具体细节可以在这里找到
如本要点所述,您可以用许多不同的方法进行模块别名,但更简单的方法只是用NODE_PATH
设置起始根路径,然后从那里开始:
以下是NODE_PATH
环境变量的情况:
NODE_PATH=./src node src/server/index.js
然后,在所有文件中,无论它们在层次结构中的哪个位置,都将从./src
目录解析。这样就不需要像您描述的那样使用别名,但我意识到,在您的情况下,可能需要移动/重命名许多文件。
示例:require('root-components/foo');
=>./src/root-components/foo.js