为节点模块映射path,用于unit testing

客户端我用SystemJS将模块path存到模块中,像这样

var systemJsConfig = { baseURL: "./", defaultJSExtensions: true, map: { 'root-components': 'applicationRoot/rootComponents' } }; 

所以require('root-components/foo'); 将映射到applicationRoot/rootComponents/foo

问题是,如果我用require('root-components/foo');运行一个模块require('root-components/foo'); 在摩卡,节点不知道这个path是什么意思。 是否有一个理想的方式来完成在Node中的path映射?

Proxyquire能胜任这个吗? 我阅读他们的文档,但没有发现任何迹象表明它是。

这只是unit testing,所以我很高兴任何解决scheme使用任何forms的党的实用程序。

如果您唯一的要求是如此简单,您可以制作覆盖require的效用函数。

新的require将映射应用于path参数,在新path中查找模块,还可以select退回映射path中不存在的模块。 代码应该看起来像这样

 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); } }; 

你可以按照这个要点描述许多不同的方法,但是更简单的方法就是用NODE_PATH设置起始根path,然后从那里开始:

以下是NODE_PATH环境variables的外观:

NODE_PATH=./src node src/server/index.js

然后在所有文件中,不pipe它们在层次结构中的./src ,都将从./src目录中parsing出来。 这消除了像你所描述的别名的需要,但我认识到,在你的情况下,可能需要移动/重命名许多文件。

例如: require('root-components/foo'); => ./src/root-components/foo.js

选项1 – 修改NODE_PATH (不推荐):

修改NODE_PATH以在启动node.js之前在shell中包含模块path。

 exports NODE_PATH=./path/to/module:$NODE_PATH 

这不是一个好的select,因为它需要预启动步骤,而且由于NODE_PATH包含很多path,所以模块加载的位置并不总是很清楚,并且存在名称冲突的可能性。

选项2 – 将模块移入外部回购

假设您将组件移动到您的GitHubconfiguration文件中可用的单独的“rootcomponents”回购。

然后你可以直接通过以下方式安装

 npm install --save github:arackaf/rootcomponents 

那么你应该能够将项目源映射到一个System.js别名。

 var systemJsConfig = { baseURL: "./", defaultJSExtensions: true, map: { 'root-components': 'github:arackaf/rootcomponents' } }; 

从那里它应该像你期望的那样工作:

 require('root-components/foo'); 

选项3 – 通过相对path加载模块:

config.map选项仅用于将外部依赖关系映射到别名。

一个简单的select是提供一个相对path。 亲属path基于baseURL。

例如,如果您尝试加载:

 src/rootComponents/foo.js 

要求是:

 require('./src/rootComponents/foo') 

注意:这一切都假定require()语句在System.js模式/规则之后。

另一种可能的select是提供一个System.paths[]选项,它为本地path创build一个别名。 我无法validation如何/是否会工作(即我从来没有尝试过),但具体可以在这里find