6

客户端我使用 SystemJS 将模块路径存根,如下所示

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

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

问题是,如果我在 Mocha 中运行一个模块require('root-components/foo');,Node 不知道该路径的含义。有没有一种理智的方法可以在 Node 中完成这个路径映射?

Proxyquire 能做到这一点吗?我通读了他们的文档,但没有发现任何迹象表明它是。

这仅用于单元测试,因此我对使用任何类型的派对实用程序的任何解决方案都很满意。

4

3 回答 3

5

如果您唯一的要求如此简单,您可以创建一个实用函数来覆盖require.

新的 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);
    }
};
于 2016-06-14T09:40:24.650 回答
2

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

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

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

这不是一个很好的选择,因为它需要一个预启动步骤,并且 - 由于NODE_PATH包含许多路径 - 并不总是清楚模块从哪里加载,并且存在名称冲突的可能性。

选项 2 - 将模块移动到外部仓库

假设您将组件移动到您的 GitHub 配置文件上可用的单独的“根组件”存储库中。

然后您可以通过以下方式直接安装它:

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选项仅用于将外部依赖项映射到别名。

一种简单的替代方法是提供相对路径。亲属路径基于 baseURL。

例如,如果您尝试加载:

src/rootComponents/foo.js

要求是:

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

注意:这一切都假设require()语句遵循 System.js 模式/规则。

另一种可能的选择是提供一个System.paths[]为本地路径创建别名的选项。我无法验证这将如何/是否有效(即我从未尝试过),但可以在此处找到详细信息

于 2016-06-10T17:07:21.590 回答
1

您可以按照此 gist 中所述的多种不同方式进行模块别名,但更简单的方法是使用 设置起始根路径NODE_PATH,然后从那里开始:

NODE_PATH这是环境变量的样子:

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

然后在您的所有文件中,无论它们在层次结构中的哪个位置,都将从./src目录中解析。这消除了对您所描述的别名的需求,但我意识到在您的情况下,可能需要移动/重命名许多文件。

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

于 2016-06-10T15:10:11.207 回答