映射节点模块的路径,用于单元测试



客户端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

最新更新