Babel 插件模块别名实际使用的路径是什么?
What Path is the Babel Plugin module-alias Actually Using?
我正在尝试将 Babel 的 "module-alias" 插件与 "proxyquire" 测试库一起使用,但我的运气并不好。
图书馆背景
(如果你对两者都很熟悉,可以跳过module-alias/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);
然后我想用 someDependency
的模拟版本测试 someModule
,我应该能够做到:
const proxiedSomeModule =
proxyquire('~/src/someModule', {
'~/src/someDependency': fakeVersionOfSomeDependency
});
... 但是 proxyquire
告诉我`错误:找不到模块'~/src/someModule'。
据推测 ("behind the scenes") Babel 正在将 '~/src/someModule' 转换为它的真实路径,因此当 Proxyquire 查找别名路径时找不到它。
问题
我的问题是:在 Babel 转换之后(即当 proxyquire 处理它时),有什么方法可以找出'~/src/someModule' 的真实路径吗?或者有什么方法可以让 proxyquire 只使用别名路径?
事实证明,模块解析器生成的 "real" 路径(对于 '~/someModule'
)就是 ../../someModule
路径。不过也发现不用手动转换路径了
模块解析器插件会将参数转换为其 transformFunctions
列表中的任何函数。这意味着您可以通过执行以下操作将任何字符串转换为其非别名形式:
- 定义一个简单的直通函数,例如
const resolveModulePath = path => path;
将该函数(与 proxyquire
一起)添加到 .babelrc
中的 transformFunctions
列表中:
["module-resolver", {
"transformFunctions": ["proxyquire", "resolveModulePath"]
}]
用 resolveModulePath
:
包装所有不是函数参数的路径
proxyquire('~/some/path/someModule', {
[resolveModulePath('~/some/other/path')]: {
一些函数:fakeSomeFunction
}
})
请注意,上面的第一个路径不需要转义,因为它是转换函数的参数。只有第二条路径 ('~/some/other/path'
) 需要包装,因为它是作为参数的对象的一部分;字符串本身不是参数,直到它被包装。
有关更多信息,请参阅:https://github.com/tleunen/babel-plugin-module-resolver/issues/241#issuecomment-350109168
我正在尝试将 Babel 的 "module-alias" 插件与 "proxyquire" 测试库一起使用,但我的运气并不好。
图书馆背景
(如果你对两者都很熟悉,可以跳过module-alias/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);
然后我想用 someDependency
的模拟版本测试 someModule
,我应该能够做到:
const proxiedSomeModule =
proxyquire('~/src/someModule', {
'~/src/someDependency': fakeVersionOfSomeDependency
});
... 但是 proxyquire
告诉我`错误:找不到模块'~/src/someModule'。
据推测 ("behind the scenes") Babel 正在将 '~/src/someModule' 转换为它的真实路径,因此当 Proxyquire 查找别名路径时找不到它。
问题
我的问题是:在 Babel 转换之后(即当 proxyquire 处理它时),有什么方法可以找出'~/src/someModule' 的真实路径吗?或者有什么方法可以让 proxyquire 只使用别名路径?
事实证明,模块解析器生成的 "real" 路径(对于 '~/someModule'
)就是 ../../someModule
路径。不过也发现不用手动转换路径了
模块解析器插件会将参数转换为其 transformFunctions
列表中的任何函数。这意味着您可以通过执行以下操作将任何字符串转换为其非别名形式:
- 定义一个简单的直通函数,例如
const resolveModulePath = path => path;
将该函数(与
proxyquire
一起)添加到.babelrc
中的transformFunctions
列表中:["module-resolver", {
"transformFunctions": ["proxyquire", "resolveModulePath"]
}]用
包装所有不是函数参数的路径resolveModulePath
:proxyquire('~/some/path/someModule', {
[resolveModulePath('~/some/other/path')]: {
一些函数:fakeSomeFunction
}
})
请注意,上面的第一个路径不需要转义,因为它是转换函数的参数。只有第二条路径 ('~/some/other/path'
) 需要包装,因为它是作为参数的对象的一部分;字符串本身不是参数,直到它被包装。
有关更多信息,请参阅:https://github.com/tleunen/babel-plugin-module-resolver/issues/241#issuecomment-350109168