«Превышен максимальный размер стека вызовов» при запуске циклического импорта ES6 в шутку

#ecmascript-6 #jestjs

#ecmascript-6 #jestjs

Вопрос:

При написании некоторых наборов тестов для некоторых модулей ES6 я обнаружил, что Jest v26.6 сталкивается с ошибками при попытке выполнить некоторый циклический импорт.

Проблема может быть сведена к следующему:

ClassA.mjs

 import {B} from './ClassB.mjs';

class A {
    constructor()
    {
        //...
    }
}
 

ClassB.mjs

 import {A} from './ClassA.mjs';

class B extends A {
    constructor()
    {
        super();

        // ...
    }
}
 

Cyclic.test.js

 import {B} from "./ClassB.mjs";

describe('Cyclic', () => {
    test('Cyclic', () => {
        // ...
    });
});
 

Jest завершается с сообщением об ошибке «Превышен максимальный размер стека вызовов» в разных местах его источника, в зависимости от импорта теста.

Существуют ли какие-либо решения для этого, какие-либо известные обходные пути?

Заранее спасибо.

Комментарии:

1. По умолчанию Jest использует CommonJS, который не был разработан для циклических dep. Поддержка Jest для встроенного ESM является неполной и бесполезной ATM. Поэтому избегайте CD.

2. A не должен импортировать B, что устранит циклическую проблему. B будет расширять A, поэтому A действительно не должен иметь ссылки на B.