Да, браузеры смогут оптимизировать анимацию средствами CSS и решать, с какой частотой её воспроизводить, в целях экономии ресурсов и батареи.
При декларативном подходе (CSS) мы говорим браузеру, что именно сделать, а он уже сам решит, как именно сделать это оптимально для себя и для устройства, на котором он работает. При императивном подходе (JS) мы контролируем каждый шаг и не даём свободы, браузер вынужден делать то, что автор скрипта скажет, даже если ту же самую задачу он может решить лучше и оптимальнее него.
Разметку сохранять не надо, только данные. Разметка должна генерироваться из этих данных. А можно вообще хранить в корзине только id'шники, а с сервера запрашивать по ним информацию.
Возвращаемое значение
Массив, содержащий удалённые элементы. Если будет удалён только один элемент, вернётся массив из одного элемента. Если никакие элементы не будут удалены, вернётся пустой массив.
Не сохранять сами элементы, а только признак выбранного (например, его id или value), а при загрузке страницы - нужному элементу устанавливать атрибут checked.
Скорее всего, изначально URL файла выглядел наподобие https://домен/папка/файл.js?crc=6, где ?crc=6 использовалось для обозначения версии этого файла на случай, если в кэше браузера могла находиться какая-либо из предыдущих его редакций, предположительно их было пять (при каждом изменении файла - в URL также менялся этот номер, чтобы браузер считал файл другим и не брал из кэша старый). Но потом этот файл был сохранён на диск на стороне клиента, а в файловой системе вопросительный знак недопустим, потому этот символ был заменён на символ @. Так и получилось такое странное расширение файла. Почем именно crc - скорее всего, просто неудачно выбранное название параметра, который в принципе может называться как угодно или вообще не иметь названия, лишь бы символы после ? различались от версии к версии, если выбран именно такой способ обхода кэша.
Потому что в javascript фигурные скобки можно использовать не только для объявления объекта, но и для объединения инструкций в блок. Парсер в этом случае не понимает, что {a, b, c} это именно деструктуризация объекта, а не блок из трёх инструкций a, b и c, потому их заворачивают в скобки, чтобы устранить неоднозначную трактовку.
Данная проблема это из-за того, что при width < 350 картинка постоянно меняется на саму себя. Нужно менять один раз, например, поменять условие на width == 350, или добавить проверку на src картинки, или флаг.
Конструкция (9 < number < 20) в JS работает не так, как в Пайтоне.
Вместо того, чтобы вычислять нахождение числа между 9 и 20, JS сравнит 9 с переменной number, получит булево значение, которое приведёт к 0 или 1, а затем этот 0 или 1 сравнит с 20. В итоге условие будет всегда выполняться независимо от number. И, главное, ошибку никакую не выдаст, прожуёт, будто так и надо было.
Проще уж на родительский элемент повесить обработчик события, а там через event.target проверять, какому именно окну принадлежит элемент, в который пользователь нажал.
По поводу querySelectorAll - он возвращает массив элементов, а не единичный элемент, как querySelector. Почему нельзя посмотреть это в документации?
Я обычно тупо проксирую nodejs через nginx, чтобы не париться, а с nginx certbot дружит из коробки.
Вдобавок он берёт на себя многое то, что иначе пришлось бы реализовывать отдельно в nodejs-приложении - логгирование, отдача статики, сжатие данных.
Обычно всё это определение операторов связи делается путём запроса на сервер и последующей проверки IP-адреса через базу данных наподобие Maxmind (GeoIP)