什么路径是Babel Plugin模块 - 别名实际使用?

时间:2017-12-06 00:38:18

标签: babel proxyquire

我正在尝试使用Babel的“模块别名”插件和“proxyquire”测试库,但我没有太多运气。

图书馆背景

(如果您熟悉模块别名/代理请求,请随时跳过)

Proxyquire让你模拟出模块的依赖性以进行测试,如下所示:

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

Babel的模块别名插件让您可以使导入路径更加方便和一致。例如,我可以指定(在.babelrc中):

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

然后不必键入(从嵌套三个目录深度的模块导入时)require('../../../someModule') I can just type require('〜/ 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转换它之后,有什么方法可以找出'〜/ src / someModule'的真实路径(即,当proxyquire处理它时)?或者有没有办法让proxyquire只使用别名路径?

1 个答案:

答案 0 :(得分:0)

事实证明,模块解析器生成的“真实”路径('~/someModule')只是../../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
    }
    })

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

    有关详细信息,请参阅:https://github.com/tleunen/babel-plugin-module-resolver/issues/241#issuecomment-350109168