lamapixel
0%
E-commerce · 6 min чтения

Аудит приложений: что приложения забирают даже после удаления

Удалённое приложение остаётся в теме: 6,9 МБ картинок, мёртвые сниппеты и чужие скрипты без defer. Как сделать аудит приложений самому, с командами.

Аудит приложений: что приложения забирают даже после удаления

Кнопка «Удалить» в админке Shopify отменяет подписку и отключает приложение от магазина. Она не удаляет то, что приложение загрузило в вашу тему. Картинки, сниппеты, правки layout и ссылки на чужие серверы остаются там, пока кто-нибудь не найдёт их руками.

В одном магазине, который мы давно ведём, мы так нашли 6,9 МБ из 8,8 МБ папки assets/ - картинки приложения лояльности, удалённого ещё раньше. На них ссылались три сниппета, и ни один не отрисовывался (собственный разбор локальной копии темы, 27.08.2026).

За приложения вы платите ежемесячно, но счёт состоит из трёх частей

Первая часть - подписка, и её вы видите в выписке. Вторая и третья в деньгах не выставляются, но оплачиваются точно так же.

Часть счёта Где проявляется Когда заканчивается
Подписка выписка по счёту при удалении
Замедление страницы LCP, число запросов только при уборке темы
Время разработчика каждая следующая правка только при уборке темы

Расходы на подписки разбираем в статье о месячных расходах магазина. Этот текст - про две оставшиеся.

Приложение трогает не только свои файлы

Чтобы работать в списке товаров или в корзине, приложение должно попасть в тему. Делает оно это шестью способами, и каждый из них переживает удаление по-своему долго:

  • Файлы в папке assets/ - картинки, скрипты, стили.
  • Сниппеты, которые оно вставляет в секции или в layout.
  • Правки layout/theme.liquid - инициализация, коды аналитики.
  • Script tags, вставляемые платформой вне темы.
  • App proxy - собственные адреса под доменом вашего магазина.
  • Собственный layout, обычно у конструкторов страниц.

При удалении платформа надёжно убирает только script tags и app blocks. Остальное - ваш файл в вашей теме, и никто чужой его удалять не будет.

Мёртвые картинки не тормозят страницу, но удорожают любую работу с темой

Те 6,9 МБ картинок из вступления не загружаются, потому что сниппеты, которые их вызывают, нигде не отрисовываются. Посетитель их никогда не скачает, и в замере скорости вы их не найдёте.

Зато они удорожают всё остальное: скачивание темы, её дублирование, выкладку через theme push, сравнение двух магазинов. То есть ровно те операции, которые разработчик делает в каждом заказе. Измерьте папку assets/ раньше, чем возьмётесь за размер темы - иначе вы оптимизируете код, доля которого меньше доли мёртвых картинок.

В той же теме к этому было 31 неиспользуемый сниппет из 102, 34 неиспользуемые секции из 149 и 15 мёртвых файлов в assets/ объёмом 312 КБ.

Собственный код темы весил 635 КБ, на живой странице было три мегабайта

Это самое ясное число всего разбора. Собственных скриптов у темы было 32 файла общим объёмом 635 КБ, и все они были подключены с атрибутом defer. При этом на живой странице инструмент замера насчитал порядка 3 МБ JavaScript в 236 файлах (WebPageTest, мобильный профиль, холодный кэш, 24.06.2026).

Разницу принесли приложения и сторонние сервисы. Кто в такой ситуации платит за рефакторинг темы и не делает инвентаризацию приложений, покупает примерно пятую часть проблемы. Как скорость делится между платформой и страницей, разбираем в статье о том, почему быстрый Shopify тормозит.

Двенадцать чужих скриптов без defer - это двенадцать чужих отказов

В той же теме мы насчитали 12 внешних скриптов без атрибута defer или async с семи чужих хостов. Два из них были синхронными прямо в <head>, то есть в месте, где браузер останавливает обработку документа, пока файл не скачается с чужого сервера.

Если тот сервер не ответит, не отрисуется ничего. Это не теоретическое опасение: один из хостов в той теме, polyfill.io, при нашей проверке 27.08.2026 возвращал ошибку HTTP 520.

polyfill.io не медленный, это чужой код с чужим владельцем

