Chupurnov Valeriy
Chupurnov Valeriy
Front End Engineer

Ошибка в create react app Cannot assign to read only property 'exports' of object

Или assert в JS

Я пытаюсь переиспользовать код между TypeScript React приложением и NodeJS. Соотвественно есть файлы .js в которых экспортируются функции, старым дедовским способом:

function add(a, b) {
    return a + b;
}

module.exports = {add};

А в typescript просто импортируется так:

const {add} = require('./common/add.js');

До поры, до времени, это работало.

Проект не рабочий, и не основной и в нем мне не хотелось писать автотесты, а вот функции тестить хотелось.

На помощь мне пришел assert модуль. Он позволяет писать код сразу с проверкой тест кейсов.

Как-то так:

function add(a, b) {
    return a + b;
}

if (process.env.NODE_ENV !== 'production') {
    const assert = require('assert');
    assert.equal(add(2, 3), 5);
    assert.equal(add(12, 23), 35);
}

module.exports = {add};

Круто же?! Код сам себя проверяет, а из прод сборки потом выпиливается. Так что же пошло не так?

Однажды мне захотелось зарефакторить этот код

if (process.env.NODE_ENV !== 'production') {
    assert.equal(add(2, 3), 5);
    // ... тут куча однотипных проверок
    assert.equal(add(12, 23), 35);
}

В такой:

if (process.env.NODE_ENV !== 'production') {
        [
        [[2, 3], 5],
        ...
        [[12, 23], 35],
    ].forEach(([params, result]) => {
        assert.equal(add.apply(null, params), result);
    });
}

Ничего особенного, просто декларацию нескольких assert заменил на императивный код.

И все сломалось!)

Сервер работал, сборка собиралась, create react app работал в dev режиме. А вот в рантайме в прод сборке, в браузере появлялась ошибка Cannot assign to read only property 'exports' of object.

Мораль: это сейчас очевидно, что в экспортируемом файле, не следует выполнять императивный код. А я с этим просидел пару часов.

Вернул все как было, и все заработало.