Какой путь на самом деле использует псевдоним модуля Babel Plugin?
Я пытаюсь использовать плагин 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
требуется ('~/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 ищет псевдоним, он не может его найти.
Вопрос
Мой вопрос: есть ли какой-нибудь способ узнать, каков реальный путь к ~ / src / someModule, после того, как Babel преобразует его (т. Е. Когда с ним справляется proxyquire)? Или, в качестве альтернативы, есть ли способ заставить proxyquire просто работать с псевдонимами?
1 ответ
Получается "реальный" путь (для '~/someModule'
) генерируется модулем распознавания только ../../someModule
дорожка. Однако также оказывается, что нет необходимости преобразовывать пути вручную.
Модуль распознавателя модуля преобразует аргументы в любые функции transformFunctions
список. Это означает, что вы можете преобразовать любую строку в ее не псевдоним, выполнив следующие действия:
- Определите простую сквозную функцию, например,
const resolveModulePath = path => path;
Добавьте эту функцию (вместе с
proxyquire
) кtransformFunctions
список в.babelrc
:["модуль-преобразователь", {
"transformFunctions": ["proxyquire", "resolModulePath"]
}]Оберните любые пути, которые не являются аргументами для функции с
resolveModulePath
:proxyquire ('~ / some / path / someModule', {
[resolModulePath ('~ / some / other / path')]: {
someFunction: fakeSomeFunction
}
})
Обратите внимание, что первый путь в вышеприведенном не должен быть экранирован, поскольку является аргументом для преобразованной функции. Только второй путь ('~/some/other/path'
) необходимо обернуть, потому что это часть объекта, являющаяся аргументом; Сама строка не является аргументом, пока она не обернута.
Для получения дополнительной информации см.: https://github.com/tleunen/babel-plugin-module-resolver/issues/241