В этом пункте дело не в скорости. Домен polyfill.io в 2024 году сменил владельца и начал с части визитов рассылать вредоносные редиректы; сегодня он мёртв. В тему он попал в сниппете одного приложения, как запасной вариант для старых браузеров.

Важно, как это чинится. Тот сниппет вендорский и несёт пометку «не править вручную» - любая правка исчезнет при первом обновлении приложения. Поэтому вопрос адресуется разработчику приложения, а не вашему программисту. Если приложение уже не установлено, сниппет удаляется целиком.

Практически это значит одно: каждая тема, которую вы принимаете после кого-то другого, прочёсывается на чужие домены в <script src> раньше, чем уходит в продакшн.

Приложения печатают e-mail покупателя в HTML, а записывающие сервисы его собирают

Типичный инициализационный сниппет приложения лояльности или реферальной программы выводит в страницу customer.email, first_name, last_name, orders_count и total_spent. Часть приложений вдобавок дублирует e-mail в data-атрибуты.

По отдельности каждый из этих шагов законен. Проблема возникает на пересечении: на той же странице работала запись пользовательских сессий. Персональные данные, напечатанные в HTML, тем самым попадают в запись сессии у третьей стороны, а это уже передача, которая должна быть обоснована.

Это находка не для разработчика, а для того, кто у вас отвечает за обработку персональных данных. Наша роль заканчивается фразой «вот так это выглядит на странице, и вот эти три сервиса это видят».

После конструкторов страниц остаётся второй layout, о котором никто не знает

Конструкторы страниц вроде GemPages, PageFly или Shogun добавляют себе собственный layout/theme.<название>.liquid. После удаления файл остаётся и содержит копию шапки со всеми тогдашними правками.

В разбираемой теме он имел 583 строки, и его не вызывал ни один {% layout %}. От живого layout он отличался на 165 строк - и содержал единственный вызов сниппета с hreflang во всей теме.

Прежде чем такой файл удалять, сравните его с живым. Различия показывают, какие правки шапки за эти годы делались вслепую и что при них потерялось.

Аудит приложений вы сделаете сами за полдня

Скачайте тему через Shopify CLI и запустите на папке пять проверок. Ни одна из них не требует доступа в админку.

du -sh assets/                                   # сколько весят статические файлы
rg -o 'src="https?://[^/"]+' --no-filename | sort -u   # чужие домены в скриптах
rg -l 'polyfill\.io|cdn\.jsdelivr|unpkg\.com'    # известные чужие CDN
ls layout/                                       # ожидаем один theme.liquid
rg -c 'customer\.email|customer\.total_spent'    # персональные данные в HTML

К каждой находке потом идёт один вопрос: этот файл ещё кто-нибудь вызывает? Имя сниппета ищется в render и include, имя ассета - по всей теме. Если не находится нигде, это кандидат на удаление - не само удаление, потому что решение принадлежит тому, кто знает, сколько эта функция зарабатывала.

Чем платят за уборку

Скажем прямо, потому что предложения по ускорению эту фразу обычно опускают. Удалив приложение, вы лишитесь функции, за которую платили - программы лояльности, отзывов о товарах, апселла в корзине.

Поэтому решение принадлежит не разработчику, а тому, кто знает выручку этой функции. Мы даём вторую половину уравнения: сколько это приложение стоит в мегабайтах, в секундах, в риске отказа и во времени разработчика.

Вторая вещь, которую честно сказать: уборка темы не видна. Она не добавит функции и не сдвинет дизайн. Она окупится на следующей правке, которая сделается вдвое быстрее, потому что понятно, что живое.

Пришлите нам список приложений и адрес магазина

Вернём, какие из них реально работают, что после удалённых осталось в теме и какие чужие скрипты грузятся на каждой странице. У каждого пункта будет указано, что произойдёт после удаления.

Объём аудита и ускорения сайта описан на странице услуги; если вы разбираетесь со всей темой, а не только с приложениями, посмотрите, как шаблоны выходят из-под контроля. Магазины на Shopify мы тоже строим - включая приём магазина после другого подрядчика.

Напишите на info@lamapixel.com или позвоните +420 775 599 009.

Нужна помощь?

Напишите нам - вместе найдём решение.

Назначить консультацию →