Какой путь на самом деле использует псевдоним модуля Babel Plugin?

Я пытаюсь использовать подключаемый модуль Babel «module-alias» с библиотекой тестирования «proxyquire», но мне не очень повезло.

История библиотеки

(можно пропустить, если вы знакомы с псевдонимом модуля/proxyquire)

Proxyquire позволяет смоделировать зависимости модуля для тестирования, например:

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

Плагин Babel для псевдонимов модулей позволяет сделать ваши пути импорта более удобными и согласованными. Например, я могу указать (в .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 ищет путь с псевдонимом, он не может его найти.

Вопрос

Мой вопрос: есть ли способ узнать, каков реальный путь '~/src/someModule' после его преобразования Babel (т.е. когда с ним работает proxyquire)? Или, в качестве альтернативы, есть ли способ заставить proxyquire работать только с псевдонимами путей?


person machineghost    schedule 06.12.2017    source источник


Ответы (1)


Оказывается, «настоящий» путь (для '~/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
    }
    } )

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

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

person machineghost    schedule 12.12.2017