Власна голова зберігає URL-адресу, загорнуту в base64 JSON, а не зображення
Компонент profile містить base64 від {textures:{SKIN:{url:…}}}. Ось чому вигляд голови фіксується в момент її створення, і чому база даних може містити десятки тисяч записів.
Власна голова гравця не містить картинки. Вона містить хеш текстури, загорнутий у JSON, загорнутий у base64, розташований усередині компонента profile предмета.
Шари
Починаючи з хешу, команда будується так:
1. hash e3b0c44298fc1c149afbf4c8996fb924…
2. JSON {"textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/<hash>"}}}
3. base64 eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6…
4. component /give @p player_head[profile={properties:[{name:"textures",value:"<base64>"}]}]
Чотири шари, щоб сказати «ця голова виглядає як те зображення». Властивість завжди називається textures, and the value is always the base64 of that JSON shape.
З цього безпосередньо випливають дві речі:
Голова — це знімок, а не посилання на особу. URL вказує на незмінний файл текстури, а не на обліковий запис. Те, чому відповідав цей хеш під час створення голови, вона відображатиме завжди.
Дані крихітні. Запис голови — це назва, хеш і кілька тегів — зовсім без байтів зображення. Ось чому каталог може містити десятки тисяч голів як простий статичний JSON і все одно завантажуватися швидко.
Чому каталог завантажується за категоріями
База даних тут — це CC0-колекція голів від TheSilentPro, і вона завантажується по одній категорії за раз , а не всі одразу. Індекс містить перелік категорій та їхню кількість; вибір однієї завантажує лише цей файл.
Це не лінива розробка, це єдиний формат, який працює за такого розміру. Уся колекція як один JSON була б великим завантаженням для того, кому потрібно лише три голови з однієї категорії.
Обмеження рендерингу в 300 елементів — це ліміт DOM, а не пошуку
Результати відмальовуються щонайбільше по 300 за раз. Пошук однаково виконується по всьому в завантаженій категорії — обмеження стосується лише того, скільки елементів перетворюється на вузли DOM, а не скільки перевіряється.
Ця різниця важлива, коли пошук повідомляє, що показує перші 300: відсутні записи були знайдені й просто не виводяться на сторінку, а не виключені із запиту. Звуження пошуку переміщує їх у доступний діапазон замість глибшого пошуку.
Відмальовування десятків тисяч елементів одночасно — це саме те, чому запобігає це обмеження, і це реальний ліміт, а не просто кругле число для перестрахування — настільки велика сітка перестає нормально прокручуватися задовго до того, як перестане рендеритися.
Тут нічого нікуди не завантажується
Дані голів — це статичний JSON із того самого джерела. Єдиний сторонній запит — це <img> preview from mc-heads.net, which resolves a hash into a picture for display. The /give command is assembled locally from the hash, so the command works whether or not that preview loaded.