Выбираем лучший онлайн-сервис по сжатию CSS. Проблемы сжатия и объединения Javascript

Сокращение или сжатие.js -файлов - один из процессов оптимизации сайта. Сжатие файлов JavaScript, которые используются на Вашем сайте, достаточно весомо может отразиться на скорости загрузки страницы. Естественно, только в лучшую сторону. Сокращение JavaScript не только ускорит скорость загрузки страницы, но так же ускорит синтаксический анализ и отображение страницы.

Что такое JavaScript и как происходит сжатие.js-файлов

JavaScript - это один из наиболее известных объектно-ориентированных языков программирования. А это значит, что .js -файл в первую очередь представляет из себя продукт программирования. Это важно знать, чтобы понимать суть сжатия кода JavaScript. Допустим, что перед нами некий код, который написан на JavaScript и выполняет определенные действия. Для примера приведем банальную программу вывода слов «Hello World» в браузере:

document.write(«Hello World»);

Какими способами можно сократить.js-файл?

  • Изменить алгоритм . Каждая программа работает по некоторому алгоритму. В некоторых случаях можно найти алгоритм, который будет работать быстрее и при этом меньше весить. Но обычная программа не сможет изменить алгоритм другой программы. Для этого нужен искусственный интеллект. Либо естественный, в виде программиста.
  • Убрать все комментарии, пробелы и пропуски. Редкий программист не будет использовать пробелы, пропуски и комментарии в своём коде. Комментарии помогают не заблудиться, пробелы помогают создать древовидный код, а целые пропуски могут отделить логически различающиеся участки кода. Всё это хорошо, пока программист пишет код. Но когда код дописан и программа работоспособна, то все эти ненужные символы можно убрать и тем самым сократить объем js-файла.
  • Изменить переменные. Одним из ключевых элементов программирования являются переменные - названия определенных элементов. С помощью переменных программист обращается к данным, которые скрыты за ним. И чтобы понимать какая переменная что хранит, программисты частенько дают переменным достаточно длинные имена, в которых содержится подсказка по поводу того, что за данные тут лежат. Во время программирования это очень удобно, а во время оптимизации сайта они не сильно необходимы. Например, переменную с именем тут_хранится_количество_записей_сайта можно без проблем для функциональности сайта заменить на переменную а . Вы сократите объем .js -файла сразу на 20± 10 байтов. И данное число можно смело умножать на количество вхождений данной переменной. К тому же переменных может быть очень много.
  • Закодировать код . Это последний и, наверное, самый действенный способ сжать .js -файл. Инструмент, который я хочу Вам презентовать, производит кодировку с использованием технологии Base62 . Данная технология использует 62 символа ASCII - символы A-Z, a-z и 0–9 - для кодирования информации. Этот инструмент мы и рассмотрим более подробно.
  • Инструмент для сжатия JavaScript

    Javascriptcompressor.com

    можно произвести три из четырех приведенных способов для сжатия кода JavaScript. Данный онлайн инструмент не позволяет выполнить первый пункт - он не может проанализировать Ваш алгоритм и заменить его на аналогичный. С остальными же тремя он справляется на ура.

    Интерфейс сайта весьма прост. В первое окно Вы должны ввести JavaScript код, а во втором окне Вы получите его сжатую версию. Так же, на странице имеются два checkbox`а:

  • Base62 Encode
  • Shrink variables
  • Если Вы отметите первый из них, то сжатие Вашего кода будет происходить с использованием технологии Base62 . Ну, а второй checkbox будет по-возможности заменять длинные переменные на более короткие. В любом случае - отметите Вы хотя бы один checkbox, оба или вообще не отметите - произойдет сжатие кода JavaScript путем удаления комментариев, пропусков и пробелов. В дополнение к этому, Вы можете увидеть размер кода до сжатия и после сжатия.

    Что еще нужно знать про сжатие JavaScript

    Ресурсов, которые предлагают те же услуги, предостаточно. Я остановился на данном инструменте потому, что другие ресурсы производили сжатие с ошибками. Не следует отрицать возможность наличия ошибок в сжатом js-коде. Поэтому, перед сжатием javascipt кода, создайте резервную копию .js -файла. Сразу после сжатия кода, лучше протестировать работоспособность сайта. Ещё лучше будет, если Вы проведете испытания на тестовом сайте.

    Так же хочу сказать, что кодирование маленьких по объему .js -файлов почти что бессмысленно. Очень часто после кодирования таких файлов, их объем только увеличивается. Удачи Вам в ваших попытках сократить и сжать JavaScript.

    Стоит все же осветить наиболее характерные проблемы этого самого сжатия и объединения.

    Начнем с простого: как JS-сжатие способно испортить нам настроение. И как его поднять обратно:)

    UPD стартовал конкурс ускорения сайтов . В призах: монитор, веб-камера, мышь. Все гипер-быстрое.

    JavaScript-сжатие Вообще стоит сразу упомянуть, что сжатие JavaScript-файлов даст нам всего лишь 5-7% уменьшение размера относительно обычного gzip, который можно использовать везде (нет, реально, везде - начиная от конфигурации Apache через.htaccess и заканчивая статическим сжатием через mod_rewrite + mod_mime и конфигурацией nginx (или LightSpeed). Но вернемся к теме топика: мы хотим минимизировать JavaScript-файлы, как это лучше всего сделать?

    Два года назад был произведен обзор текущих инструментов , за это время ситуация не сильно изменилась (разве что появился Google Compiler). Но все по порядку.

    • Начнем с простого. JSMin (или его клон, JSMin+). Работает очень универсально (по принципу конечных автоматов). Почти всегда минимизируемый файл даже исполняется. Дополнительный выигрыш (здесь и далее относительно простого gzip) - до 7% в случае продвинутой версии, т.е. совсем мало. Процессор кушает умеренно (продвинутая версия, JSMin+ сильнее, и память значительно), но не анализирует область видимости переменных, в связи с чем не умеет сокращать их длину. В принципе, может применяться почти для всех скриптов, но иногда возможны нюансы. Например, удаляются условные комментарии (это лечится) или неверно распознаются различные конструкции (например, + + преобразуется в ++ , это ломает логику), это тоже лечится, но сложнее.
    • YUI Compressor . Наиболее известный (до недавнего времени еще и наиболее мощный) инструмент для сжатия скриптов. Базируется на движке Rhino (насколько известно, корни движка где-то рядом с фреймворком Dojo, т.е. очень-очень давно). Сжимает скрипты отлично, работает над областью видимости (может уменьшать длину переменных). Степень сжатия - до 8% сверх gzip, однако, процессор кушает будь здоров (в связи с использованием виртуальной машины Java), так что с использованием в режиме онлайн стоит быть осторожным. Также в связи с уменьшением длин переменных возможны различные проблемы (и их даже потенциально больше, чем для JSMin).
    • Google Closure Compiler появился недавно, но уже завоевал доверие общественности. Базируется на том же движке Rhino (ага, нет ничего нового под луной), но использует более продвинутые алгоритмы уменьшения размера исходного кода (отличный обзор во всех деталях), до 12% относительно gzip. Но тут стоит быть втройне острожным: может быть вырезана весьма существенная часть логики, особенно при агрессивных преобразованиях. Однако для jQuery уже используется этот инструмент . По процессорным издержкам он, видимо, еще тяжелее YUI (данный факт не проверялся).
    • и Packer . Данный инструмент уже уходит в прошлое в связи с развитием каналов связи и отставанием процессорных мощностей: ибо сжатие в нем (алгоритм, аналогичный gzip) производится за счет JavaScript-движка. Это обеспечивает очень значительное (до 55% без gzip) уменьшение размера кода, но дополнительные издержки вплоть до 500-1000 мс на распаковку архива. Естественно, это становится не актуальным, если процессорные мощности ограничены (привет, IE), а скорость соединения весьма высока (+ gzip уже почти везде применяется и поддерживается). Дополнительно, данный метод оптимизации наиболее склонен к различным багам после минимизации.
    Резюме здесь: проверяйте JavaScript не только на том сервере, где он разрабатывается, но и после оптимизации. Лучше всего - по одним и тем же unit-тестам. Узнаете много нового про описанные инструменты:) Если это не критично, то используйте просто gzip (лучше всего статический с максимальной степенью сжатия) для обслуживания JavaScript.Проблемы объединения JavaScript-файлов После того как мы разобрались со сжатием JavaScript-файлов, хорошо бы затронуть тему их объединения. Средний сайт имеет 5-10 JavaScript-файлов + несколько встроенных (inline) кусков кода, которые могут так или иначе вызывать подключаемые библиотеки. В итоге - 10-15 кусков кода, которые можно объединить вместе (плюсов от этого море - начиная от скорости загрузки на стороне пользователя и заканчивая отказоустойчивостью сервера под DDoS - тут каждое соединение будет на счету, даже статическое).

    Но вернемся к баранам. Сейчас мы будем разговаривать про некоторую автоматизацию объединения «сторонних» скриптов. Если вы имеете к ним полный доступ (и разбираетесь в веб-разработке), то не составляет большого руда пофиксить проблемы (или исключить ряд проблемных скриптов из объединения). В противном случае (когда набор скриптов никак не хочет объединяться без ошибок) нижеследующий подход как раз для вас.

    Итак, у нас есть 10-15 кусков кода (часть из них в виде встроенного кода, часть - в виде внешних библиотек, которые мы можем так же «слить» вместе). Нам нужно гарантировать их независимую работоспособность. В чем она заключается?

    Если у нас есть JavaScript-ошибка в файле, то браузер прекращает выполнение этого файла на ошибке (некоторые наиболее древние еще и прекращают выполнение всех JavaScript-файлов на странице в этом случае, но мы не совсем про это разговариваем). Соответственно, если первая же библиотека, которую мы хотим объединить в общий файл, выдает ошибку, то во всех браузерах у нас клиентская логика после объединения развалится. Грустно.

    Дополнительно стоит отметить, что встроенный (inline) код достаточно тяжело отлаживать. Его можно либо исключить из объединения (например, расположив вызов объединенного файла до или после кода), или же при его использовании вообще отменить объединение файлов.

    Обратная совместимость Что мы можем с этим поделать? Наиболее простой путь: исключать проблемные файлы (при этом ошибки могут проявляться только на этапе объединения, отдельные же файлы могут отрабатывать на ура) из логики объединения. Для этого нужно будет отслеживать, в каком месте происходить ошибка, и собрать конфигурацию для объединения для каждого такого случая.

    Но можно поступить несколько проще. Для JavaScript мы можем воспользоваться конструкцией try-catch . Ага, мысль уловили? Еще нет? Мы можем все содержимое файлов, которые объединяем, заключать в try {} , а в catch(e) {} вызывать подключение внешнего файла примерно следующим образом:

    try { ... содержимое JavaScript-библиотеки... } catch (e) { document.write("исходный вызов JavaScript-файла"); // или console.log("нужно исключить из объединения JavaScript-файл"); }
    При этом у нас у пользователя загрузится один-единственный файл, если никаких проблем не возникло. Если же ошибки были, то подключатся все внешние проблемные файлы в прежнем порядке. Это и обеспечит обратную совместимость.Проблемы производительности Очевидно, что данный подход не является «самым правильным». Наиболее логичным было бы определить JavaScript-ошибки, их устранить, и загружать для всех пользователей один файл. Но не всегда это возможно. Также стоит учесть, что try-catch конструкция тяжеловата для исполнения в браузерах (добавляет 10-25% ко времени инициализации), стоит быть с ней осторожным.

    Но описанный подход может замечательно применяться для отладки конкретно объединения JavaScript-файлов: ведь он позволяет точно определять, какие файлы «сыпятся» (если файлов несколько десятков, это очень и очень полезно).

    Небольшое резюме После дополнительной минимизации JavaScript-файлов обязательно проверяйте их функциональность. А отладку корректности объединения JavaScript-файлов можно легко автоматизировать, или даже настроить обратную совместимость в случае невозможности отладки конкретных скриптов.

    Скорость загрузки является одним из наиболее значимых факторов, определяющих конверсию сайта. Поэтому это одна из самых важных проблем, которую нужно решать в первую очередь. Есть множество факторов, влияющих на этот параметр - от удаленности сервера до качества разработки. Также существуют множество методов по уменьшению скорости загрузки сайта. Один из них - сжатие файлов js и css .

    Описание проблемы

    CMS 1С-Битрикс пока не предоставила функционала по сжатию js и css файлов. Она позволяет только объединить эти файлы в один js и css файл. Поэтому нужно решать эту проблему самостоятельно.

    Проблема скорости загрузки сайта остро встала перед одним из наших постоянных клиентов — сайт tiremax.ru , которому мы оказываем услугу при появлении сезонного спроса на их товар. После проверки сайта Google Page Speed , сервис указал нам на большой объем js и css файлов. Решили эту проблему в два этапа:

  • Минимизация файлов js и css ;
  • Сжатие их в архив *.gz .
  • Минимизация js-файлов

    Для минимизации файлов js была выбрана библиотека Dean Edwards . Она очень проста в использовании:

  • скачиваем библиотеку для php5;
  • загружаем файлы class.JavaScriptPacker.php и example-file.php на ваш сайт;
  • в строке 5 файла example-file.php прописываем путь к вашему js файлу; $src = "/js/myScript-src.js";
  • в строке 6 файла example-file.php прописываем путь к файлу на выходе: $out = "/js/myScript.js";
  • Запускаем файл example-file.php .
  • В результате на этом шаге получились следующие результаты * :

    Название файла Размер до сжатия, байт Размер после сжатия, байт
    common.js 30918 13002
    jquery.cookie.js 2817 1483
    jquery.easing.1.3.js 8097 3204
    jquery.equalheights.js 2395 752
    jquery.maskedinput.js 12397 3540
    jquery.stickem.js 4499 2098
    scripts.js 7572 4490
    video_slider.js 9737 4297

    * в таблице не приведены файлы библиотек, которые уже поставляются в сжатом виде.

    Но, есть одно требование, которое предъявлено к вашим файлам js . Иначе после минимизации браузер будет выдавать ошибку. И это требование — правильная расстановка запятых в исходном js . Вот пример правильной расстановки запятых:

    Var input, output; // notice the semi-colon at the END of function expressions onload = function() { input = document.getElementById("input"); output = document.getElementById("output"); clearAll(true); }; function packScript() { output.value = pack(input.value); } function clearAll(focus) { output.value = input.value = ""; // the "if" statement is NOT terminated with a semi-colon if (focus) { input.focus(); } }

    Минимизация css-файлов

    Для минимизации css—файлов использовался парсер и оптимизатор . Принцип его работы также прост:

  • копируем библиотеку на сайт;
  • запускаем файл css_optimiser.php ;
  • копируем свой css—файл или прописываем путь к нему;
  • выбираем уровень сжатия (по умолчанию — средний);
  • нажимаем кнопку Progress CSS.
  • И скрипт выдает нам сжатый код css . Вот результаты, которые получились у меня:

    Для сжатия файлов в формат gz использовались материалы статьи Как ускорить загрузку своего сайта при помощи compress.php , который объединит и сожмёт JS + CSS в Gzip .

    Инструкции, описанные в статье довольно просты:

  • скачайте скрипт compress.php ;
  • скачайте скрипты cssmin.php и jsmin.php ;
  • создайте папку (давайте для примера назовем её section_for_gz) для этих файлов compress.php , cssmin.php и jsmin.php (в результате работы этих скриптов архивы создадутся в папке min , которая будет находится на уровень вложенности выше, чем созданная вами папка);
  • создайте в папке section_for_gz файл compress_timestamp.php и установите на него права, чтобы скрипт compress.php мог этот файл перезаписывать. В этот файле будет хранится переменная, содержащая время запуска скрипта. Это время будет записано в название выходных файлов, чтобы «обмануть» кэш;
  • В тег head в шапке вашего сайта пропишите следующий код: require_once("/section_for_gz/compress_timestamp.php"); if (stripos($_SERVER["HTTP_ACCEPT_ENCODING"], "GZIP")! == false) { $gz = "gz"; } else { $gz = null; } echo "", PHP_EOL; echo "", PHP_EOL;
    В строках 3-6 скрипт проверяет, поддерживает ли браузер сжатие. Если поддерживает, то будут подключены gz—файлы, если нет, то будут подключены сжатые css и js—файлы.
  • Отредактируйте файл compress.php начиная со строки 130, и перечислите свои скрипты и стили: file_compress("css_schedule.css", array("/css/style.css", "/css/bootstrap.css", "/css/bootstrap.min.css", "/css/ie7.css", "/css/ie8.css", "/css/ie9.css", "/css/jquery.fancybox.css", "/css/jquery.formstyler.css", "/css/jquery.rating.css", "/css/nouislider.fox.css", "/css/nouislider.space.css", "/css/style.css")); file_compress("js_schedule.js", array("/js.min/jquery.easing.min.1.3.js", "/js.min/common.min.js", "/js/bootstrap.min.js", "/js/jquery.carouFredSel-6.1.0.min.js", "/js/jquery.formstyler.min.js", "/js/jquery.masonry.min.js", "/js.min/jquery.equalheights.min.js", "/js/jquery.nouislider.min.js", "/js/jquery.rating.pack.js", "/js/jquery.placeholder.min.js", "/js.min/jquery.stickem.min.js", "/js/jTweener-0.2.js", "/js.min/video_slider.min.js", "/js/jquery.fancybox.pack.js", "/js.min/jquery.maskedinput.min.js", "/js.min/jquery.cookie.min.js", "/js/scripts.js"));
  • Запустите файл compress.php .
  • В папке min создались 5 файлов: js_schedule.js , css_schedule.css , js_schedule.jsgz , css_schedule.cssdz и.htaccess с кодом:

    AddType text/css cssgz AddType text/javascript jsgz AddEncoding x-gzip .cssgz .jsgz # for all files in min directory FileETag None # Cache for a week, attempt to always use local copy ExpiresActive On ExpiresDefault A604800 Header unset ETag Header set Cache-Control "max-age=604800, public" который надо вставить в ваш.htaccess в корне сайта.

    Запускаем сайт — работа закончена.

    В результате объем файла css_schedule.cssgz стал 41604 байта (изначально суммарный вес всех css—файлов был более 300000 байт), а файла js_schedule.jsgz — 51059 байт (суммарный вес — более 400000 байт)..

    Таким образом, при помощи сторонних библиотек удалось сократить размеры файлов js и css . Стоит заметить, что после повторного тестирования сайта tiremax.ru на Google Page Speed оценка скорости загрузки подросла на 6 пунктов. В дальнейшем, для увеличения скорости загрузки нашего партнера, мы установили ему композитный сайт. Будем надеяться, что хорошая скорость загрузки привлечет к нему много клиентов.

    Дамы и господа, давайте включим параною:

    Однако, если рассматривать средний результат, то с достаточно большим отрывом выделяются 2 инструмента:

    1. cssresizer.com (84,13%);

    whois спойлер

    nikitas@pentagon:~$ whois cssresizer.com

    Whois Server Version 2.0

    Domain names in the .com and .net domains can now be registered
    with many different competing registrars. Go to http://www.internic.net
    for detailed information.

    Domain Name: CSSRESIZER.COM
    Registrar: REGISTRAR OF DOMAIN NAMES REG.RU LLC
    Sponsoring Registrar IANA ID: 1606
    Whois Server: whois.reg.com
    Referral URL: http://www.reg.ru
    Name Server: NS1.MCHOST.RU
    Name Server: NS2.MCHOST.RU
    Name Server: NS3.MCHOST.RU
    Name Server: NS4.MCHOST.RU
    Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
    Updated Date: 21-apr-2016
    Creation Date: 08-apr-2016
    Expiration Date: 08-apr-2017

    For more information on Whois status codes, please visit https://icann.org/epp

    NOTICE: The expiration date displayed in this record is the date the
    registrar"s sponsorship of the domain name registration in the registry is
    currently set to expire. This date does not necessarily reflect the expiration
    date of the domain name registrant"s agreement with the sponsoring
    registrar. Users may consult the sponsoring registrar"s Whois database to
    view the registrar"s reported date of expiration for this registration.

    TERMS OF USE: You are not authorized to access or query our Whois
    database through the use of electronic processes that are high-volume and
    automated except as reasonably necessary to register domain names or
    modify existing registrations; the Data in VeriSign Global Registry
    Services" ("VeriSign") Whois database is provided by VeriSign for
    information purposes only, and to assist persons in obtaining information
    about or related to a domain name registration record. VeriSign does not
    guarantee its accuracy. By submitting a Whois query, you agree to abide
    by the following terms of use: You agree that you may use this Data only
    for lawful purposes and that under no circumstances will you use this Data
    to: (1) allow, enable, or otherwise support the transmission of mass
    unsolicited, commercial advertising or solicitations via e-mail, telephone,
    or facsimile; or (2) enable high volume, automated, electronic processes
    that apply to VeriSign (or its computer systems). The compilation,
    repackaging, dissemination or other use of this Data is expressly
    prohibited without the prior written consent of VeriSign. You agree not to
    use electronic processes that are automated and high-volume to access or
    query the Whois database except as reasonably necessary to register
    domain names or modify existing registrations. VeriSign reserves the right
    to restrict your access to the Whois database in its sole discretion to ensure
    operational stability. VeriSign may restrict or terminate your access to the
    Whois database for failure to abide by these terms of use. VeriSign
    reserves the right to modify these terms at any time.

    The Registry database contains ONLY .COM, .NET, .EDU domains and
    Registrars.

    Domain name: cssresizer.com
    Domain idn name: cssresizer.com
    Status: clientTransferProhibited http://www.icann.org/epp#clientTransferProhibited
    Registry Domain ID:
    Registrar WHOIS Server: whois.reg.com
    Registrar URL: https://www.reg.com/
    Registrar URL: https://www.reg.ru/
    Registrar URL: https://www.reg.ua/
    Updated Date:
    Creation Date: 2016-04-08T14:01:10Z
    Registrar Registration Expiration Date: 2017-04-08
    Registrar: Registrar of domain names REG.RU LLC
    Registrar IANA ID: 1606
    Registrar Abuse Contact Email: [email protected]
    Registrar Abuse Contact Phone: +7.4955801111
    Registry Registrant ID:
    Registrant ID:
    Registrant Name: Protection of Private Person
    Registrant Street: PO box 87, REG.RU Protection Service
    Registrant City: Moscow
    Registrant State/Province:
    Registrant Postal Code: 123007
    Registrant Country: RU
    Registrant Phone: +7.4955801111
    Registrant Phone Ext:
    Registrant Fax: +7.4955801111
    Registrant Fax Ext:
    Registrant Email: [email protected]
    Admin ID:
    Admin Name: Protection of Private Person
    Admin Street: PO box 87, REG.RU Protection Service
    Admin City: Moscow
    Admin State/Province:
    Admin Postal Code: 123007
    Admin Country: RU
    Admin Phone: +7.4955801111
    Admin Phone Ext:
    Admin Fax: +7.4955801111
    Admin Fax Ext:
    Admin Email: [email protected]
    Tech ID:
    Tech Name: Protection of Private Person
    Tech Street: PO box 87, REG.RU Protection Service
    Tech City: Moscow
    Tech State/Province:
    Tech Postal Code: 123007
    Tech Country: RU
    Tech Phone: +7.4955801111
    Tech Phone Ext:
    Tech Fax: +7.4955801111
    Tech Fax Ext:
    Tech Email: [email protected]
    Name Server: ns1.mchost.ru
    Name Server: ns2.mchost.ru
    Name Server: ns3.mchost.ru
    Name Server: ns4.mchost.ru
    DNSSEC: Unsigned
    URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net/
    >>> Last update of WHOIS database: 2016-07-27T00:49:39Z

    Понравилась статья? Поделиться с друзьями: