Одной обфускации мало. Можно ли завязаться на какие-то более хитрые вещи, которые помогают отличить запущен твой скрипт браузером "оригинально", прикручено к нему какое-то дополнение, исходник изменён или он в какой-то другой среде?
В принципе, можно провязать всю логику скрипта какими-то непонятными юзеру вычислениями с перестановками ссылок в длинных массивах, чтобы эти вычисления 90% работы делали для пыли в глаза, но побочно инициализировали некие ключевые связи в обфусцированном коде. При несовпадении какой-нибудь фигни весь этот объём вычислений проходит как обычно, но оставляет конструкцию в нерабочем виде.
Ну можно радикально - взять LLVM, написать всё на C++ и поставлять машинный код, исполняющийся в asm.js и там ещё навернуть пирогов в 10 слоёв с дополнительными подгрузками кусков с главного сервера. Но всё это будет слишком жестоко, дорого и тормозно.
2 мегабайт мелко нашинкованного ява-скрипта вы уверены что это недостаточно сложно? Лично я нет. И да в итоге человек будет знать как работает приложение, что это ему даст?
Реакция на UI или пути доступа к api.
Твой код js никому ненужен. Есть более крутые и красивые вещи, уже, и в бесплатном доступе, демонстрирующие превосходное исполнение. Ты спросишь, с чего я это взял? Да с того, что если бы твой код имел хоть какую-то ценнось, значимость и интерес, ты бы сам его продемонстрировал. Мол смотрите как я умею и как круто получается. Ну, а пока что, ты просто хочешь спрятать свой говнокод.
Я раз 10 слазил в подобный код.
Лично я не думаю что можно чисто со стороны клиента защитить код от подмены.
Тут нужна серверная которая будет "задачу" браузеру на которую у всех браузеров будет одит и тот же ответ. Если влезть в код то из-за неочевидности можно поймать но не ограничить на 100% ибо на ошибках учатся.
Если все на js и нужно чтобы его было сложнее проанализировать(не защитить на 99.99%) можно поступить так:
Заходит пользователь. Для него генерим прям в исходнике скрипта особый алгоритм(к примеру к ответу любого теста делать Math.ceil(id*1.12)).
При любом запросе принимаем eval функцию с "задачей".
При запросе отправляем ответ задачи + ту особую часть(именно суммируем или миксируем но ни в коем случае не соединяем строки).
Если достаточно ошибок то отправляем себе отчет, блочим юзера или еще чет.
В eval можно еще ориентироваться не только на текущий юзерспейс а на тот который был сгенерен прошлой задачей. Тут главное понимать какой скрипт в какой вкладке работает ибо будет много не состыковок и подобное вообще ток ради эксперимента можно попробовать, не более.
После компиляции вебпаком код перевернут покруче обфускации на порядок, вам достаточно использовать нестандартные конфиги вебпака и отключить соурс мапы для продакшена