为节点模块映射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