1

我正在尝试将 Babel 的“module-alias”插件与“proxyquire”测试库一起使用,但我运气不佳。

图书馆背景故事

(如果您熟悉模块别名/代理查询,请随意跳过)

Proxyquire 让您模拟一个模块的依赖项以进行测试,如下所示:

const someFunctionToTest = 
  proxyquire(pathToSomeFunctionToTestsModule, {
    pathToDependency: fakeVersionOfDependency
  });

Babel 的 module-alias 插件让你的导入路径更加方便和一致。例如,我可以指定(在 .babelrc 中):

"plugins": [
  ["module-alias", [
    { "src": "./", "expose": "~" }
  ]],

然后不必键入(从嵌套三个目录深度的模块导入时)require('../../../someModule') I can just typerequire('~/someModule')`。

问题

我的问题是,它们不能一起工作。如果我有someModule这取决于someDependency

// src/someModule.js
const someDependency = require('~/src/someDependency');
doSomethingWith(someDependency);

然后我想someModule用模拟版本进行测试someDependency,我应该能够做到:

const proxiedSomeModule = 
  proxyquire('~/src/someModule', {
    '~/src/someDependency': fakeVersionOfSomeDependency
  });

...但proxyquire告诉我'错误:找不到模块'~/src/someModule'。

大概(“幕后”)Babel 正在将 '~/src/someModule' 转换为其真实路径,因此当 Proxyquire 查找别名路径时它找不到它。

问题

我的问题是:在 Babel 转换它之后(即当 proxyquire 处理它时),有什么方法可以找出 '~/src/someModule' 的真实路径是什么?或者,有什么方法可以让 proxyquire 只使用别名路径?

4

1 回答 1

1

事实证明'~/someModule',模块解析器生成的“真实”路径(for)就是../../someModule路径。然而,事实证明,没有必要手动转换路径。

模块解析器插件会将参数转换为其transformFunctions列表中的任何函数。这意味着您可以通过执行以下操作将任何字符串转换为其非别名形式:

  1. 定义一个简单的直通函数,例如const resolveModulePath = path => path;
  2. 将该函数(连同proxyquire)添加到transformFunctions列表中.babelrc

    ["module-resolver", {
      "transformFunctions": ["proxyquire", "resolveModulePath"]
    }]

  3. 使用以下包装任何不是函数参数的路径resolveModulePath

    proxyquire('~/some/path/someModule', {
      [resolveModulePath('~/some/other/path')]: {
        someFunction: fakeSomeFunction
      }
    })

请注意,上面的第一个路径不需要转义,因为它是转换函数的参数。只有第二条路径 ( '~/some/other/path') 需要被包装,因为它是作为参数的对象的一部分;字符串本身不是参数,直到它被包装。

欲了解更多信息,请参阅:https ://github.com/tleunen/babel-plugin-module-resolver/issues/241#issuecomment-350109168

于 2017-12-12T23:11:50.050 回答