Ошибка в create react app Cannot assign to read only property 'exports' of object
Я пытаюсь переиспользовать код между 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
.
Мораль: это сейчас очевидно, что в экспортируемом файле, не следует выполнять императивный код. А я с этим просидел пару часов.
Вернул все как было, и все заработало.