Какой путь на самом деле использует псевдоним модуля 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 список. Это означает, что вы можете преобразовать любую строку в ее не псевдоним, выполнив следующие действия:

  1. Определите простую сквозную функцию, например, const resolveModulePath = path => path;
  2. Добавьте эту функцию (вместе с proxyquire) к transformFunctions список в .babelrc:

    ["модуль-преобразователь", {
    "transformFunctions": ["proxyquire", "resolModulePath"]
    }]

  3. Оберните любые пути, которые не являются аргументами для функции с resolveModulePath:

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

Обратите внимание, что первый путь в вышеприведенном не должен быть экранирован, поскольку является аргументом для преобразованной функции. Только второй путь ('~/some/other/path') необходимо обернуть, потому что это часть объекта, являющаяся аргументом; Сама строка не является аргументом, пока она не обернута.

Для получения дополнительной информации см.: https://github.com/tleunen/babel-plugin-module-resolver/issues/241

Другие вопросы по тегам