Как стать автором
Обновить

Комментарии 34

Из графиков не понятна целесообразность — судя по графику JQuery в PNG занимает что-то межу 50 и 60 КБ, а gzip судя по closure-compiler.appspot.com/home должен занимать 32КБ
Спасибо за отзыв! Я этот момент не учёл. А цифры действительно забыл добавить в статью, как только попаду домой — сразу отредактирую статью.
Забавно, поучительно. Зануда mode on: практически все js, css и html и другие легко сжимаемые файлы отдаются с сервера уже сжатыми. То есть в настоящий момент нет необходимости даже минифицировать js и css, достаточно только комментарии вырезать. Даже не могу сообразить где ваш код пригодился бы.
Согласен. Годится, по большому счету, лишь для забавы.
Я бы написал об этом в статье, потому что мне показалось, что описанный в статье метод предлагается как решение проблемы сжатия скриптов.
Очевидно, что он не самый лучший, ведь есть gzip, который:
— поддерживается всеми браузерами
— поддерживается всеми серверами
— лучше сжимает

А идея сама очень прикольная, респект
Если хочется совсем уж адского сжатия, то таки минифицировать желательно. Удаляются лишние пробелы, переводы строк и прочие штуки.
Я, грубо говоря, изобрёл велосипед
Когда реализовывал такую систему (вынужденно, т.к. требовалось залить интерактивный рассказ на Самиздат, а засунуть туда JS можно только через img-эксплойт), столкнулся с её ненадёжностью.
Во-первых, картинки частенько не прогружаются или прогружаются не полностью, особенно на мобильных устройствах с хреновым GPRS. Поэтому пришлось к изображению добавить контрольный столбец — самый правый столбик у меня содержал только синие (0,0,255) пиксели. Тогда перед декодированием можно проверить, прогрузилась ли картинка до конца или браузер срезал половину.
Во-вторых, браузеры на движке WebKit отличаются редкостной параноидальностью, и когда пользователь сохраняет страничку, то JS запущенной локальной копии не имеет доступа к данным канваса (кто только придумал такое ограничение?).
Наконец, оказалось, что слишком большие (>5Мб) картинки в процессе декодирования крашат Firefox for Android, причём он не просто падает, а уводит весь девайс в перезагрузку.
Кстати, был опыт с Opera Turbo? Подозреваю, что пережатые картинки работать не будут вообще :)
Opera Turbo пережимает только jpg изображения, png, gif остаются без пережатия, так было.
Сделал в Gimp PNG'шку размером 2000x2000 и объёмом 7.8 МБайт с RGB-шумом, попробовал открыть на Nexus 7 с Android 4.3:

Firefox 26.0.1: открыл, можно смотреть, масштабировать, полёт нормальный
Chrome 31.0.1650.59: упал

Разумеется, это ни о чём не говорит, просто интересный факт.
Да-да-да, я то же самое однажды сделал, но на Хабр поленился запостить.
Ссылка: animuchan.net/sukijs/ (см. исходники)
Кстати, Касперский может резать большой json, приходящий аяксом (что-то около 3 мегабайт). Причем режет по длине текста, т.к. приходит на самом деле 700-килобайтный gzip. Можно извратиться с мапами, а можно и попробовать скомпрессить так.
Можно попробовать выкинул Касперский и не покупать его никогда, если он это действительно делает.
Это сродни «давайте побивать камнями пользователей с 6 ослом/старой оперой/любителей на палмах»
Нет, это как покарать производителя за плохой продукт.
Парень, ты ненормальный. В хорошем смысле слова :) Именно такие и двигаю прогресс в программировании.
А что на счет использования данного способа для обфускации js? Столкнулся недавно с этой проблемой и кроме как closure и обфускаторы вида !([]+[])+[], которые увеличивают длину кода в 100500 раз и прекрасно деобфусцируются одним нажатием кнопки, ничего не нашел.
С обфускацией тут ничего. Это не обфускация.
Если я не ошибаюсь — в один пиксель можно загнать четыре байта? Альфа канал же ещё…
Всё верно, ARGB, по байту на канал. Жаль, что в статье не описано почему именно 3 байта берётся.
Сжимается плохо, да и альфа полбайта только, если не ошибаюсь.
Нельзя. К сожалению, canvas по-идиотски работает с альфа-каналом — в буфере хранятся не истинные цвета, а умноженные на значение альфа. В момент считывания браузер пытается восстановить их делением на альфа, что невозможно без потерь. Т.е. при считывании данных с канваса получим искажение цветов, если есть альфа-канал с переменными значениями.
Что-то я такого не наблюдал. Возвращаются все 4 компоненты из канваса. В псевдомассиве data данные лежат как RGBA.
Данные возвращаются, но с потерей точности, т.е. эти RGBA будут немного (незаметно для глаза) отличаться от исходных.
Попробуйте закодировать текст в RGBA, засунуть этот массив в канвас, а потом сразу же снова считать и декодировать. При этом значительная часть символов заменяется «мусором» в результате потери точности.
Сурово и бесполезно на практике, но очень интересно. Спасибо за статью!
А как насчет времени обработки js файлов с таким сжатием?
Полезного вынес из статьи то, что EmberJS точно не буду использовать в обозримом будущем)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории