<?xml version="1.0" encoding="windows-1251"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WEB Optimizator</title><description>Статьи и переводы по оптимизации скорости загрузки сайта</description><image><url>http://i.webo.in/x.png</url><title>Web Optimizator</title><link>http://webo.in/speed/</link></image><link>http://webo.in/</link><lastBuildDate>Sat, 06 Mar 2010 17:32:40 GMT</lastBuildDate><generator>FeedCreator by DreamwinD</generator><language>ru</language><webMaster>info@webo.name (WEBO Software)</webMaster><copyright>Copyright 2008-2010, WEBO Software</copyright><ttl>240</ttl><item><title>Проблемы сжатия и объединения Javascript</title><link>http://webo.in/articles/habrahabr/112-minify-combine-javascript-troubles/</link><guid>http://webo.in/articles/habrahabr/112-minify-combine-javascript-troubles/</guid><description>&lt;p class="right"&gt;&lt;a href="http://www.webogroup.com/home/site-speedup/"&gt;&lt;img src="http://wss.2static.it/wp-content/uploads/2010/01/005-150x150.png" alt="сжатие текстовых файлов" title="сжатие текстовых файлов" width="150" height="150"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;После публикации ряда заметок на тему &lt;a href="http://webo.in//articles/habrahabr/11-minifing-javascript/"&gt;сжатия&lt;/a&gt; и &lt;a href="http://webo.in//articles/habrahabr/70-ant-optimization-automation/"&gt;объединения JavaScirpt-файлов&lt;/a&gt; стоит все же осветить наиболее характерные проблемы этого самого сжатия и объединения.&lt;/p&gt;&lt;p&gt;Начнем с простого: как JS-сжатие способно испортить нам настроение. И как его поднять обратно :)&lt;/p&gt;&lt;h3&gt;JavaScript-сжатие&lt;/h3&gt;&lt;p&gt;Вообще стоит сразу упомянуть, что сжатие JavaScript-файлов даст нам всего лишь 5-7% уменьшение размера относительно обычного gzip, который можно использовать &lt;strong&gt;везде&lt;/strong&gt; (нет, реально, везде &amp;mdash; начиная от &lt;a href="http://code.google.com/p/web-optimizator/wiki/IntegrationWithWebsite" rel="nofollow"&gt;конфигурации Apache через .htaccess&lt;/a&gt; и заканчивая &lt;a href="http://webo.in//articles/habrahabr/07-gzip-all/"&gt;статическим сжатием через mod_rewrite + mod_mime&lt;/a&gt; и &lt;a href="http://webo.in//articles/habrahabr/58-nginx-reverse-proxy/"&gt;конфигурацией nginx&lt;/a&gt; (или LightSpeed). Но вернемся к теме топика: мы хотим минимизировать JavaScript-файлы, как это лучше всего сделать?&lt;/p&gt;&lt;p&gt;Два года назад был произведен &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;обзор текущих инструментов&lt;/a&gt;, за это время ситуация не сильно изменилась (разве что появился &lt;a href="http://code.google.com/closure/compiler/" rel="nofollow"&gt;Google Compiler&lt;/a&gt;). Но все по порядку.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Начнем с простого. &lt;a href="http://www.crockford.com/javascript/jsmin.html" rel="nofollow"&gt;JSMin&lt;/a&gt; (или его клон, &lt;a href="http://crisp.tweakblogs.net/blog/cat/716" rel="nofollow"&gt;JSMin+&lt;/a&gt;). Работает очень универсально (по принципу &lt;a href="http://ru.wikipedia.org/wiki/Конечный_автомат" rel="nofollow"&gt;конечных автоматов&lt;/a&gt;). Почти всегда минимизируемый файл даже исполняется. Дополнительный выигрыш (здесь и далее относительно простого gzip) &amp;mdash; до 7% в случае продвинутой версии, т.е. совсем мало. Процессор кушает умеренно (продвинутая версия, JSMin+ сильнее, и память значительно), но не анализирует область видимости переменных, в связи с чем не умеет сокращать их длину. В принципе, может применяться почти для всех скриптов, но иногда возможны нюансы. Например, удаляются условные комментарии (это лечится) или неверно распознаются различные конструкции (например, &lt;code&gt;+ +&lt;/code&gt; преобразуется в &lt;code&gt;++&lt;/code&gt;, это ломает логику), это тоже лечится, но сложнее.&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow"&gt;YUI Compressor&lt;/a&gt;. Наиболее известный (до недавнего времени еще и наиболее мощный) инструмент для сжатия скриптов. Базируется на движке Rhino (насколько известно, корни движка где-то рядом с фреймворком Dojo, т.е. очень-очень давно). Сжимает скрипты отлично, работает над областью видимости (может уменьшать длину переменных). Степень сжатия &amp;mdash; до 8% сверх gzip, однако, процессор кушает будь здоров (в связи с использованием виртуальной машины Java), так что с использованием в режиме онлайн стоит быть осторожным. Также в связи с уменьшением длин переменных возможны различные проблемы (и их даже потенциально больше, чем для JSMin).&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/closure/compiler/" rel="nofollow"&gt;Google Closure Compiler&lt;/a&gt; появился недавно, но уже завоевал доверие общественности. Базируется на том же движке Rhino (ага, нет ничего нового под луной), но использует более продвинутые алгоритмы уменьшения размера исходного кода (&lt;a href="http://javascript.ru/optimize/google-closure-compiler" rel="nofollow"&gt;отличный обзор во всех деталях&lt;/a&gt;), до 12% относительно gzip. Но тут стоит быть втройне острожным: может быть вырезана весьма существенная часть логики, особенно при агрессивных преобразованиях. Однако для &lt;a href="http://stackoverflow.com/questions/1691861/jquery-compiled-with-google-closure-compiler" rel="nofollow"&gt;jQuery уже используется этот инструмент&lt;/a&gt;. По процессорным издержкам он, видимо, еще тяжелее YUI (данный факт не проверялся).&lt;/li&gt;&lt;li&gt;и &lt;a href="http://dean.edwards.name/packer/" rel="nofollow"&gt;Packer&lt;/a&gt;. Данный инструмент уже уходит в прошлое в связи с развитием каналов связи и отставанием процессорных мощностей: ибо сжатие в нем (алгоритм, аналогичный gzip) производится за счет JavaScript-движка. Это обеспечивает очень значительное (до 55% без gzip) уменьшение размера кода, но дополнительные издержки вплоть до 500-1000 мс на распаковку архива. Естественно, это становится не актуальным, если процессорные мощности ограничены (привет, IE), а скорость соединения весьма высока (+ gzip уже почти везде применяется и поддерживается). Дополнительно, данный метод оптимизации наиболее склонен к различным багам после минимизации.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Резюме здесь: проверяйте JavaScript не только на том сервере, где он разрабатывается, но и после оптимизации. Лучше всего &amp;mdash; по одним и тем же unit-тестам. Узнаете много нового про описанные инструменты :) Если это не критично, то используйте просто gzip (лучше всего статический с максимальной степенью сжатия) для обслуживания JavaScript.&lt;/p&gt;&lt;h3&gt;Проблемы объединения JavaScript-файлов&lt;/h3&gt;&lt;p&gt;После того как мы разобрались со сжатием JavaScript-файлов, хорошо бы затронуть тему их объединения. Средний сайт имеет 5-10 JavaScript-файлов + несколько встроенных (inline) кусков кода, которые могут так или иначе вызывать подключаемые библиотеки. В итоге &amp;mdash; 10-15 кусков кода, которые можно объединить вместе (плюсов от этого море &amp;mdash; начиная от скорости загрузки на стороне пользователя и заканчивая отказоустойчивостью сервера под DDoS &amp;mdash; тут каждое соединение будет на счету, даже статическое).&lt;/p&gt;&lt;p&gt;Но вернемся к баранам. Сейчас мы будем разговаривать про некоторую автоматизацию объединения &amp;laquo;сторонних&amp;raquo; скриптов. Если вы имеете к ним полный доступ (и разбираетесь в веб-разработке), то не составляет большого руда пофиксить проблемы (или исключить ряд проблемных скриптов из объединения). В противном случае (когда набор скриптов никак не хочет объединяться без ошибок) нижеследующий подход как раз для вас.&lt;/p&gt;&lt;p&gt;Итак, у нас есть 10-15 кусков кода (часть из них в виде встроенного кода, часть &amp;mdash; в виде внешних библиотек, которые мы можем так же &amp;laquo;слить&amp;raquo; вместе). Нам нужно гарантировать их независимую работоспособность. В чем она заключается?&lt;/p&gt;&lt;p&gt;Если у нас есть JavaScript-ошибка в файле, то браузер прекращает выполнение этого файла на ошибке (некоторые наиболее древние еще и прекращают выполнение &lt;strong&gt;всех&lt;/strong&gt; JavaScript-файлов на странице в этом случае, но мы не совсем про это разговариваем). Соответственно, если первая же библиотека, которую мы хотим объединить в общий файл, выдает ошибку, то во всех браузерах у нас клиентская логика после объединения развалится. Грустно.&lt;/p&gt;&lt;p&gt;Дополнительно стоит отметить, что встроенный (inline) код достаточно тяжело отлаживать. Его можно либо исключить из объединения (например, расположив вызов объединенного файла до или после кода), или же при его использовании вообще отменить объединение файлов.&lt;/p&gt;&lt;h3&gt;Обратная совместимость&lt;/h3&gt;&lt;p&gt;Что мы можем с этим поделать? Наиболее простой путь: исключать проблемные файлы (при этом ошибки могут проявляться только на этапе объединения, отдельные же файлы могут отрабатывать на ура) из логики объединения. Для этого нужно будет отслеживать, в каком месте происходить ошибка, и собрать конфигурацию для объединения для каждого такого случая.&lt;/p&gt;&lt;p&gt;Но можно поступить несколько проще. Для JavaScript мы можем воспользоваться конструкцией &lt;code&gt;try-catch&lt;/code&gt;. Ага, мысль уловили? Еще нет? Мы можем все содержимое файлов, которые объединяем, заключать в &lt;code&gt;try {}&lt;/code&gt;, а в &lt;code&gt;catch(e) {}&lt;/code&gt; вызывать подключение внешнего файла примерно следующим образом:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;try {
    ... содержимое JavaScript-библиотеки ...
} catch (e) {
    document.write('исходный вызов JavaScript-файла');
// или console.log('нужно исключить из объединения JavaScript-файл');
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;При этом у нас у пользователя загрузится один-единственный файл, если никаких проблем не возникло. Если же ошибки были, то подключатся все внешние проблемные файлы в прежнем порядке. Это и обеспечит обратную совместимость.&lt;/p&gt;&lt;h3&gt;Проблемы производительности&lt;/h3&gt;&lt;p&gt;Очевидно, что данный подход не является &amp;laquo;самым правильным&amp;raquo;. Наиболее логичным было бы определить JavaScript-ошибки, их устранить, и загружать для всех пользователей один файл. Но не всегда это возможно. Также стоит учесть, что &lt;code&gt;try-catch&lt;/code&gt; конструкция тяжеловата для исполнения в браузерах (добавляет 10-25% ко времени инициализации), стоит быть с ней осторожным.&lt;/p&gt;&lt;p&gt;Но описанный подход может замечательно применяться для отладки конкретно объединения JavaScript-файлов: ведь он позволяет точно определять, какие файлы &amp;laquo;сыпятся&amp;raquo; (если файлов несколько десятков, это очень и очень полезно).&lt;/p&gt;&lt;h3&gt;Небольшое резюме&lt;/h3&gt;&lt;p&gt;После дополнительной минимизации JavaScript-файлов обязательно проверяйте их функциональность. А отладку корректности объединения JavaScript-файлов можно легко автоматизировать, или даже настроить обратную совместимость в случае невозможности отладки конкретных скриптов.&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/23-high-performance-ajax-applications/"&gt;Высокопроизводительные AJAX-приложения&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;JavaScript: жать или не жать?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/05-delayed-loading/"&gt;Практический JS: «отложенная» загрузка&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/50-fast-fast-javascript/"&gt;Быстрый-быстрый JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/12-javascript-optimization/"&gt;Практический JS: разгоняем все, что движется&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/04-speed-up-events-handlers/"&gt;Практический JS: ускоряем обработку событий&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/18-solving-internet-explorer-memory-leaks/"&gt;Практический JS: избавляемся от утечек памяти в IE&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sat, 06 Mar 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/86443/#comments</comments></item><item><title>WEBO Software проводит конкурс ускорения сайтов</title><link>http://webo.in/articles/all/2010/04-speed-for-speed/</link><guid>http://webo.in/articles/all/2010/04-speed-for-speed/</guid><description>&lt;p class="right" style="margin:10px 0 10px 10px"&gt;&lt;img src="http://www.webogroup.com/i/promo/speed-for-speed/prize-1.png" alt=""/&gt;&lt;/p&gt;&lt;p&gt;Быстрых сайтов должно быть больше. Чтобы это стало реальностью, со &lt;strong&gt;2 по 31 марта 2010 года&lt;/strong&gt; WEBO Software проводит конкурс обзоров ускорения сайтов &amp;mdash; &amp;laquo;Скорость ради скорости&amp;raquo;.&lt;/p&gt;&lt;p&gt;Среди призов: &lt;strong&gt;широкоформатный монитор&lt;/strong&gt; с быстрой матрицей, быстрая &lt;strong&gt;веб-камера&lt;/strong&gt;, молниеносная &lt;strong&gt;мышь&lt;/strong&gt; и подписки на &lt;a href="http://www.webogroup.com/home/site-speedup/"&gt;WEBO Site SpeedUp&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Для участия в конкурсе достаточно &lt;a href="http://www.webogroup.com/home/download/"&gt;загрузить WEBO Site SpeedUp&lt;/a&gt;, настроить его (используя тестовый ключ для полной версии) и написать об этом. Ссылку на обзор нужно выслать на &lt;a href="http://webo.in/articles/all/2010/04-speed-for-speed/mailto:free@webo.name"&gt;free@webo.name&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Список всех обзоров будет опубликован на сайте &lt;a href="http://www.webogroup.com/"&gt;www.webogroup.com&lt;/a&gt;. По результатам первого тура будут отобраны 10 самых информативных обзоров, и победителей выберут на народном голосовании.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.webogroup.com/home/offers/speed/"&gt;Более подробно об акции можно прочитать на сайте www.webogroup.com&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;О компании WEBO Software&lt;/h3&gt;&lt;p&gt;&lt;a href="http://www.webogroup.com/"&gt;WEBO Software&lt;/a&gt; &amp;mdash; инновационная компания, главной целью которой является разработка решений для оптимизации производительности веб-сайтов любой сложности. Ее основной продукт, &lt;a href="http://www.webogroup.com/home/site-speedup/"&gt;WEBO Site SpeedUp&lt;/a&gt;, является мировым лидером в ускорении загрузки сайтов на основе PHP и имеет тысячи реальных установок. Миссией WEBO Software является обеспечение максимальной производительности каждого сайта.&lt;/p&gt;
</description><pubDate>Fri, 05 Mar 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/86035/#comments</comments></item><item><title>VML, SVG, Canvas: вперед в прошлое</title><link>http://webo.in/articles/wsd2009/vrml-vml-svg-canvas/</link><guid>http://webo.in/articles/wsd2009/vrml-vml-svg-canvas/</guid><description>&lt;h3&gt;Предыстория векторных форматов&lt;/h3&gt;&lt;p&gt;В 90х годах прошлого века было довольно много попыток внести ясность в описание и представление векторных данных в вебе. Началось это примерно в 1994-1995 годах, когда несколько независимых групп разрабатывают и предлагают сначала спецификацию, а затем и плагины к браузерам для &lt;a href="http://svf.org/svf1/" rel="nofollow"&gt;SVF (Simple Vector Format)&lt;/a&gt;, &lt;a href="http://www.w3.org/MarkUp/VRML/" rel="nofollow"&gt;VRML (Virtual Reality Markup Language)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Чуть позже, 19 августа 1998 года, была представлена альтернатива для CGM (Computer Graphic Metafile) &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-WebCGM-19980819/" rel="nofollow"&gt;Web CGM&lt;/a&gt;,&amp;nbsp;&amp;mdash; которая бы позволила расширить сферу примнения данного формата.&lt;/p&gt;&lt;p&gt;VRML оказался самым жизнеспособным из всех представленных аналогов (наверное, в силу поддержки в Netscape), и был сначала утвержден в рамках стандарта &lt;a href="http://www.web3d.org/x3d/specifications/vrml/VRML97Am1/" rel="nofollow"&gt;VRML97&lt;/a&gt;, а затем преобразован в &lt;a href="http://www.web3d.org/x3d/specifications/" rel="nofollow"&gt;X3D&lt;/a&gt; в 2004 году.&lt;/p&gt;&lt;h3&gt;VML / PGML: немного истории&lt;/h3&gt;&lt;p&gt;Sun / IBM / Adobe 10 апреля 1998 года выкатывают свое решение для представления данных в векторном формате в вебе &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-PGML-19980410" rel="nofollow"&gt;PGML&lt;/a&gt;. Microsoft тоже не дремлет и вместе с рядом крупных компаний предлагает буквально через месяц (13 мая) на &lt;a href="http://www.w3.org/TR/NOTE-VML" rel="nofollow"&gt;рассмотрение W3C альтернативное решение &amp;mdash; стандарт VML&lt;/a&gt;. Дальше Microsof гнет свою линию и включает поддержку VML уже в IE 5.0 (в &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer_5" rel="nofollow"&gt;марте 1999 года&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Очевидно, что технология, обладающая такой мощной поддержкой в браузерах того времени просто так не могла умереть (в отличие от PGML, которая, по-видимому, поддерживается только в настольных приложений тех компаний, которые его выдвинули). И &lt;a href="http://arstechnica.com/microsoft/news/2008/04/microsofts-office-open-xml-now-an-official-iso-standard.ars" rel="nofollow"&gt;в 2008 году VML окончательно закрепляется в качестве стандарта в составе Open Office XML&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: истоки&lt;/h3&gt;&lt;p&gt;История Canvas во многом отлична от упомянтых векторных стандартов. Во-первых, в 2005 году Apple предложила использовать &lt;a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/Canvas.html" rel="nofollow"&gt;уже вендренную ею технику Canvas&lt;/a&gt; для попиксельного изменения изображения внутри какой-то области (Canvas, холста). Эта идея была подхвачена Mozilla, которая интегрировала ее в Gecko 1.8 (Firefox 1.5 и выше), а позже и Opera (Opera 9.0 вышла с поддержкой Canvas).&lt;/p&gt;&lt;p&gt;Затем Canvas был включен в готовящийся стандарт Web Applications 1.0, который затем &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" rel="nofollow"&gt;вошел в состав HTML5&lt;/a&gt;. Планируется, что поддержка Canvas пойдет в следующую версию IE.&lt;/p&gt;&lt;h3&gt;VML + SVG: векторные форматы&lt;/h3&gt;&lt;p&gt;На настоящий момент SVG поддерживается всеми современными браузерами. Для IE необходимо использовать эмуляцию всех методов через VML (либо создавать альтернативное приложение).&lt;/p&gt;&lt;p&gt;Для описания SVG используется XML формат. При этом, естественно, возможны любые преобразования получившегося изображения при помощи DOM-методов (т.е. можно использовать любую JavaScript-логику &amp;laquo;поверх&amp;raquo; векторных форматов).&lt;/p&gt;&lt;p&gt;Спектр использования векторной графики сейчас довольно широк: это отображение масштабируемых объектов, областей на картах, вывод графиков. Стоит отметить, что в силу XML-природы SVG может быть легко интегрирован с другими форматами, в частности, сейчас идет его интеграция с MathML. Также можно назвать одно &amp;laquo;нестандартное&amp;raquo; применение VML &amp;mdash; для эмуляции полупрозрачности в PNG для IE. Для этого разработана специальная JavaScript-библиотека &amp;mdash; &lt;a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" rel="nofollow"&gt;DD_belatedPNG&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: растровые операции&lt;/h3&gt;&lt;p&gt;Основным отличием от SVG в Canvas является его чисто динамическая (можно использовать только при помощи JavaScript) и растровая (нет объектов и связе между ними) природа. Однако в некоторых случаях это только плюс (например, сложные области на картах было бы логичнее обводить при помощи растровой, а не векторной графики).&lt;/p&gt;&lt;p&gt;Для работоспособности в IE используется эмуляция с помощью VML.&lt;/p&gt;&lt;p&gt;Как и всякую популярную технологию, Canvas используют по поводу и без везде, где только можно. Например, для отображения в браузере произвольных шрифтов (поскольку корректная поддержка &lt;code&gt;@font-face&lt;/code&gt; несколько запаздывает): &lt;a href="http://typeface.neocracy.org/" rel="nofollow"&gt;typeface.js&lt;/a&gt; (к слову есть более правильное с идеологической точки зрения решение данной проблемы - &lt;a href="http://cufon.shoqolate.com/generate/" rel="nofollow"&gt;cufon&lt;/a&gt;). Также хочется отметить пример портирование библиотеки Processing - &lt;a href="http://processingjs.org/" rel="nofollow"&gt;Processing.js&lt;/a&gt;. Множество других примеров использования технологии можно посмотреть на &lt;a href="http://www.canvasdemos.com/" rel="nofollow"&gt;www.canvasdemos.com&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Если вы собираетесь использовать точечную (пиксельную) графику, то лучше Canvas для этой цели ничего не подходит. При работе с большими (по площади) векторными объектами лучше использовать SVG. Также будет необходимо дублировать всю функциональность через VML для IE 8 и ниже.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/77588/#comments</comments></item><item><title>VML, SVG, Canvas: вчера, сегодня, завтра</title><link>http://webo.in/articles/wsd2009/vml-svg-canvas/</link><guid>http://webo.in/articles/wsd2009/vml-svg-canvas/</guid><description>&lt;h3&gt;VML / PGML: немного истории&lt;/h3&gt;&lt;p&gt;Sun / IBM / Adobe 10 апреля 1998 года выкатывают свое решение для представления данных в векторном формате в вебе &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-PGML-19980410" rel="nofollow"&gt;PGML&lt;/a&gt;. Microsoft тоже не дремлет и вместе с рядом крупных компаний предлагает буквально через месяц (13 мая) на &lt;a href="http://www.w3.org/TR/NOTE-VML" rel="nofollow"&gt;рассмотрение W3C альтернативное решение &amp;mdash; стандарт VML&lt;/a&gt;. Дальше Microsoft гнет свою линию и включает поддержку VML уже в IE 5.0 (в &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer_5" rel="nofollow"&gt;марте 1999 года&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Очевидно, что технология, обладающая такой мощной поддержкой в браузерах того времени просто так не могла умереть (в отличие от PGML, которая, по-видимому, поддерживается только в настольных приложений тех компаний, которые его выдвинули). И &lt;a href="http://arstechnica.com/microsoft/news/2008/04/microsofts-office-open-xml-now-an-official-iso-standard.ars" rel="nofollow"&gt;в 2008 году VML окончательно закрепляется в качестве стандарта в составе Open Office XML&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;SVG: немного истории&lt;/h3&gt;&lt;p&gt;SVG, будучи инициативой, исходящей конкретно от W3C, развивался как формат весьма динамично. В конце 1998 года была образована SVG Working Group, которая занялась разработкой этого формата, через полгода (в июле 1999 года) она предложила первый вариант спецификации, и уже в 2001 году увидел свет &lt;a href="http://www.w3.org/TR/SVG10/" rel="nofollow"&gt;стандарт SVG 1.0&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;На данный момент основным работающим стандартом &lt;a href="http://www.w3.org/TR/SVG11/" rel="nofollow"&gt;является SVG 1.1&lt;/a&gt; (утвержденный в 2003 году). &lt;a href="http://www.w3.org/Graphics/SVG/WG/wiki/Roadmap" rel="nofollow"&gt;В июне 2012 года&lt;/a&gt; планируется предоставить полностью готовый SVG 2.0.&lt;/p&gt;&lt;h3&gt;Canvas: истоки&lt;/h3&gt;&lt;p&gt;История Canvas во многом отлична от упомянутых векторных стандартов. Во-первых, в 2005 году Apple предложила использовать &lt;a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/Canvas.html" rel="nofollow"&gt;уже вендренную ею технику Canvas&lt;/a&gt; для попиксельного изменения изображения внутри какой-то области (Canvas, холста). Эта идея была подхвачена Mozilla, которая интегрировала ее в Gecko 1.8 (Firefox 1.5 и выше), а позже и Opera (Opera 9.0 вышла с поддержкой Canvas).&lt;/p&gt;&lt;p&gt;Затем Canvas был включен в готовящийся стандарт Web Applications 1.0, который затем &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" rel="nofollow"&gt;вошел в состам HTML5&lt;/a&gt;. Планируется, что поддержка Canvas войдет в следующую версию IE.&lt;/p&gt;&lt;h3&gt;VML + SVG: векторные форматы&lt;/h3&gt;&lt;p&gt;На настоящий момент SVG поддерживается всеми современными браузерами. Для IE необходимо использовать эмуляцию всех методов через VML (либо создавать альтернативное приложение).&lt;/p&gt;&lt;p&gt;Для описания SVG используется XML формат. При этом, естественно, возможны любые преобразования получившегося изображения при помощи DOM-методов (т.е. можно использовать любую JavaScript-логику &amp;laquo;поверх&amp;raquo; векторных форматов).&lt;/p&gt;&lt;p&gt;Спектр использования векторной графики сейчас довольно широк: это отображение масштабируемых объектов, областей на картах, вывод графиков. Стоит отметить, что в силу XML-природы SVG может быть легко интегрирован с другими форматами, в частности, сейчас идет его интеграция с MathML. Также можно назвать одно &amp;laquo;нестандартное&amp;raquo; применение VML &amp;mdash; для эмуляции полупрозрачности в PNG для IE. Для этого разработана специальная JavaScript-библиотека &amp;mdash; &lt;a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" rel="nofollow"&gt;DD_belatedPNG&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: растровые операции&lt;/h3&gt;&lt;p&gt;Основным отличием от SVG в Canvas является его чисто динамическая (можно использовать только при помощи JavaScript) и растровая (нет объектов и связе между ними) природа. Однако в некоторых случаях это только плюс (например, сложные области на картах было бы логичнее обводить при помощи растровой, а не векторной графики).&lt;/p&gt;&lt;p&gt;Для работоспособности в IE используется эмуляция с помощью VML.&lt;/p&gt;&lt;p&gt;Как и всякую популярную технологию, Canvas используют по поводу и без везде, где только можно. Например, для отображения в браузере произвольных шрифтов (поскольку корректная поддержка &lt;code&gt;@font-face&lt;/code&gt; несколько запаздывает): &lt;a href="http://typeface.neocracy.org/" rel="nofollow"&gt;typeface.js&lt;/a&gt; (к слову есть более правильное с идеологической точки зрения решение данной проблемы&amp;nbsp;&amp;mdash; &lt;a href="http://cufon.shoqolate.com/generate/" rel="nofollow"&gt;cufon&lt;/a&gt;). Также хочется отметить пример портирования библиотеки Processing &amp;mdash; &lt;a href="http://processingjs.org/" rel="nofollow"&gt;Processing.js&lt;/a&gt;. Множество других примеров использования технологии можно посмотреть на &lt;a href="http://www.canvasdemos.com/" rel="nofollow"&gt;www.canvasdemos.com&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas против SVG&lt;/h3&gt;&lt;p&gt;На данный момент Canvas при решении большинства задач справляется с ними быстрее, чем SVG. Достаточно давно был разработан пример использования Canvas для &lt;a href="http://www.ernestdelgado.com/gmaps/canvas/ddemo1.html" rel="nofollow"&gt;ряда задач Google Maps&lt;/a&gt;. В нем зафиксирован прирост скорости в 200-500% (для всех браузеров, которые поддерживают Canvas).&lt;/p&gt;&lt;p&gt;Также можно &lt;a href="http://intertwingly.net/stories/2006/07/10/penroseTiling.html" rel="nofollow"&gt;привести еще один тест&lt;/a&gt; скорости отображения объектов в Canvas и SVG. Здесь SVG снова проигрывает.&lt;/p&gt;&lt;p&gt;Для уточнения вопросов производительности можно &lt;a href="http://www.borismus.com/canvas-vs-svg-performance/" rel="nofollow"&gt;обратиться к исследованию&lt;/a&gt;, установившему закономерность между производительностью SVG, Canvas и параметрами изображения. В результате оказывается вполне очевидным, что при увеличении числа объектов (для SVG &amp;mdash; векторных) производительность SVG падает сильно (почти экспоненциально), а Canvas &amp;mdash; остается на стабильном уровне. Здесь стоит отметить, что размер активной области при этом не изменяется.&lt;/p&gt;&lt;p&gt;Однако если мы начнем увеличивать область построения (размеры объектов), то тут векторный формат показывает себя во всей красе: производительность практически не меняется. Производительность Canvas падает (как и следовало ожидать) квадратичным образом от числа объектов (площадь активной области увеличивается квадратично).&lt;/p&gt;&lt;p&gt;Из этого можно сделать простой вывод: если вы собираетесь использовать точечную (пиксельную) графику, то лучше Canvas для этой цели ничего не подходит. При работе с большими (по площади) векторными объектами лучше использовать SVG. Также будет необходимо дублировать всю функциональность через VML для IE 8 и ниже.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/76607/#comments</comments></item><item><title>Качество переходит в количество</title><link>http://webo.in/articles/riw2009/quality-becomes-quantity/</link><guid>http://webo.in/articles/riw2009/quality-becomes-quantity/</guid><description>&lt;h3&gt;Быстрая оценка потенциала SEO для сайта&lt;/h3&gt;&lt;p&gt;В докладе идет речь, в первую очередь, о применении быстрых инструментов анализа для проверки, насколько качественно работает поисковое продвижение для небольшого сайта или насколько хорошо готов такой сайт к запуску продвижения в поисковых движках. Среди таких точек проверки (позволяющих быстро убедиться в готовности / качестве сайта с точки зрения SEO) можно назвать следующие.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Файл robots.txt.&lt;/li&gt;&lt;li&gt;Заголовки и фрагменты текста в поиске.&lt;/li&gt;&lt;li&gt;Глубина индексации.&lt;/li&gt;&lt;li&gt;Внутренняя перелинковка.&lt;/li&gt;&lt;li&gt;Скорость загрузки.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Давайте рассмотрим каждый из пунктов подробнее.&lt;/p&gt;&lt;h3&gt;Файл robots.txt&lt;/h3&gt;&lt;p&gt;Достаточно часто этот файл (расположенный в корне сайта) создают в соответствии со стандартами, поэтому тут проблемы маловероятны. На какие моменты стоит обратить внимание:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;User-Agent&lt;/code&gt; &amp;mdash; идентификатор браузера пользователя или поискового робота.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Disallow&lt;/code&gt; директива позволяет исключить нежелательные страницы из индекса. Это могут быть как результаты внутреннего поиска, так и личный кабинет пользователей или раздел администратора. Также здесь можно исключить некоторые наиболее &amp;laquo;тяжелые&amp;raquo; страницы в плане серверной нагрузки.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Host&lt;/code&gt; учитывает только Яндекс. Может быть полезно при использовании нескольких зеркал.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Sitemap&lt;/code&gt; указывает на XML-файл карты сайта. Очень полезно при увеличении глубины индексации сайта при наличии нескольких (десятков, сотен) тысяч страниц.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Crawl-delay&lt;/code&gt; устанавливает интервал захода поисковых роботов на сайт. Полезно для уменьшения нагрузки на сервер от индексации (в ночное время), либо для нивелирования влияния поисковых роботов на задержки для остальных посетителей сайта.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Все указанные вещи можно быстро проверить либо самостоятельно, либо с помощью бесплатных инструментов, например, &lt;a href="http://webmaster.yandex.ru/wmconsole/public_robots_txt.xml" rel="nofollow"&gt;webmaster.yandex.ru/wmconsole/public_robots_txt.xml&lt;/a&gt;. Дополнительно при добавлении, например, в Яндекс сайта для индексации, поисковик может проверить возможность индексации данного сайта и сразу же выдать предупреждение в случае ее невозможности.&lt;/p&gt;&lt;p&gt;В следующем примере мы указываем для сайта &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; для всех поисковых роботов запрет на индексацию секции &lt;code&gt;/my/&lt;/code&gt;, XML-файл с картой сайта и интервал между запросами страниц в 10 секунд.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;User-agent: *
Disallow: /my/
Sitemap: http://webo.in/sitemap.xml
Host: webo.in
Crawl-delay: 10&lt;/pre&gt;&lt;/blockquote&gt;&lt;h3&gt;Заголовки страниц&lt;/h3&gt;&lt;p&gt;Очень часто заголовки (тег &lt;code&gt;title&lt;/code&gt;) страниц используют только для продвижения ключевых слов. Здесь стоит вспомнить, ваш сайт зарабатывает деньги не на поисковых роботах, а на живых пользователях. А пользователи достаточно враждебно реагирует на бессмысленные заголовки страниц.&lt;/p&gt;&lt;p&gt;Однако для улучшения качества поисковой выдачи для поисковых запросов сайта нужно иметь в виду, что поисковики показывают около первых 70 символов от заголовкка. Поэтому именно в них должен быть заложен основной призыв к потенциальному посетителю, чтобы он перешел из результатов поиска к вам на сайт.&lt;/p&gt;&lt;h3&gt;Фрагменты тексты в поиске&lt;/h3&gt;&lt;p&gt;Аналогичная ситуация обстоит и с фрагментами текста в поиске. Они показываются сразу под заголовками, и если пользователь сомневается, насколько может быть ему полезен данный сайт, то обязательно их просматривает. Здесь вы можете эффективно разместить до 150 символов.&lt;/p&gt;&lt;p&gt;Google берет этот текст из мета-тега &lt;code&gt;description&lt;/code&gt;, Яндекс предпочитает текст страницы, обрамленный наиболее релевантной фразой. Для грамотного формирования этого фрагмента для Яндекса рекомендуется вставить 3-5 предложений с ключевой фразой и посмотреть, какое из них оказалось в поисковой выдаче. Затем его можно будет немного подкорректировать.&lt;/p&gt;&lt;h3&gt;Глубина индексации&lt;/h3&gt;&lt;p&gt;Глубина индексации сайта (числа проиндексированных страниц) влияет как на общий "вес" сайт при выдаче результатов поиска с него, так и позволяет показать сайт по большему количеству поисковых результатов (благодаря большему числу страниц).&lt;/p&gt;&lt;p&gt;Проверить ситуацию (и посмотреть на фактические страницы в индексе) можно, например, с помощью специализированных инструментов от поисковиков: &lt;a href="http://webmaster.yandex.ru/" rel="nofollow"&gt;webmaster.yandex.ru&lt;/a&gt; и &lt;a href="http://www.google.com/webmasters/tools/" rel="nofollow"&gt;www.google.com/webmasters/tools/&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Проверяем ситуацию&lt;/h3&gt;&lt;p&gt;Почти все вышеперечисленные моменты можно быстро проверить в полуавтоматическом режиме с помощью соответствующих сервисов. Одним из таких сервисов является &lt;a href="http://pr-cy.ru/" rel="nofollow"&gt;pr-cy&lt;/a&gt;. На нем можно посмотреть:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Состояние файла robots.txt.&lt;/li&gt;&lt;li&gt;PR / CY для сайта.&lt;/li&gt;&lt;li&gt;Проиндексированные страницы.&lt;/li&gt;&lt;li&gt;Внутренние ссылки на страницах.&lt;/li&gt;&lt;li&gt;Скорость загрузки&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Внутренняя перелинковка&lt;/h3&gt;&lt;p&gt;Данный параметр косвенно влияет на глубину индексации (насколько быстро поисковики могут загрузить страницы вашего сайта) и прямо влияет на удобство его использование (насколько быстро можно найти требуемую информацию). К сожалению, полностью проверить последний момент автоматически довольно тяжело: необходимо иметь представление о целях пользователей.&lt;/p&gt;&lt;p&gt;Но ситуацию исправляет большое количество инструментов для построения дерева сайта. Все она расположены на &lt;a href="http://code.google.com/sm_thirdparty.html" rel="nofollow"&gt;code.google.com/sm_thirdparty.html&lt;/a&gt;, можно рассмотреть использование XENU или SiteXpert. Оба этих инструмента позволяют посмотреть &amp;laquo;дерево&amp;raquo; сайта таким, как видят его поисковые роботы, и увидеть, насколько глубоко расположены все страницы сайта. Это позволит сразу увидеть потенциальные проблемы с перелинковкой и их оперативно устранить.&lt;/p&gt;&lt;h3&gt;Скорость загрузки&lt;/h3&gt;&lt;p&gt;Не последнюю роль в анализе потенциала SEO для сайта играет скорость загрузки страниц. Для поисковых роботов важна серверная составляющая (насколько быстро сервер справляется с созданием HTML-документа, если справляется плохо, то сайт будет тяжело индексироваться). Для конечных пользователей, приходящих из поиска на ваш сайт, важна клиентская составляющая (насколько быстро готовая страницы загружается в их браузерах). Также последний показатель влияет на уровень доверия сайта и число повторных его посещений.&lt;/p&gt;&lt;p&gt;Сейчас существует большое количество инструментов для автоматической проверки скорости загрузки сайта. Для проверки серверной стороны есть &lt;a href="http://host-tracker.com/" rel="nofollow"&gt;host-tracker.com&lt;/a&gt; и &lt;a href="http://webo.in/my/action/timings/" rel="nofollow"&gt;webo.in/my/action/timings/&lt;/a&gt;. Здесь характерным параметром будет создание страницы не более, чем за 0,5с.&lt;/p&gt;&lt;p&gt;Для оценки отказоустойчивости сайта (насколько он готов к пиковым нагрузкам) можно воспользоваться &lt;a href="http://www.loadimpact.com/" rel="nofollow"&gt;www.loadimpact.com&lt;/a&gt; и понять, готов ли ваш сайт к росту числа посетителей.&lt;/p&gt;&lt;p&gt;Для проверки и анализа скорости загрузки страниц в браузере существует &lt;a href="http://webo.in/" rel="nofollow"&gt;webo.in&lt;/a&gt;. Сервис позволяет точно продиагностировать возможные проблемы и предложить возможные варианты их решения.&lt;/p&gt;&lt;p&gt;Для автоматического ускорения сайта на PHP существует автоматизированное решение &amp;mdash; &lt;a href="http://www.web-optimizer.ru/"&gt;Web Optimizer&lt;/a&gt;, которые позволяет за считанные минуты увеличить скорость загрузки в 2-3 раза.&lt;/p&gt;&lt;p&gt;Спасибо за внимание, буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/searchengines/73636/#comments</comments></item><item><title>Разгоняем все, что движется</title><link>http://webo.in/articles/weborub/speed-up-all-movable/</link><guid>http://webo.in/articles/weborub/speed-up-all-movable/</guid><description>&lt;p&gt;&lt;img src="http://control.ileader.biz/u/_files/files/0/14.gif"width="277"height="200"alt="ВЕБОРУБ Ice 2008"title="ВЕБОРУБ Ice 2008"/&gt;&lt;/p&gt;&lt;h3&gt;Оптимизация &lt;a href="http://webo.in/"&gt;времени загрузки сайта&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Основные направления для проведения оптимизации с целью уменьшить время загрузки страницы включают уменьшение размера файла и уменьшение числа запросов. В качестве наиболее действенных методов, которые позволяют добиться поставленной задачи, можно рассмотреть:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/all/mod-gzip-minify-on-fly/"&gt;Gzip&lt;/a&gt; / minify для текстовых файлов (в том числе, HTML-, JS-, CSS-)&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS sprites&lt;/a&gt; и Image Map для картинок&lt;/li&gt;&lt;li&gt;ETag / Cache-Control для статических файлов&lt;/li&gt;&lt;li&gt;Семантическая верстка вместо табличной&lt;/li&gt;&lt;li&gt;Параллельные запросы на несколько &amp;laquo;ресурсных&amp;raquo; серверов&lt;/li&gt;&lt;li&gt;Убираем&lt;ul&gt;&lt;li&gt;Редиректы&lt;/li&gt;&lt;li&gt;404-ошибки&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/10-css-expressions-optimization/"&gt;CSS Expressions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Рассмотрим сжатие и минимизацию текстовых файлов. По итогам проведенных исследований, для &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;сжатия JavaScript&lt;/a&gt; лучше использовать Dean Edwards Packer, если файлы не будут дополнительно архивироваться на сервере, иначе лучше пользоваться YUI Compressor'ом. Для &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;сжатия CSS-файлов&lt;/a&gt; в любом случае лучше пользоваться CSS Tidy (но при этом возможны некоторые проблемы с хаками).&lt;/p&gt;&lt;p&gt;Если на сервере включено архивирование при выдачи файлов (&lt;code&gt;mod_gzip/deflate&lt;/code&gt;), но CSS-/JS-файлы имеется смысл архивировать и класть в виде статических архивов, чтобы дополнительно не нагружать сервер. Процедуру минимизации/архивирования можно автоматизировать при загрузке всех изменений на production-сервер.&lt;/p&gt;&lt;p&gt;HTML можно также несколько уменьшить, если убрать незначащие пробелы, переводы строк, часть символов (html entities) заменить на их действительное представление.&lt;/p&gt;&lt;h3&gt;CSS sprites&lt;/h3&gt;&lt;p&gt;Число фоновых картинок на странице может достигать нескольких сотен, обычно при этом значительное их количество используется на конкретной странице с подключенным файлом стилей. Обычно все картинки небольшие по размеру и могут быть собраны в характерные группы. Группировку можно проводить по следующим критериям:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Анимированные картинки&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по горизонтали (&lt;code&gt;repeat-x&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по вертикали (&lt;code&gt;repeat-y&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по всем направлениям (&lt;code&gt;repeat&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые не повторяются (&lt;code&gt;no-repeat&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Таким образом, сотни ресурсных файлов можно свести к паре десятков, что существенным образом снизит число запросов к серверу. Однако, если вы ориентируетесь на клиентов с IE 4.0, то этот подход использовать нельзя: браузер не понимает &lt;code&gt;background-position&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/all/http-caching/"&gt;Кеширование&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Одним из наиболее действенных путей уменьшения времени загрузки страницы является кеширование. Его можно проводить на разных уровнях, но конечным его результатом должно быть сведение к минимум запросов при открытии страницы во все последующие посещения (в идеале, вообще 0 запросов).&lt;/p&gt;&lt;p&gt;Во-первых, для статических файлов, которые изменяются достаточно редко, можно прописать кеширующие заголовки (Cache-Control). Во-вторых, можно дополнительно выставить ETag на сервере (уникальный идентификатор ресурса). Однако, есть ряд проблем с настройкой ETag для сайтов, базирующихся на нескольких (кластере) серверах. Форсировать сброс кеша на клиенте можно выставлением уникальной GET-строки (метка текущей версии или метка текущей даты). Этот процесс также можно автоматизировать.&lt;/p&gt;&lt;p&gt;Очень часто при оптимизации забывают про качественное уменьшение HTML-кода, переход от табличной к семантической, смешанной или блочной, верстке. Однако, использование технологий, основанных на спецификации и передовых разработках в этой области, позволяют существенно уменьшить размер HTML. На данный момент, полностью блочная или смешанная семантическая верстка очень хорошо отображается в браузерах (корректность отображения достигается в 99,9%).&lt;/p&gt;&lt;p&gt;Вынесение общих стилевых объявлений и скриптов во внешние файлы также уменьшит размер страницы и позволит кешировать общую часть кода (CSS- и JS-).&lt;/p&gt;&lt;p&gt;При большом количестве запрашиваемых на странице ресурсов (от 20) для дальнейшей оптимизации можно распределить запросы к статическим файлам по нескольким внешним &amp;laquo;легким&amp;raquo; серверам (thttpd, nginx), чтобы распараллелить запросы. Более 4 таких серверов подключать не рекомендуется.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/"&gt;WEBo.sunnybear.ru&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;В начале февраля был запущен проект, полностью посвященный клиентской оптимизации. На данный момент им оценено 6500 сайтов, среднее время загрузки колеблется от 11 до 100 секунд, при этом рассчитанное ускорение составляет до 1000% (в случае применения всех указанных рекомендаций).&lt;/p&gt;&lt;p&gt;Проект работает в режиме справочного пособия, которое позволяет проанализировать конкретный сайт, установить узкие места и эффективно их исправить. Сейчас анализатор выдает более 30 советов по возможному уменьшению времени загрузки страницы, содержит &lt;a href="http://webo.in/articles/"&gt;несколько десятков статей&lt;/a&gt; и докладов, в которых рассматриваются проблемы оптимизации. Также выложены &lt;a href="http://webo.in/video/"&gt;видео-записи докладов&lt;/a&gt; с ClientSide'2007.&lt;/p&gt;&lt;p&gt;Мне кажется, что у проекта большой потенциал, который можно и нужно развивать, ибо проблема оптимизации хоть и стоит перед веб-разработчиками, но о ней склонны забывать или не обращать внимание, ссылаясь на скорость современных каналов или малую нагруженность ресурса.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Буду рад ответить на ваши вопросы.&lt;/p&gt;&lt;p class="X"&gt;&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://webo.in/articles/weborub/speed-up-all-movable/</comments></item><item><title>Проверяем качество сайтов</title><link>http://webo.in/articles/site2009/website-quality/</link><guid>http://webo.in/articles/site2009/website-quality/</guid><description>&lt;p&gt;Какую картину мы обычно наблюдаем при сдаче готовых интернет-проектов (будь то социальные сети, интернет-магазины или домашние страницы)? Исполнители сдают сайт, который хорошо выглядит в браузере заказчика, который обеспечивает заложенную функциональность, может быть, даже содержит внятную документацию и удовлетворяет нормам по серверной нагрузке. Вроде все замечательно, но этого мало.&lt;/p&gt;&lt;p&gt;Через несколько недель после работы такого веб-сайта становится понятно, что поддерживать его тяжело, работает он медленно и далеко не у всех пользователей корректно. ЧтО же делать?&lt;/p&gt;&lt;h3&gt;Ключевые моменты оценки качества веб-проектов&lt;/h3&gt;&lt;p&gt;На самом деле, можно достаточно быстро принять решение о качестве сдаваемого интернет-проекта с помощью бесплатных инструментов. Что же действительно влияет на качество:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Совместимость сайта с браузерами.&lt;/li&gt;&lt;li&gt;Соответствие стандартам.&lt;/li&gt;&lt;li&gt;Семантика HTML-кода.&lt;/li&gt;&lt;li&gt;Доступность сайта для пользователей.&lt;/li&gt;&lt;li&gt;Скорость работы на стороне сервера.&lt;/li&gt;&lt;li&gt;Скорость работы на стороне браузера.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Как все это проверить за 10 минут?&lt;/p&gt;&lt;h3&gt;Кроссбраузерность сайта&lt;/h3&gt;&lt;p&gt;Проверяем с помощью &lt;a href="http://www.browsershots.org/" rel="nofollow"&gt;www.browsershots.org&lt;/a&gt;. Выбираем наиболее распространенные браузеры для целевой аудитории (Internet Explroer 6, 7 и 8, Firefox 2 и 3, Opera 9 и 10, Safari 3, Chrome 1). Получаем пару десятков изображений главной страницы сайта, и уже по ней оцениваем качество верстки: насколько она соответствует начальному дизайн-макету.&lt;/p&gt;&lt;h3&gt;Соответствие стандартам&lt;/h3&gt;&lt;p&gt;Обычно при разработке в соответствии со стандартами уменьшается время на поддержку и развития такого сайта и увеличивается его доступность для пользователей. Какие стандарты стоит проверять?&lt;/p&gt;&lt;p&gt;Проверяем с помощью HTML-валидатора: &lt;a href="http://validator.w3.org/"&gt;validator.w3.org&lt;/a&gt;, на самом деле нам достаточно, чтобы было не более 25 ошибок на странице. Рекомендуется проверять несколько типичных страниц для устранения наиболее очевидных недочетов.&lt;/p&gt;&lt;p&gt;Соответствие стандартам доступности: WCAG. Проверяем с помощью &lt;a href="http://www.contentquality.com/"&gt;www.contentquality.com&lt;/a&gt;, достаточно соответствия первому уровню (A, WCAG Priority 1).&lt;/p&gt;&lt;h3&gt;Доступность и семантика кода&lt;/h3&gt;&lt;p&gt;Отключение стилей и JavaScript в браузере позволит &amp;laquo;увидеть&amp;raquo; сайт таким, как он &amp;laquo;выглядит&amp;raquo; для поисковых и других роботов. В Firefox это можно сделать с помощью Web Developer Toolbar. В других браузерах &amp;mdash; в настройках отключения скриптов и с помощью:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;javascript:document.getElementsByTagName('head')[0].innerHTML='';void(0);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Запуск этой адреса в браузере устранит большую (или же все) стили со страницы.&lt;/p&gt;&lt;p&gt;Дополнительно страница с отключенными стилями позволит проверить, насколько семантически верен HTML-код. Если содержание на странице остается понятным для пользователя, если ключевые элементы взаимодействия по-прежнему доступны &amp;mdash; то можно считать, что страница сверстана семантически верно. Иначе нужно устранять найденные недочеты (например, отсутствующее меню или форму входа). Не стоит искать у страницы с отключенными стилями полного соответствия дизайн-макету &amp;mdash; его и не должно быть. Но содержимое такой страницы должно быть приятно для глаза и доступно для использования. Это основное правило.&lt;/p&gt;&lt;h3&gt;Скорость работы сайта&lt;/h3&gt;&lt;p&gt;Очень часто скорость работы оказывает ключевое влияние на конвертация посетителей в доход сайта. Особенно это характерно для интернет-магазинов. Как мы можем проверить эту скорость? Для серверной стороны существует инструмент &lt;a href="http://host-tracker.com/" rel="nofollow"&gt;host-tracker.com&lt;/a&gt;, с помощью которого можно установить характерное время доступа к сайту из различных точек земного шара. Также он позволяет оценить характерное время создания страницы на сервере (если минимальное время доступа к сайту больше 1с, то уже стоит бить тревогу).&lt;/p&gt;&lt;p&gt;Для проверки отказоустойчивости сайта стоит воспользоваться сервисом &lt;a href="http://loadimpact.com/" rel="nofollow"&gt;Load Impact&lt;/a&gt;. Бесплатный анализ позволяет проверить до 50 одновременных посещений (каждое из которых может открывать несколько десятков страниц на сайте). Основным показателем устойчивости сайта к нагрузкам будет вид кривой, который получится после проведения теста. Если график ровный или время открытия страницы несколько падает при росте посещаемости &amp;mdash; значит, с сайтом все нормально. Если нет, то нужно принимать решение об оптимальном потоке посетителей, которых сайт сможет обслужить.&lt;/p&gt;&lt;p&gt;&lt;img width="542" height="308" src="/articles/site2009/website-quality/loadimpact.png" alt="Время открытия страницы в зависимости от потока посетителей" title="Время открытия страницы в зависимости от потока посетителей"/&gt;&lt;/p&gt;&lt;p&gt;Для проверки качества скорости загрузки клиентской составляющей можно воспользоваться либо YSlow под Firebug для Firefox (оценка должна быть не менее 80, лучше всего не менее 90). Или же бесплатным инструментом &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; (простая оценка не ниже 70, лучше не ниже 80).&lt;/p&gt;&lt;h3&gt;На что влияет качество сайта&lt;/h3&gt;&lt;p&gt;Это, в первую очередь, стоимость его поддержки и развития. Сайт, сделанный грамотно и по всем стандартам, гораздо проще развивать, поскольку времени написание дополнительного кода при наличии хорошей, стандартной базы уходит значительно меньше. Это и масштабируемость проекта, когда разработчики предусматривают большой &amp;laquo;запас прочности&amp;raquo; для ежедневных посещений, и в пиковые часы сайт будет работать в штатном режиме, не требуя дополнительного масштабирования.&lt;/p&gt;&lt;p&gt;Скорость создания HTML-страниц и общее время загрузки очень сильно влияет на доступность сайта. Ключевым параметром здесь является &amp;laquo;загрузка за 4 секунды&amp;raquo; и более быстрая загрузка, чем у основных конкурентов. В отсутствии основных преимуществ на рынках с высокой конкуренцией скорость работы сайта может оказаться решающим фактором при принятии решения.&lt;/p&gt;&lt;p&gt;Сейчас на рынке существует несколько решений, позволяющий автоматизировать ускорение сайта на клиентском уровне. Для ASP.NET &amp;mdash; это &lt;a href="http://getrpo.com/" rel="nofollow"&gt;GetRPO.com&lt;/a&gt;, для систем на базе PHP &amp;mdash; это &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/62907/#comments</comments></item><item><title>Переносим нагрузку на клиент</title><link>http://webo.in/articles/riw2008/move-load-to-client/</link><guid>http://webo.in/articles/riw2008/move-load-to-client/</guid><description>&lt;p&gt;Клиентская оптимизация оперирует двумя основными принципами: меньше данных и меньше соединений. Но именно эти принципы помогают уменьшить нагрузку на сам сервер. Давайте посмотрим, как это происходит и как перенести часть серверной нагрузки на клиентский браузер.&lt;/p&gt;&lt;h3&gt;3 основные правила&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Кеширование во главу угла.&lt;/strong&gt; Сервер может управлять состоянием кеша клиентского браузера, во-первых, через заголовок &lt;code&gt;Cache-Control&lt;/code&gt; (и его атрибуты &lt;code&gt;max-age&lt;/code&gt;, &lt;code&gt;pre-check&lt;/code&gt;, &lt;code&gt;post-check&lt;/code&gt;), который может указывать на промежуток времени, в течение которого соответствующий файл следует хранить на диске и не запрашивать с сервера. Рекомендуется для всех статических файлов выставлять максимальное время жизни кеша и форсировать его обновление у пользователя через изменение URL ресурса (с помощью &lt;code&gt;RewriteRule&lt;/code&gt; либо GET-параметра).&lt;/p&gt;&lt;p&gt;Во-вторых, состоянием клиентского кеша можно управлять через заголовки &lt;code&gt;ETag&lt;/code&gt; и &lt;code&gt;Last-Modified&lt;/code&gt;, которые ставят в соответствие каждому файлу уникальный идентификатор, изменяющийся при изменении файла, своеобразная цифровая подпись или хеш. При этом серверу не нужно пересылать файл заново, а лишь ответить кодом 304 на запрос браузера, если файл не изменился с момента последнего запроса. При этом сам файл не пересылается, соединение (и сокет) освобождается быстрее, и ресурса сервера также экономятся.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Меньше запросов &amp;mdash; легче серверу.&lt;/strong&gt; Объединение файлов никто не отменял. Чтобы не заставлять сервер обмениваться с браузером заголовками для передачи, например, нескольких таблиц стилей гораздо экономичнее будет их объединить в одну. При этом браузер быстрее получит всю необходимую информацию и быстрее освободит такой важный ресурс как соединение.&lt;/p&gt;&lt;p&gt;Наряду с объединением текстовых файлов не стоит пренебрегать и объединением картинок. Если учитывать, что современные браузеры могут устанавливать несколько десятков одновременных соединений с сервером для получения статических файлов (и 80% из них &amp;mdash; это именно картинки), то экономия от использования CSS Sprites или Image Map рассчитывается очень просто. В некоторых случаях удается уменьшить число соединений браузера с сервером для загрузки одной HTML-страницы в 8&amp;ndash;10 раз.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Архивировать и кешировать на сервере.&lt;/strong&gt; Как показали проведенные исследования gzip-сжатия текстового файла &amp;laquo;на лету&amp;raquo; в 95&amp;ndash;98% случаев позволяет сократить время на передачу файла браузеру. Если хранить архивированные копии файлов сервере (в памяти proxy-сервере или просто на диске), то соединение в общем случае удается освободить в 3&amp;ndash;4 раза быстрее.&lt;/p&gt;&lt;p&gt;В случае высоконагруженных серверов с динамическими HTML-файлами gzip также может применим. Здесь стоит ориентироваться на минимальную степень сжатия, ибо процессорные издержки при это растут линейно, а размер уменьшается лишь логарифмически.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Спорные моменты&lt;/h3&gt;&lt;p&gt;Следующие моменты стоит рассматривать как спорные: они могут как ускорить загрузку ваших сайтов, так и замедлить ее или слишком осложнить процесс разработки.&lt;/p&gt;&lt;h4&gt;Параллельные загрузки&lt;/h4&gt;&lt;p&gt;Создание нескольких зеркал для выдачи статических файлов обычно помогает ускорить загрузку страницы в браузере, но каково при этом приходится серверу? В общем случае, если общее число файлов на странице не превосходит 10, то зеркала применять нецелесообразно. При 10-20 файлах стоит ограничиться лишь одним зеркалом, и лишь если файлов становится несколько десятков, то стоит думать о 2&amp;ndash;3 зеркалах.&lt;/p&gt;&lt;p&gt;Однако, при существовании большого количества файлов (например, картинок) разумнее будет их объединять &amp;mdash; это поможет и серверу и клиенту.&lt;/p&gt;&lt;h4&gt;Все-в-одном-файле&lt;/h4&gt;&lt;p&gt;Технология кроссбраузерного &lt;code&gt;data:URL&lt;/code&gt; позволяет использовать один CSS-файл и для стилевых правил, и для небольших фоновых картинок. Это позволяет избежать использования CSS Sprites и многочисленных обращений для загрузки мелких фоновых изображений.&lt;/p&gt;&lt;p&gt;Однако, данный подход связан с некоторыми технологическими сложностями (необходима дополнительная обработка файлов перед их публикацией на рабочем сервере) и не позволяет осуществлять кеширование отдельных компонентов. В принципе, то же самое можно сказать и о включении CSS-/JS-файлов в HTML-страницу. Решение о таких мерах должно приниматься, исходя из индивидуальных особенностей проекта.&lt;/p&gt;&lt;h4&gt;Обрезание Cookie&lt;/h4&gt;&lt;p&gt;Cookie передаются при каждом запросе браузера на сервер. Иногда их размер может быть весьма значительным и даже превосходить полезный объем информации. К тому же, большое количество значений в заголовке Cookie несет дополнительную нагрузку на серверную логику &amp;mdash; ведь обычно все их нужно проанализировать и переслать обратно браузеру.&lt;/p&gt;&lt;p&gt;Одним из наиболее распространенных вариантов является выделение статических файлов на отдельное зеркало, на которое не передаются Cookie. Однако, этот подход не позволяет, например, показывать изображения только авторизованным пользователям. Отправка пользователю только необходимых cookie также сопряжена с логическими ошибками &amp;mdash; нужно ведь послать определенные cookie всем нужным пользователям и не послать всем ненужным.&lt;/p&gt;&lt;h3&gt;Выводы&lt;/h3&gt;&lt;p&gt;За счет объединения файлов и настройки агрессивного кеширования возможно уменьшение числа первоначальных запросов к серверу в несколько раз, и сведение повторных запросов всего к 1&amp;ndash;2 (если все остальные десятки файлов браузер будет брать из собственного кеша). Это позволит значительно сократить число активных соединений в секунду.&lt;/p&gt;&lt;p&gt;Архивирование также помогает сократить нагрузку на сервер, однако, его нужно использовать более аккуратно, чтобы не навредить слишком большой степенью сжатия или архивированием не тех типов файлов (например, JPEG).&lt;/p&gt;&lt;p&gt;Есть также ряд других методов (параллельные загрузки, все-в-одном, cookie и т.д.), которые могут повлиять на серверную нагрузку. Однако, и все нужно использовать с крайней осторожностью, и большого снижения нагрузки за их счет добиться нельзя.&lt;/p&gt;&lt;p&gt;Спасибо за внимание, буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/41716/#comments</comments></item><item><title>Разгоняем все, что движется</title><link>http://webo.in/articles/rit2008/speed-up-all-movable/</link><guid>http://webo.in/articles/rit2008/speed-up-all-movable/</guid><description>&lt;h3&gt;Оптимизация времени загрузки сайта: проблемы и решения&lt;/h3&gt;&lt;p&gt;Большинство сайтов Рунета работают :) Почти всегда. И почти всегда медленно. Иногда причина этого &amp;mdash; плохой канал связи у конечного пользователя или самого сайта. Но ни веб-разработчики, ни онлайн-маркетологи зачастую не отдают себе отчет, насколько эту ситуацию можно изменить, и изменить кардинально.&lt;/p&gt;&lt;h3&gt;Основные методы&lt;/h3&gt;&lt;p&gt;Сегодня речь пойдет о способах ускорения загрузки сайта. О методах увеличения эффективности сайта как инструмента продаж или оказания услуг, как существенной имиджевой составляющей бренда или просто личного блога. В качестве основных технологических направлений по уменьшению времени загрузки веб-страниц можно выделить следующие:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Уменьшение объема данных: большое число методов по минимизации и архивированию.&lt;/li&gt;&lt;li&gt;Уменьшение числа запросов: основная технология &amp;mdash; CSS Sprites.&lt;/li&gt;&lt;li&gt;Кеширование.&lt;/li&gt;&lt;li&gt;Параллельные загрузки.&lt;/li&gt;&lt;li&gt;Оптимизация JavaScript.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Обзор аудитории&lt;/h3&gt;&lt;p&gt;Основным критерием, который должен определять, какие методы и в каком объеме стоит применять, естественно, будет аудитория ресурса. Для каждого сайта можно выделить несколько характерных групп страниц, которые посещаются тем или иным типом аудитории. В первую группу войдут веб-страницы, на которые заходят всякий раз новые пользователи. Это и специальные рекламные страницы, задачей которых является прямая продажа продукта. Это и страницы объявлений, которые пользователи должны увидеть один, максимум, два раза. И т.д. Аудитория таких страниц на 99,9% состоит из новых пользователей. Следовательно, для них нужно применять методы, снижающие, в первую очередь, число обращений к серверу для показа страницы: объединение файлов и экстремальную оптимизацию.&lt;/p&gt;&lt;p&gt;Во вторую группу войдут страницы, аудитория которых также часто меняется, однако, часть ее может просматривать страницы неограниченное число раз. Для таких страниц можно выделить характерное ядро постоянных посетителей, однако, оно составляет не более 30&amp;ndash;40% от общего числа. Большинство сайтов, которые &amp;laquo;живут&amp;raquo; на поисковом трафике, являются замечательным примером ресурсов, полностью подходящих под эту группу. Для таких сайтов, в первую очередь, стоит рассмотреть методы уменьшения числа запросов (CSS Sprites), также возможную минимизацию всех текстовых файлов (HTML, CSS, JS). Однако, применение кеширование в данном случае оправдано в меньшей степени, так как уменьшит время загрузки страницы не так сильно (если брать средневзвешенное значение), чем, например, параллельные запросы.&lt;/p&gt;&lt;p&gt;Наконец, к третьей группе можно отнести все остальные страницы, а именно те, аудитория которых в большей степени постоянна (конкретные числа стоит рассматривать из параметров монетизации различных групп аудитории, однако, характерные значения здесь &amp;mdash; это 30% постоянных пользователей ресурса). В этой группе наиболее действенным будет, конечно же, кеширование и &lt;a href="http://webo.in/speed/javascipt/"&gt;оптимизация скорости работы JavaScript&lt;/a&gt; и Flash-анимации &amp;mdash; ведь именно она будет &amp;laquo;съедать&amp;raquo; больше всего времени у характерного пользователя такой аудитории.&lt;/p&gt;&lt;h3&gt;Уменьшение объема данных: сжатие и архивирование&lt;/h3&gt;&lt;p&gt;Основными инструментами для уменьшения объема данных являются разнообразные минимизаторы и обфускаторы (для &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;JavaScript-файлов&lt;/a&gt;), архивирование и также ряд утилит для уменьшения размера изображений. Давайте рассмотрим их по порядку.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:76,72,81,79,75,81,76,80,79,79,77,61|5,7,8,18,15,15,17,23,20,21,27,52|77,75,82,82,80,84,79,81,84,83,80,77|4,0,2,11,6,7,8,13,12,13,18,45|77,73,82,81,79,83,78,81,83,82,79,74|8,9,10,18,17,16,20,25,22,23,30,53|78,75,82,82,80,84,79,82,85,83,81,77|78,75,82,81,80,84,79,81,84,83,81,78|15,20,27,24,25,27,28,31,36,30,35,57|18,14,20,23,23,24,27,31,30,30,36,54|79,76,82,82,81,84,80,82,85,84,81,77&amp;amp;chxl=0:|5730|8573|19744|29539|11052|131446|11851|13040|58892|47175|67244|1383|1:||10%|20%|30%|40%|50%|60%|70%|80%|90%|100%&amp;amp;chco=868686,D0EB55,D0EB55,EBD055,EBD055,5539EB,5539EB,55EBD0,55EBD0,D055EB,D055EB&amp;amp;chg=8.33,10&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2,6,3|2|2,6,3|2|2,6,3|2|2|2,6,3|2,6,3|2&amp;amp;chdl=GZIP|CSSMin|CSSMin%2BGZIP|Minify|Minify%2BGZIP|YUI|YUI%2BGZIP|Minifier|Minifier%2BGZIP|CSS%20Tidy|CSS%20Tidy%2BGZIP" class="chart" alt="График сжатия CSS-файлов" title="График сжатия CSS-файлов"/&gt;&lt;p&gt;Как показало проведенное тестирование средств &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;сжатия CSS&lt;/a&gt;, лучше всего с этой задачей справляется проект CSS Tidy (примерно на одном уровне с ним идет YUI Compressor), который вместе с дополнительным архивированием файлов позволяет получить выигрыш до 85%.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:43,54,60,69,71,74,70,73,77,77,82,70|1,0,0,0,0,0,17,23,30,26,35,45|43,54,60,70,71,74,75,77,83,81,85,84|1,0,0,0,0,0,17,23,30,25,34,45|44,54,60,70,71,74,75,77,83,81,85,84|0,0,0,0,0,0,11,27,31,30,36,47|43,53,59,69,71,74,74,76,81,79,84,83|13,47,52,69,71,73,72,76,83,82,81,84|0,9,15,35,34,41,32,53,61,60,56,68|1,0,6,0,0,19,18,35,41,41,40,45|44,54,61,69,71,76,74,79,84,83,86,84&amp;amp;chxl=0:|853|9580|5857|43099|83879|39686|21414|22015|289446|124136|8867|95285|1:||10%|20%|30%|40%|50%|60%|70%|80%|90%|100%&amp;amp;chco=868686,D0EB55,D0EB55,EBD055,EBD055,5539EB,5539EB,55EBD0,55EBD0,D055EB,D055EB&amp;amp;chg=8.33,10&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2,6,3|2|2,6,3|2|2,6,3|2|2|2,6,3|2,6,3|2&amp;amp;chdl=GZIP|JSMin|JSMin%2BGZIP|Minify|Minify%2BGZIP|Rhino|Rhino%2BGZIP|Packer|Packer%2BGZIP|YUI|YUI%2BGZIP" alt="График сжатия JS-файлов" title="График сжатия JS-файлов" class="chart"/&gt;&lt;p&gt;Для JavaScript-файлов ситуация несколько интереснее. Если применять архивирование, то лучше всего использовать &lt;a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow" lang="en"&gt;YUI Compressor&lt;/a&gt;, так как он, в среднем, сжимает в этом случае лучше. Если архивирование для JS-файлов применять нельзя, то лидером в сжатии является &lt;a href="http://dean.edwards.name/packer/" rel="nofollow" lang="en"&gt;Dean Edwards Packer&lt;/a&gt;, однако, он вносит дополнительные издержки на свою &lt;a href="http://webo.in/articles/habrahabr/20-javascript-libraries-load-time/"&gt;&amp;laquo;распаковку&amp;raquo;&lt;/a&gt;. &lt;a href="http://webo.in/articles/habrahabr/20-javascript-libraries-load-time/"&gt;Как показали исследования&lt;/a&gt;, для пользователей, которые будут, в основном, загружать JavaScript из кеша, лучше использовать &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;сжатие без обфускации&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Использование архивирования через &lt;a href="http://webo.in/articles/all/mod-gzip-minify-on-fly/"&gt;&lt;code&gt;mod_gzip&lt;/code&gt;&lt;/a&gt; для Apache способно существенно уменьшить размер загружаемых файлов. Однако, в случае очень быстрого канала у пользователей (например, локальный ресурс) и ограниченных ресурсов сервера (высокая удельная нагрузка на создание страницы) будет разумнее &lt;a href="http://webo.in/articles/habrahabr/30-gzip-versus-broadband/"&gt;сжатие не использовать&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:0,1,1,3,6,12,23,47,94|0,0,0,1,1,3,6,11,22|0,0,0,0,0,1,2,3,6|0,0,0,0,0,1,2,3,6&amp;amp;chxl=0:|500%D0%B1|1000%D0%B1|2000%D0%B1|4000%D0%B1|8000%D0%B1|16000%D0%B1|32000%D0%B1|64000%D0%B1|128000%D0%B1|1:||20%D0%BC%D1%81|40%D0%BC%D1%81|60%D0%BC%D1%81|80%D0%BC%D1%81|100%D0%BC%D1%81|120%D0%BC%D1%81&amp;amp;chco=D0EB55,5539EB,55EBD0,EBD055&amp;amp;chg=8.33,16.66&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2|2&amp;amp;chdl=100Kb%20Transfer|280MHz%20GZIP|1500Kb%20Transfer|1000MHz%20GZIP" alt="Накладные издержки на сжатие и передачу информации для 100Кб и 1500Кб и 280МГц и 1000МГц" title="Накладные издержки на сжатие и передачу информации для 100Кб и 1500Кб и 280МГц и 1000МГц" class="chart"/&gt;&lt;p&gt;Также стоит для архивированных файлов добавить соответствующие заголовки (&lt;code&gt;Cache-Control:private&lt;/code&gt;), чтобы избежать ряда проблем с кеширующими прокси-серверами. Для архивирования CSS- и JS-файлов также нужно исключить Safari и Konqueror из тех браузеров, которым можно отправлять gzip-файлы: эти браузеры до последнего времени не умели их корректно распознавать.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/26-speed-up-images-png-versus-gif/"&gt;Уменьшение размера изображений&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для большинства графических элементов рекомендуется использовать формат PNG, так как он более экономичен, чем GIF. Однако, для небольших изображений GIF-формат может оказаться лучше. На данный момент PNG-изображения поддерживаются, практически, всеми браузерами, поэтому вы ничего не потеряете, если будете использовать его.&lt;/p&gt;&lt;p&gt;Сейчас существует проблема с поддержкой альфа-канала в Internet Explorer (которую уже исправили в 7 версии), однако, в версиях ниже 7 (5.5 и 6) она решается через &lt;code&gt;ImageAlphaLoader&lt;/code&gt; (с помощью &lt;a href="http://webo.in/articles/habrahabr/10-css-expressions-optimization/"&gt;CSS expressions&lt;/a&gt;, CSS хаков или JavaScript), что позволяет использовать полупрозрачность, практически, в полном объеме.&lt;/p&gt;&lt;p&gt;В случае проблем с совпадением цветом (опять-таки в Internet Explorer) рекомендуется удалить из изображения gamma-чанков. В этом также может помочь ряд утилит, уменьшающих размер PNG-изображений: например, &lt;a href="http://pmt.sourceforge.net/pngcrush/" rel="nofollow" lang="en"&gt;&lt;code&gt;pngcrush&lt;/code&gt;&lt;/a&gt;. Для уменьшения размера JPG-изображений можно применить утилиту &lt;a href="http://linux.about.com/library/cmd/blcmdl1_jpegtran.htm" rel="nofollow" lang="en"&gt;&lt;code&gt;jpegtran&lt;/code&gt;&lt;/a&gt;, которая не затрагивает цветовые данные изображения, а удаляет комментарии и другие мета-данные.&lt;/p&gt;&lt;p&gt;Для анимированных изображений стоит использовать либо GIF-изображения с несколькими кадрами, либо DHTML-анимацию (JavaScript + PNG/JPEG).&lt;/p&gt;&lt;h3&gt;Семантическая верстка&lt;/h3&gt;&lt;p&gt;Когда разговор заходит про уменьшение размера кода, очень часто забывают про переход на семантическую разметку вместо табличной. Однако, она способна уменьшить не только время разработки backend-логики за счет более прозрачной структуры блоков, но и &amp;laquo;облегчить&amp;raquo; frontend-часть, сократив размер HTML примерно на 30%.&lt;/p&gt;&lt;p&gt;Сразу хочу заметить, что строгое следование семантике может отрицательно сказаться на размере кода, поэтому вам придется решить, что для вас важнее: поддержка последних тенденций (например, из мира микроформатов) или &lt;a href="http://webo.in/speed/"&gt;скорость загрузки страницы&lt;/a&gt;, например, интернет-магазина. Возможно, в ряде случаев будет разумно применить более простую спецификацию, сократив тем самым общее количество тегов и размер картинок (для CSS Sprites).&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/16-optimization-page-load-time/"&gt;Уменьшение числа запросов&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для уменьшения числа запросов при загрузке страницы применяют, в основном, техники слияния, адаптированные под разные типы данных. Например, для &lt;a href="http://webo.in/articles/habrahabr/02-delay-loading-stylesheets/"&gt;объединения CSS-файлов&lt;/a&gt; в один стоит использовать конструкцию&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;@media тип {селекторы для этого типа}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;например,&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;@media print {.nonprintable{display:none}}.&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Для уменьшения числа JS-файлов у нас гораздо больше простора для фантазии. Можно просто создать один большой файл со всеми используемыми вызовами и библиотеками. Можно создать один внешний файл, который будет загружать библиотеки по мере необходимости. А можно с помощью комбинированного обработчика событий &lt;code&gt;window.onload&lt;/code&gt; начать загрузку всех необходимых файлов сразу по получению HTML-кода.&lt;/p&gt;&lt;p&gt;Используя технику &amp;laquo;ненавязчивый&amp;raquo; JavaScript можно добиться существенного визуального ускорения при загрузке сложного интерфейса или веб-страниц с нетривиальной логикой.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS Sprites&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Наиболее популярной техникой для объединения изображений является CSS Sprites (или CSS Image maps), когда для отображения нескольких (десятков или даже сотен) изображений используется один ресурсный файл. Она дает ощутимый выигрыш в &lt;a href="http://webo.in/"&gt;скорости загрузки&lt;/a&gt; при использовании анимационных эффектов (например, смене изображения при наведении мыши), а также при большом количестве иконок на странице.&lt;/p&gt;&lt;p&gt;В качестве основных рекомендаций при создании ресурсных файлов для CSS Sprites можно назвать следующие:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Разбиение всех изображений на 5 основных групп (не рекомендуется использовать в одном файле изображений из более, чем 2 групп):&lt;ul&gt;&lt;li&gt;Изображения, повторяющиеся по всем направлениям (&lt;code&gt;repeat&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, повторяющиеся по горизонтали (&lt;code&gt;repeat-x&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, повторяющиеся по вертикали (&lt;code&gt;repeat-y&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, которые не повторяются (&lt;code&gt;no-repeat&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;И анимированные изображения.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Размер файлов должен быть не более 10&amp;ndash;20 Кб.&lt;/li&gt;&lt;li&gt;Объединение близких по цветовой гамме изображений.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Если у вас на странице выводится много небольших изображений, возможно, стоит воспользоваться техникой Image Map, чтобы сократить их количество.&lt;/p&gt;&lt;h3&gt;Экстремальная оптимизация&lt;/h3&gt;&lt;p&gt;Под экстремальной оптимизацией я понимаю максимальное уменьшение размера файлов и их количества, может быть, даже в ущерб браузерной совместимости.&lt;/p&gt;&lt;p&gt;В качестве характерного примера использования таких техник можно примести главные страницы &lt;a href="http://yandex.ru/" rel="nofollow"&gt;Яндекса&lt;/a&gt; и &lt;a href="http://www.yahoo.com/" rel="nofollow"&gt;Yahoo!&lt;/a&gt;, на которых CSS- И JS-файлы кроме стандартной минимизации еще и включены в итоговый HTML-код, а сам HTML отдается в виде gzip-архивов.&lt;/p&gt;&lt;p&gt;Логическим продолжением в данном случае будет использование схемы &lt;code&gt;data:URL&lt;/code&gt; и base64-кодирования для подключения фоновых и обычных изображений. Результирующий размер gzip-файла увеличится на 5&amp;ndash;10% (от размера изображения), однако, при этом удастся сэкономить один запрос к серверу. С помощью несложных вычислений можно подсчитать, при каком размере файла это рационально применять.&lt;/p&gt;&lt;p&gt;Однако, Internet Explorer не поддерживает эту технику (до версии 7 включительно). Для него можно использовать специальные хаки (в том числе, &lt;code&gt;* html&lt;/code&gt;), условные комментарии или mhtml-схему, которая обеспечивает, практически, ту же функциональность, что и &lt;code&gt;data:URL&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/all/http-caching/"&gt;Кеширование&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Основной техникой для ускорения загрузки страницы для постоянных посетителей является кеширование, которое может свести число запросов к серверу для отображения страницы к минимуму (в идеале, к нулю). Здесь стоит помнить о корректной настройке заголовка &lt;code&gt;Cache-Control&lt;/code&gt;. Для сброса кеша всегда можно воспользоваться дополнительным параметром в GET-запросе к ресурсу, который заставит сервер взять тот же физический файл, а клиентский браузер запросить файл и сохранить его под новым именем. Для статических ресурсов стоит выставлять достаточно большой срок кеша (можно экспериментировать со значения от месяца), для остальных файлов это значение должно быть равно среднему времени изменения либо вообще отсутствовать (для HTML-файлов, например).&lt;/p&gt;&lt;p&gt;В качестве дополнительного кеширующего аргумента можно использовать уникальные идентификаторы ресурсов (ETag). Они позволяет серверу не отдавать файл заново даже при закончившемся времени кеширования, а просто его продлять. Однако, существует ряд проблем с распределением файлов по разным физическим серверам и настройке на них идентичных ETag, но это, скорее, относится к уже очень большим системам.&lt;/p&gt;&lt;h3&gt;Параллельные загрузки&lt;/h3&gt;&lt;p&gt;Для уменьшения удельного времени ответа от сервера при загрузке большого числа файлов можно разделить загрузку на несколько потоков (серверов). Сами сервера для такой цели (быстрой отдачи статических ресурсов) лучше настраивать под &amp;laquo;легким&amp;raquo; окружением (например, nginx). В качестве балансирующего параметра можно рассматривать как распределение по географическому принципу (например, кластеры в США, Европе, Азии), так и по нагрузке (пул свободных серверов определяется каждый раз при загрузке страницы). Также возможно использование балансировки на клиенте для достижения того же эффекта.&lt;/p&gt;&lt;p&gt;В качестве основных проблем стоит отметить необходимости создания хеш-функции от имени файла, чтобы один и тот же файл загружался только с одного сервера, иначе браузер будет запрашивать его с серверов-зеркал, пока не забьет кеш всеми его копиями. Также стоит ограничиться 4 хостами (для большого числа файлов), для небольшого (15&amp;ndash;25) стоит использовать не более 3. 2 хоста разумно использовать, только если число файлов превосходит 10 из-за дополнительных расходов на распознавание имени в DNS-таблице.&lt;/p&gt;&lt;h3&gt;Оптимизация JavaScript&lt;/h3&gt;&lt;p&gt;Чуть ранее я уже упоминал про возможность загружать необходимые для отображения страницы JavaScript-файлы, фактически, после ее загрузки. Однако, есть еще и пара нюансов. Например, ваш сайт должен полностью функционировать и без JavaScript (должны осуществляться переходы по ссылкам, первоначальный вид страницы должен формироваться на сервере). Это позволит повысить индексируемость сайта и обезопасит тех пользователей, у которых ваши скрипты не работают по тем или иным причинам.&lt;/p&gt;&lt;p&gt;Используйте возможности CSS по максимуму. Вы не сможете отобразить страницу в браузере лучше, чем сам браузер, поэтому оставьте всю тяжелую работу по рендерингу для него (это относится к анимационным эффектам при наведении на кнопки, изменению разметки при изменении размеров окна и т.д.). CSS-движок, в среднем, работает быстрее, чем JavaScript. Также посоветую избегать использования CSS expressions либо оптимизировать их, чтобы они исполнялись только один раз на странице.&lt;/p&gt;&lt;p&gt;Обновляйте DOM-дерево большими кусками. DOM-Обращения ресурсоемки, это почти как база данных для серверных приложений. Чем меньше будет у вас работы с DOM, тем быстрее будет ваш JavaScript. Отдельное слово по поводу обработчиков событий: сводите их количество к минимуму. В идеале, стоит повесить один-единственный &lt;code&gt;onclick&lt;/code&gt; на &lt;code&gt;&amp;laquo;body&amp;raquo;&lt;/code&gt; и обрабатывать уже источник клика. Если вам требуются менее глобальные эффекты &amp;mdash; просто ограничьтесь одним обработчиков на блоке, в котором заключена требуемая область. Большое количество обработчиков событий (которые еще и забывают убирать из изменении HTML-кода на странице) приводит к &lt;a href="http://webo.in/articles/habrahabr/18-solving-internet-explorer-memory-leaks/"&gt;утечкам памяти в IE&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;И несколько общих советов: кешируйте глобальные переменные в локальные (однако, тут могут быть нюансы, особенно с &lt;a href="http://webo.in/articles/habrahabr/28-chain-javascript-calls-optimization/"&gt;цепочками вызовов функций&lt;/a&gt;), избегайте использовать &lt;code&gt;eval&lt;/code&gt; и &lt;code&gt;setTimeout&lt;/code&gt; / &lt;code&gt;setInterval&lt;/code&gt; (которые выполняют &lt;code&gt;eval&lt;/code&gt; на передаваемую в качестве аргумента строку). Вместо этого можно использовать анонимные функции.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(function(){ ... }())&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;При осуществлении тяжелых вычислений (например, подгрузка данных или сортировка больших массивов) стоит &lt;a href="http://webo.in/articles/habrahabr/13-cpu-intensive-javascript/"&gt;обновлять интерфейс пользователя&lt;/a&gt;, чтобы он знал, что выполняются какие-то действия, и мог немного подождать. Однако, тут главное не переусердствовать с уведомлениями: ведь каждое обновление страницы занимает некоторое время, и накладные издержки на него могут оказаться много больше &amp;laquo;полезного&amp;raquo; времени.&lt;/p&gt;&lt;h3&gt;Действенность методов&lt;/h3&gt;&lt;p&gt;Что же из всего вышеперечисленного больше всего влияет на скорость загрузки? Как я уже упоминал, это сильно зависит от типа оптимизируемых страниц, однако, можно выделить некоторые общие тенденции. Так, кеширование позволяет снизить время загрузки страницы вплоть до нуля (чтобы она полностью загружалась из браузерного кеша пользователя, а ведь на ней может быть реклама, которую пользователь увидит, не заходя физически к вам на сайт).&lt;/p&gt;&lt;p&gt;Использование нескольких серверов для параллельных запросов способно уменьшить время загрузки на где-то 85%, использование CSS Sprites &amp;mdash; на 60%. Объединение текстовых файлов и их минимизация, в среднем, дает 40% выигрыш (однако, если у вас сложное веб-приложение, в котором функционирует десятки JavaScript-библиотек, то такая техника способно в разы ускорить его работу).&lt;/p&gt;&lt;p&gt;Оптимизация изображений уменьшает их удельный вес примерно на 30%. Если вы займетесь оптимизацией JavaScript-кода и вызовов функций, то сэкономите около 20%. Семантическая верстка способна уменьшить время загрузки только лишь на 10% (это связано с тем, что удельный вес HTML-кода в объеме страницы очень мал, поэтому больший выигрыш дает простое архивирование).&lt;/p&gt;&lt;p&gt;Что дадут оптимизационные мероприятия вашему бизнесу? По данным Yahoo! замедление страниц Google на 500мс приводит к 20% потере трафика, для Amazon 100мс обходятся в 1% продаж. Недавно проведенная оптимизация главной страницы европейского сайта &lt;a href="http://eu.acronis.com/" rel="nofollow"&gt;Acronis&lt;/a&gt; (время загрузки было уменьшено почти в 5 раз) привело примерно к 5% росту продаж и такому же увеличению трафика на внутренние страницы.&lt;/p&gt;&lt;p&gt;Также оптимизационные мероприятия позволили ускорить загрузку сайта &lt;a href="http://www.pmexpert.ru/" rel="nofollow"&gt;www.pmexpert.ru&lt;/a&gt; в 2,8 раза, а &lt;a href="http://www.creative.su/"&gt;www.creative.su&lt;/a&gt; в 2,6 раза&lt;/p&gt;&lt;h3&gt;Профилирующие инструменты для &lt;a href="http://webo.in/"&gt;оптимизации&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Лучшим в своем классе профилирующим инструментом для &lt;a href="http://webo.in/speed/complex/"&gt;оценки скорости загрузки сайта&lt;/a&gt; а анализа узких мест является &lt;a href="http://webo.in/articles/rit2008/speed-up-all-movable/https://addons.mozilla.org/ru/firefox/addon/5369" rel="nofollow" lang="en"&gt;Yslow&lt;/a&gt; под &lt;a href="http://webo.in/articles/rit2008/speed-up-all-movable/https://addons.mozilla.org/ru/firefox/addon/1843" rel="nofollow" lang="en"&gt;Firebug&lt;/a&gt; для &lt;a href="http://www.mozilla.com/en-US/firefox/" lang="en" rel="nofollow"&gt;Firefox&lt;/a&gt;). С помощью него можно установить и отладить, практически, все, что требуется для ускорения загрузки сайта. Основным его минусом является невозможность посмотреть, как именно происходит загрузка из кеша и, естественно, распространение только под Firefox (хотя, может быть, это является и плюсом).&lt;/p&gt;&lt;p&gt;Недавно &lt;a href="http://www.aol.com/" rel="nofollow" lang="en"&gt;AOL&lt;/a&gt; выпустило &lt;a href="http://pagetest.wiki.sourceforge.net/" rel="nofollow" lang="en"&gt;PageTest&lt;/a&gt; для Internet Explorer'а (6 и 7), который также позволяет увидеть диаграмму загрузки сайта, однако, не выдает таких развернутых советов, как YSlow. Для нахождения утечек памяти и замыканий под IE можно воспользоваться &lt;a href="http://outofhanwell.com/ieleak/index.php?title=Main_Page" rel="nofollow" lang="en"&gt;Drip&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jsunit.net/" rel="nofollow" lang="en"&gt;JsUnit&lt;/a&gt; предоставляет мощный framework для тестирования и отладки ваших JavaScript-приложений. С помощью &lt;a href="http://research.microsoft.com/projects/ajaxview/" rel="nofollow" lang="en"&gt;AjaxView&lt;/a&gt; можно проксировать и анализировать &lt;a href="http://webo.in/articles/habrahabr/23-high-performance-ajax-applications/"&gt;AJAX-запросы&lt;/a&gt;. Для профессионального профилирования веб-приложений стоит воспользоваться &lt;a href="http://rockstarapps.com/pmwiki/pmwiki.php?n=JsLex.JsLex" rel="nofollow" lang="en"&gt;JsLex&lt;/a&gt;, а время выполнения различных операций на странице можно замерить с помощью &lt;a href="http://developer.yahoo.com/yui/profiler/" rel="nofollow" lang="en"&gt;YUI Profiler&lt;/a&gt;. Но не забывайте, что лучшей проверкой ваших приложений на прочность всегда был и остается пользователь.&lt;/p&gt;&lt;p&gt;Наконец, пара слов об онлайн-инструментах. Пожалуй, самым старым и профессиональным можно назвать &lt;a href="http://www.websiteoptimization.com/"&gt;WebSiteOptimizator&lt;/a&gt;, который получает данные о всех требуемых для загрузки страницы файлах и выдает ряд советов по оптимизации времени загрузки. Также есть ряд сервисов (&lt;a href="http://www.octagate.com/service/SiteTimer/" rel="nofollow" lang="en"&gt;OctaGate SiteTimer&lt;/a&gt; и &lt;a href="http://tools.pingdom.com/fpt/" rel="nofollow" lang="en"&gt;Pingdom Tools&lt;/a&gt;), которые отображают диаграмму загрузки сайта в режиме онлайн. Однако, на них практически отсутствуют советы по &lt;a href="http://webo.in/"&gt;оптимизации скорости загрузки&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;В отличие от вышеуказанных инструментов, &lt;a href="http://webo.in/"&gt;Web Optimizator&lt;/a&gt; позволяет как получить сведения о всех загружаемых файлах и большое количество подробных советов (что же с этими файлами можно и нужно сделать) так и посмотреть, как эти файлы будут загружаться в различных браузерах. И что более важно, применять ряд оптимизационных методов &amp;laquo;не отходя от кассы&amp;raquo;, т.е. прямо на диаграмме загрузки. При этом не нужно ничего настраивать на сервере и проверять, уменьшится ли время загрузки после определенных действий или нет &amp;mdash; все можно осуществить в режиме онлайн.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blog/client_side_optimization/33670/#comments</comments></item><item><title>Скорость имеет значение</title><link>http://webo.in/articles/ok2009/speed-matters/</link><guid>http://webo.in/articles/ok2009/speed-matters/</guid><description>&lt;h3&gt;Проблема медленных сайтов реальна&lt;/h3&gt;&lt;p&gt;С каждым годом Интернет растет вширь и вглубь. Увеличивается пропускная способность каналов, пользователи переходят с коммутируемого доступа на безлимитный. Сайты становятся больше по размеру, больше по наполнению и сложнее во взаимодействии. Размеры загружаемых файлов при этом увеличиваются многократно, а время ожидание пользователей не уменьшается.&lt;/p&gt;&lt;h3&gt;Рост Интернета&lt;/h3&gt;&lt;p&gt;За последние 5 лет средний размер веб-страниц вырос втрое (по данным исследования Akamai), а за последний год &amp;mdash; в полтора раза (по данным &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt;). При этом каждая страница использует в среднем по 50 объектов, что крайне негативно сказывается на общем времени загрузки. Только порядка 5-10% от общего времени загрузки приходится на серверную часть. Все остальное составляет именно клиентская архитектура.&lt;/p&gt;&lt;h3&gt;Белый экран в браузере&lt;/h3&gt;&lt;p&gt;Сколько времени вы готовы смотреть на белый экран в браузере прежде, чем сайт загрузится? 75% посетителей уйдут после 10 секунд. При этом наиболее характерным временем будет 4 секунды: если за это время сайт загружается у 90% пользователей, то вы счастливый владелец быстрого интернет-ресурса.&lt;/p&gt;&lt;p&gt;Однако и здесь дорога каждая миллисекунда. Недаром высоконагруженные проекта типа Google, Amazon, Flickr, Netflix, Яндекс, вКонтакте и Одноклассники так серьезно подходят к вопросу скорости загрузки сайтов. За каждым потерянным моментом времени кроется определенная сумма денег. Это именно то место, где время тождественно равно деньгам.&lt;/p&gt;&lt;h3&gt;В чем проблема?&lt;/h3&gt;&lt;p&gt;Основное время при загрузке страницы уходит именно на клиентскую часть. Серверные затраты обычно крайне малы и составляют от 50 до 500 мс. Среднему пользователю на самом деле абсолютно все равно, сколько страница будет создаваться на сервере, если он ее увидит через полсекунды. В этом случае фокус смещается именно на клиентскую, а не серверную оптимизацию.&lt;/p&gt;&lt;p&gt;Характер проблем варьируется от сайта к сайту. Иногда он заключается в особенности интернет-подключения основной массы пользователей ресурса (например, если широко используются модемы). Иногда &amp;mdash; в сложности самого сайта и неоправданном использовании ресурсов сети. Иногда &amp;mdash; в неграмотном использовании клиентских технологий и большого количества разнородных решений. Но все эти проблемы можно решить.&lt;/p&gt;&lt;h3&gt;Кто виноват и что делать?&lt;/h3&gt;&lt;p&gt;Для решения описанных проблем прежде всего нужно начинать с профессионального подхода при разработке какого-либо веб-приложения. Он обязательно должен опираться на использование веб-стандартов, в том числе и в области скорости загрузки и взаимодействия с пользователем.&lt;/p&gt;&lt;p&gt;Для полноценной оптимизации крупные компании разрабатывают специализированные решения. Однако даже в этом случае они опираются на многочисленный свод правил, описывающих наиболее оптимальное взаимодействие браузера с пользователем. Для среднего размера сайтов, использующих какое-либо стандартное решение для обслуживания контента, стоит обратить свое внимание на решения по автоматизации клиентской оптимизации.&lt;/p&gt;&lt;p&gt;Это &lt;a href="http://getrpo.com/" rel="nofollow"&gt;GetRPO.com&lt;/a&gt;, который направлен на сайта на базе сервера IIS. Для Apache и PHP существует два аналогичных решения: &lt;a href="http://aciddrop.com/php-speedy/" rel="nofollow"&gt;PHP Speedy&lt;/a&gt; (как плагин для Wordpress и Joomla!) и &lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; (как отдельное веб-приложение). Каждое из описанных решений позволяет свести затраты на внедрение оптимизации к минимуму и получить весьма неплохой результат для показателя скорости загрузки страницы.&lt;/p&gt;&lt;p&gt;Наконец при разработке сайтов стоит руководствоваться принципом &amp;laquo;мягкой деградации&amp;raquo;, согласно которому нужно наращивать функциональность в зависимости от способности браузера, а не наоборот. Например, можно использовать самые передовые технологии при верстке, которые поддерживаются не очень большим числом браузером, но должны поддерживаться значительной их долей, скажем, через год. Тогда определенные решения будут выглядеть безупречно у небольшого числа пользователей, у остальных &amp;mdash; хорошо или приемлемо. Но с прогрессом интернета число последних будет стремительно уменьшаться.&lt;/p&gt;&lt;p&gt;Напоследок стоит упомянуть про возможность использования распределенной сети серверов для сведения времени ответа к минимуму. В этом могут помочь существующие системы &amp;laquo;облачных&amp;raquo; вычислений, такие как: AMazon S3, Google Apps, Microsoft Azure. Также аналогичная система есть и на российских просторах. Это первая в России CDN &amp;mdash; &lt;a href="http://ngenix.net/"&gt;NGENIX&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Потенциал ускорения&lt;/h3&gt;&lt;p&gt;Как показывает практика, средний сайт в Рунете можно достаточно легко ускорить в 3-5 раза. И при этом не нужно быть гением в клиентской оптимизации &amp;mdash; достаточно применить ряд широко известных советов.&lt;/p&gt;&lt;p&gt;Все эти советы с детальным анализом эффективности, а также большое количество прикладного и новаторского материала приведено в первой в России специализированной книге, посвященной всем тонкостям клиентской оптимизации &amp;mdash; &lt;a href="http://speedupyourwebsite.ru/books/speed-up-your-website/"&gt;&amp;laquo;Разгони свой сайт&amp;raquo;&lt;/a&gt;. В книге описаны все тонкости архивирования и кэширования, объединения и разъединения файлов, а также особенности оптимизации CSS- и JavaScript-логики. На данный момент продается во всех больших книжных магазинах Москвы и доступна через ряд интернет-магазинов, например, &lt;a href="http://www.ozon.ru/context/detail/id/4400714/" rel="nofollow"&gt;ozon.ru&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/58052/#comments</comments></item><item><title>Быстрый сайт - это больше, чем хороший сайт</title><link>http://webo.in/articles/oborot2009/faster-means-better/</link><guid>http://webo.in/articles/oborot2009/faster-means-better/</guid><description>&lt;h3&gt;Скорость как основной критерий качества интернет-магазина&lt;/h3&gt;&lt;p&gt;Давайте рассмотрим основные критерии качества интернет-магазина. Здесь намеренно не упоминаются методы привлечения трафика: они составляют отдельную группу характеристик.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Соответствие заложенной нагрузке.&lt;/strong&gt; Сайт может хорошо справляться с 1 просмотром страницы в секунду, но не выдерживать и 3 одновременных посетителей. Здесь нужно хорошо понимать, что при заявленной разработчиками посещаемости в 10000 человек ежедневно, такой сайт может быть способен выдавать не более 30-50 тысяч просмотров, что говорит о времени создания страницы порядка секунды или даже больше. В таких условиях рассчитывать на такой сайт, как на эффективный механизм онлайн-маркетинга не приходится.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Соответствие стандартам.&lt;/strong&gt; Стандартные решения легче разрабатывать и поддерживать. Стандартный код имеет большую совместимость с текущими (и будущими) версиями браузеров. Также соответствие стандартов говорит о высокой культуре разработки при создания сайта, поэтому в большинстве случаев стандартный сайт еще и более качественный.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Удобство использования.&lt;/strong&gt; Если сайт запутанный, пугающий или просто неудобный, то им, естественно, пользоваться не будут. Простейшую проверку удобства использования можно провести среди ваших знакомых, друзей и подчиненных: попросите их выполнить с помощью сайта какую-либо задачу и смотрите на результат. Особенно важно спрашивать, какие чувства у испытуемого при выполнении это задачи: это поможет глубже понять целевую аудиторию.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Решение бизнес-задач владельца.&lt;/strong&gt; Сайт может быть быстрым, качественным, удобным, но не решать основные задачи. Например, на сайте элитной недвижимости не будет контактов обратной связи. Или на сайте интернет-магазина будут отсутствовать кнопки "Купить" или "В корзину". Решение задач бизнес &amp;mdash; это существенное условие качественного сайта.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Существующие стандарты&lt;/h3&gt;&lt;p&gt;Большая часть веб-технологий уже покрыта стандартами: это, в первую очередь, RFC, описывающие протоколы, и рекомендации W3C, которые уже давно стали стандартами в мире клиентских технологий. Также широко распространено сертифицирование по серверным языкам программирования: квалификация разработчиков может быть проверена достаточно путями.&lt;/p&gt;&lt;p&gt;Сложнее дело обстоит с удобством использования сайта (здесь стандартом пока крайне мало, и все они относятся к области доступности) и скоростью загрузки (здесь же есть общее положение по отрасли, которое и формирует нормальные или стандартные показатели).&lt;/p&gt;&lt;h3&gt;Скорость загрузки как стандарт&lt;/h3&gt;&lt;p&gt;Теперь перейдем к основным сформировавшимся в отрасли на текущий момент показателям скорости загрузки. В первую очередь, это время создании страницы на сервере, оно не должно превышать 0,5с. Затем идет достаточно характерный параметр: время появления в браузер хотя бы какого-то изображения сайта. Пользователи не склонны ждать много больше более 1 секунды в неизвестности, если заходят на качественный сайт. Поэтому &amp;laquo;белый экран&amp;raquo; в браузере рекомендуется показывать также не более 0,5с. Это стадия предварительной загрузки страницы.&lt;/p&gt;&lt;p&gt;Далее пользователь пытается освоится на сайте, и загрузка может продолжаться в интерактивном режиме. Однако полное время загрузки страницы не должно превышать 4 секунд: именно такой сейчас характерный порог ожидания пользователя. Если сайт загружается много дольше, то пользователь будет склонен покинуть его и искать альтернативу (а их сейчас очень много).&lt;/p&gt;&lt;p&gt;Для сравнения: по итогам последнего исследования Akamai характерное время загрузки страницы для западных пользователей &amp;mdash; 2 секунды, в два раза меньше.&lt;/p&gt;&lt;h3&gt;Скорость загрузки как критерий&lt;/h3&gt;&lt;p&gt;Быстрые сайты кажутся пользователям более качественными и красивыми (это подтверждено многочисленными исследованиями). Пользователи склонны больше доверять быстрому интернет-магазину (впечатление от скорости работы сайта будет распространяться и на мнение о скорости, например, доставки или ответа на запросы). По исследования Google и Microsoft увеличение времени ожидания пользователя приводит к снижению конверсию посещений.&lt;/p&gt;&lt;p&gt;Какие же реальные цифры? На основе нашего опыта интеграции решений для ускорения сайтов мы можем сказать следующее:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;увеличение скорости на 100% приводит к 5% росту продаж,&lt;/li&gt;&lt;li&gt;на 200% &amp;mdash; к 10% росту,&lt;/li&gt;&lt;li&gt;на 300% &amp;mdash; к 12% росту.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Скорость имеет значение и может быть подсчитана! Вот характерный график внедрения простых методов ускорения сайта (приведено число просмотров страницы на пользователя):&lt;/p&gt;&lt;p&gt;&lt;img src="http://i.webo.in/web-optimizer/web.optimizer.results.png" alt="Результаты внедрения Web Optimizer"/&gt;&lt;/p&gt;&lt;h3&gt;Проверяем скорость&lt;/h3&gt;&lt;p&gt;Для проверки серверной стороны существует инструмент &lt;a href="http://host-tracker.com/" rel="nofollow"&gt;host-tracker.com&lt;/a&gt;, с помощью которого можно установить характерное время доступа к сайту из различных точек земного шара. Также он позволяет оценить характерное время создания страницы на сервере (если минимальное время доступа к сайту больше 1с, то уже стоит бить тревогу).&lt;/p&gt;&lt;p&gt;Для проверки отказоустойчивости сайта стоит воспользоваться сервисом &lt;a href="http://www.loadimpact.com/" rel="nofollow"&gt;Load Impact&lt;/a&gt;. Бесплатный анализ позволяет проверить до 50 одновременных посещений (каждое из которых может открывать несколько десятков страниц на сайте). Основным показателем устойчивости сайта к нагрузкам будет вид кривой, который получится после проведения теста. Если график ровный или время открытия страницы несколько падает при росте посещаемости &amp;mdash; значит, с сайтом все нормально. Если нет, то нужно принимать решение об оптимальном потоке посетителей, которых сайт сможет обслужить.&lt;/p&gt;&lt;p&gt;&lt;img src="http://webo.in/articles/site2009/website-quality/loadimpact.png" alt="Проверка с помощью LoadImpact"/&gt;&lt;/p&gt;&lt;p&gt;Для проверки качества скорости загрузки клиентской составляющей можно воспользоваться либо YSlow под Firebug для Firefox (оценка должна быть не менее 80, лучше всего не менее 90). Или же бесплатным инструментом &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; (простая оценка не ниже 70, лучше не ниже 80).&lt;/p&gt;&lt;h3&gt;На что влияет скорость&lt;/h3&gt;&lt;p&gt;Скорость загрузки оказывает ключевое влияние на доступность сайта (больше психологическую, чем фактическую), активность пользователей на сайте (медленными сайтами люди предпочитают не пользоваться) и его конверсию (медленным сайтам не доверяют).&lt;/p&gt;&lt;p&gt;Сейчас на рынке существует несколько решений, позволяющих автоматизировать ускорение сайта на клиентском уровне. Для ASP.NET &amp;mdash; это &lt;a href="http://www.aptimize.com/" rel="nofollow"&gt;Aptimize&lt;/a&gt;, для систем на базе PHP &amp;mdash; это &lt;a href="http://www.web-optimizer.ru/"&gt;Web Optimizer&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/71290/#comments</comments></item><item><title>Нативные события в браузерах</title><link>http://webo.in/articles/livejournal/01-native-browser-events/</link><guid>http://webo.in/articles/livejournal/01-native-browser-events/</guid><description>&lt;p&gt;&lt;em&gt;Примечание от sunnybear: в данной заметке lusever рассматривает наиболее компактные способы назначения обработчиков событий для элементов DOM-дерева. Рекомендуется читать вместе со статьями &lt;a href="http://webo.in/articles/habrahabr/05-delayed-loading/"&gt;«отложенная» загрузка&lt;/a&gt; и &lt;a href="http://webo.in/articles/habrahabr/04-speed-up-events-handlers/"&gt;ускоряем обработку событий&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Только практические javascript решения, без всякой теории о всплытии и захвате.&lt;/p&gt;&lt;p&gt;Рекомендую использовать выражения, идущие в конце логического блока.&lt;/p&gt;&lt;h3&gt;Ловим&lt;/h3&gt;&lt;h4&gt;В html&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;В начале выполнится функция, потом переход по ссылке&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func()"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Переход не выполнится (см. &lt;code&gt;preventDefault&lt;/code&gt;)&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func(); return false"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Переход зависит от того, вернет ли &lt;code&gt;func&lt;/code&gt; false&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="return func()"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Передаем доступные параметры (порядок не важен):&lt;/strong&gt;&lt;br/&gt;&lt;code&gt;this&lt;/code&gt; &amp;mdash; нода&lt;br/&gt;&lt;code&gt;event&lt;/code&gt; &amp;mdash; тут значение имеет то, что мы передаем:&lt;ul&gt;&lt;li&gt;&lt;code&gt;function(event)&lt;/code&gt; &amp;mdash; получим кросс-браузерный вариант&lt;/li&gt;&lt;li&gt;&lt;code&gt;function(e)&lt;/code&gt; &amp;mdash; передаст объект &lt;code&gt;Event&lt;/code&gt; только для не IE браузеров&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func(this, event)"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h4&gt;В javascript&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" id="link"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;blockquote&gt;&lt;pre&gt;var node = document.getElementById('link')&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Назначаем напрямую&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;node.onclick = function(){

    this == node // true
    }&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Если нужно несколько событий&lt;/strong&gt;, или просто «осторожничаем». Это распространенная запись&lt;blockquote&gt;&lt;pre&gt;if (node.addEventListener)
    node.addEventListener('click', function(e){}, false)

else
    node.attachEvent('onclick', function(){})&lt;/pre&gt;&lt;/blockquote&gt;
    &lt;/li&gt;&lt;li&gt;&lt;strong&gt;То же самое, но меньше символов&lt;/strong&gt;
&lt;blockquote&gt;&lt;pre&gt;if (node.attachEvent)
    node.attachEvent('onclick', function(){})

else
    node.addEventListener('click', function(e){}, false)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Способ с переменной&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;var addEvent = node.attachEvent || node.addEventListener
addEvent(/*@cc_on 'on'+@*/'click', function(){}, false)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;В одну строку&lt;/strong&gt; с использованием &lt;a href="http://www.javascriptkit.com/javatutors/conditionalcompile.shtml" rel="nofollow"&gt;условной компиляции&lt;/a&gt;&lt;blockquote&gt;&lt;pre&gt;node[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'](/*@cc_on 'on'+@*/'click', function(){}, false)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Работаем с событиями&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;blockquote&gt;&lt;pre&gt;node[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'](/*@cc_on 'on'+@*/'click', function(e){

    var target = e.target || e.srcElement

    // или
    if (!e.target)

        e.target = e.srcElement

    // или если нам надо всего разочек
    (e.target || e.srcElement).tagName


    this == node // true везде кроме IE, в котором  this == window


    /* Отменяем всплытие */
    if (e.stopPropagation)
        e.stopPropagation()

    else
        e.cancelBubble

    // или просто: используем вариант, который для совместимости работает во всех браузерах. 
    // В FF2 причем быстрее stopPropagation, в остальных не смотрел
    e.cancelBubble = true


    /* Убираем действие по умолчанию (в данном случае клик) */
    if (e.preventDefault)
        e.preventDefault()

    else
        e.returnValue = false

    // при &lt;var&gt;attachEvent&lt;/var&gt; (как здесь) работает только в IE; 
    // при назначении напрямую (node.onclick)  везде

    return false

}, false)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Дополнительный материал:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://quirksmode.org/js/introevents.html" rel="nofollow" lang="en"&gt;Introduction to Events&lt;/a&gt; от quirksmode.org&lt;/li&gt;&lt;li&gt;&lt;a href="http://dean.edwards.name/weblog/2007/03/other-way/" rel="nofollow" lang="en"&gt;Реализация addEventListener в библиотеке Base2&lt;/a&gt; от Дина Эдвардса&lt;/li&gt;&lt;li&gt;&lt;a href="http://webfx.eae.net/dhtml/ieemu/eventobject.html" rel="nofolow" lang="en"&gt;Эмуляция событийной модели IE в Firefox&lt;/a&gt; от WebFX&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Спасибо за помощь &lt;a href="http://shabunc.livejournal.com/profile" rel="nofollow"&gt;&lt;img src="http://stat.livejournal.com/img/userinfo.gif" alt="shabunc" height="17" width="17"/&gt;&amp;nbsp;&lt;strong&gt;shabunc&lt;/strong&gt;&lt;/a&gt; и &lt;a href="http://crazyprotein.livejournal.com/profile"&gt;&lt;img src="http://stat.livejournal.com/img/userinfo.gif" alt="crazyprotein" height="17" width="17"/&gt;&amp;nbsp;&lt;strong&gt;crazyprotein&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://lusever.livejournal.com/18870.html#comments</comments></item><item><title>Разгоняем CMS: дешево и сердито</title><link>http://webo.in/articles/icamp2008/cms-speedup/</link><guid>http://webo.in/articles/icamp2008/cms-speedup/</guid><description>&lt;p&gt;Данный обзор делался исключительно для презентации на конференции iCamp'2008. Я проанализировал несколько наиболее распространенных в Рунете CMS и привел все информацию по ускорению их загрузки, которую удалось обнаружить.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://www.sbuilder.ru/" rel="nofollow"&gt;S.Builder&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="http://www.sbuilder.ru/demo/about.php" rel="nofollow"&gt;Демо-версия&lt;/a&gt;, практически, никакой информации не дала, поэтому далее информация (цитаты) лично от директора.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Gzip для HTML&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;В версии 4.0 этой функцией можно управлять из настроек системы. Просто поставить галочку в поле «Использовать GZip-сжатие страниц» и если браузер человека поддерживает такую функцию, то и CMS и страницы сайта будут использовать GZip. Если на одной CMS собрано несколько сайтов, настройка отдельна для каждого сайта.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;CSS/JS сжатие/минимизация&lt;/h4&gt;&lt;p&gt;Не применяется. Только руками верстальщика.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;В нашей CMS человек сам вставляет HTML, CSS и JS в том виде, в котором они были сверстаны.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Кеширование&lt;/h4&gt;&lt;p&gt;Насколько удалось установить, наиболее корректно отдается &lt;code&gt;Last-Modified&lt;/code&gt; для HTML. Все остальное покрыто мраком.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;CSS Sprites / параллельные хосты&lt;/h4&gt;&lt;p&gt;Нет и не планируется.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;a href="http://www.umi-cms.ru/" rel="nofollow"&gt;UMI.CMS&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Проверялась демо-версия, &lt;a href="http://www.umi-cms.ru/downloads/test_umicms/" rel="nofollow"&gt;доступная с официального сайта&lt;/a&gt;. Также была попытка установить пакет с сайта. В него не удалось залогиниться.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Включаем кеширование&lt;/h4&gt;&lt;p&gt;Оно включается в настройках &lt;code&gt;Модули -&amp;gt; Конфигурация -&amp;gt; Глобальные -&amp;gt; Разрешить браузерам кешировать страницы&lt;/code&gt;. В серверные заголовки при этом добавляется &lt;code&gt;Last-Modified&lt;/code&gt;. Цитата из документации:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Если эта опция включена, то браузер пользователя будет вначале проверять, изменилась ли страница, и если страница не менялась, то загрузит ее из локального кэша. При этом браузеру будет посылаться HTTP-заголовок Last-Modified, который содержит дату последнего изменения страницы. Эта опция поможет значительно снизить нагрузку на трафик и позволит быстрее открывать страницы.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Подключаем зеркала для ускорения выдачи статики&lt;/h4&gt;&lt;p&gt;&lt;code&gt;Модули -&amp;gt; Конфигурация -&amp;gt; Домены&lt;/code&gt;, выбираем наш домен и жмем &lt;code&gt;Зеркала&lt;/code&gt;. На открывшейся странице можно добавить еще несколько (2&amp;ndash;4) хоста для выдачи статики. Например, у нас был домен&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;endocardial.demo-pro.umi-cms.ru&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;мы добавляем еще 4 хоста&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;i1.endocardial.demo-pro.umi-cms.ru
...
i4.endocardial.demo-pro.umi-cms.ru&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;и теперь все картинки можно отдавать еще и таким образом&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;http://i1.endocardial.demo-pro.umi-cms.ru/images/cms/thumbs/picture2_50_50.jpg&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Выяснить через техническую поддержку, можно ли это как-то автоматически прикрутить к существующим модулям, не удалось. Наверное, никак.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Сжатие и минимизация CSS/JS&lt;/h4&gt;&lt;p&gt;Цитирую службу поддержки:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Возможно реализовать, но это будут уже custom-ные решения для UMI.CMS. Вы можете сделать их самостоятельно или с помощью сторонних разработчиков.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;a href="http://drupal.org/" lang="en" rel="nofollow"&gt;Drupal&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для тестирования бралась демо-версия с &lt;a href="http://demo.bloggyland.com/" lang="en" rel="nofollow"&gt;demo.bloggyland.com&lt;/a&gt;. Очень много советов по оптимизации приведено на странице &lt;a href="http://wimleers.com/article/improving-drupals-page-loading-performance" lang="en" rel="nofollow"&gt;wimleers.com/article/improving-drupals-page-loading-performance&lt;/a&gt;, где автор разбирает все правила из YSlow применительно к Drupal. Я лишь попытаюсь дополнить своими собственными.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Склейка CSS-файлов&lt;/h4&gt;&lt;p&gt;Еще во время своего первого знакомства с Drupal порадовался наличию возможности объединять десятки CSS-файлов для различных модулей (и затем кешировать результат). Включается это через &lt;code&gt;Administer -&amp;gt; Site Configuration -&amp;gt; Performance&lt;/code&gt;. Эта настройка также автоматически минимизирует файл (регулярными выражениями).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Склейка JS-файлов&lt;/h4&gt;&lt;p&gt;&lt;del&gt;Не&lt;/del&gt; Доступна в базовой поставке (Drupal 6, спасибо за комментарий &lt;a href="http://adek.habrahabr.ru/" rel="nofollow"&gt;&lt;img src="http://www.habrahabr.ru/i/small_default_userpic.gif" alt="посмотреть профиль" title="посмотреть профиль"&gt;&amp;nbsp;adek&lt;/a&gt;), и нам поможет модуль &lt;a href="http://drupal.org/project/javascript_aggregator" lang="en" rel="nofollow"&gt;Javascript Aggregator&lt;/a&gt;. Делает, в принципе, то же самое, что и предыдущий вариант, но уже для JavaScript-файлов. К тому же есть настройка для минимизации их размера (на основе обычных регулярных выражений, это дает от 80% возможного прироста производительности).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Gzip&lt;/h4&gt;&lt;p&gt;Включается автоматически (не нашел, где включается в настройках, но все Drupal-сайты уже отдавали HTML в сжатом виде). Для CSS/JS-файлов добавляется (по всей видимости) двумя вышеупомянутыми решениями. Навскидку никаких проблем замечено не было.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Кеширование&lt;/h4&gt;&lt;p&gt;Для статики и HTML-файлов настраивается в &lt;code&gt;Administer -&amp;gt; Settings -&amp;gt; Cache Settings&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;CSS Sprites, CDN, etc&lt;/h4&gt;&lt;p&gt;К сожалению, все остальные плюшки уже приходится создавать вручную (либо соответствующие модули находятся в &lt;a href="http://drupal.org/project/cdn" lang="en" rel="nofollow"&gt;стадии разработки&lt;/a&gt;). Однако, уже вышеперечисленного списка вполне хватит для создания производительного сайта на Drupal.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;a href="http://joomla.org/" lang="en" rel="nofollow"&gt;Joomla&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Некогда весьма популярная CMS сейчас как-то меньше мелькает в обзорах. Однако, сайтов на ней порядочно, и сообщество просто громадно. Настройки проверялись на имеющихся сайтах.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Gzip&lt;/h4&gt;&lt;p&gt;Для HTML-файлов добавляется в &lt;code&gt;Общие настройки -&amp;gt; Сервер -&amp;gt; GZIP-сжатие страниц&lt;/code&gt;. Gzip для CSS/JS не предусмотрен.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Склейка, минимизация и кеширование CSS/JS-файлов&lt;/h4&gt;&lt;p&gt;В базовой конфигурации нет. Удалось найти &lt;a href="http://extensions.joomla.org/component/option,com_mtree/task,viewlink/link_id,1341/Itemid,35/" rel="nofollow"&gt;следующее расширение&lt;/a&gt; (Cache accelerate component), которое дополнительно позволяет дополнительно кешировать (и архивировать) CSS/JS-файлы. Однако, не все ладно с серверными заголовками. Использовать стоит с осторожностью: возможны проблемы с совместимостью.&lt;/p&gt;&lt;p&gt;Также попутно был обнаружен &lt;a href="http://www.fijiwebdesign.com/products/joomla-speedy-plugin.html" lang="en" rel="nofollow"&gt;PHP Speedy plugin для Joomla&lt;/a&gt;, который позволяет делать то же самое, но с серверными заголовками у него все в порядке. В общем, рекомендуется к использованию.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Etc.&lt;/h4&gt;&lt;p&gt;К сожалению, информации об остальных оптимизационных плюшках еще меньше. Если у кого-то есть соображения, поделитесь, пожалуйста, в комментариях.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;В качестве заключения&lt;/h3&gt;&lt;p&gt;Абсолютно все CMS показали небогатый набор инструментов для клиентской оптимизации. Лучше всего с этим дело обстоит у открытых CMS, которые во многом развиваются за счет комьюнити.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blog/client_side_optimization/47816.html#comments</comments></item><item><title>Установка Web Optimizer версии 0.5</title><link>http://webo.in/articles/habrahabr/99-web-optimizer-installation-0.5/</link><guid>http://webo.in/articles/habrahabr/99-web-optimizer-installation-0.5/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Web Optimizer" title="Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Не так давно вышла версия 0.5 (RC3) приложения для автоматического ускорения сайтов  &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;. Поскольку с момента написания &lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;предыдущего руководства по установке&lt;/a&gt; прошло уже три месяца, интерфейс и логика работы приложения существенно изменились (стали проще и нагляднее), то стоит осветить процесс установки еще раз, в новом виде и с новыми подробностями.&lt;/p&gt;&lt;h3&gt;Шаг 1: загрузка архива&lt;/h3&gt;&lt;p&gt;Web Optimizer поставляется в двух вариантах: ZIP-архив и мини-установщик. Для загрузки первого варианта идем по адресу &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt; и выбираем Featured версию 0.5 или выше.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-04.png" alt="Выбираем файл для загрузки" title="Выбираем файл для загрузки"/&gt;&lt;/p&gt;&lt;p&gt;Загружаем ZIP-архив в корень сайта. Если к сайту есть SSH-доступ, то можно использовать просто wget:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;wget http://web-optimizator.googlecode.com/files/web-optimizer.v0.5beta.zip&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Затем полученный архив нужно будет распаковать в корень, чтобы получилась папка web-optimizer.&lt;/p&gt;&lt;p&gt;Если к сайту есть только FTP-доступ, то загружаем сначала на локальный диск, потом распаковываем, а потом уже (например, через FAR) копируем в корень сайта.&lt;/p&gt;&lt;p&gt;При отсутствии желания загружать распакованный архив на сервер (или распаковывать на сервере загруженный архив) есть версия мини-установщика, который (при наличии &lt;code&gt;curl&lt;/code&gt; на сервере) сам все загрузит и начнет установку. Для этого нужно загрузить только файл &lt;code&gt;install.me.php&lt;/code&gt; в корень сайта и открыть его в браузере.&lt;/p&gt;&lt;p&gt;После того, как все необходимые файлы оказались на сайте, то нужно выставить права на запись, как минимум, для файла &lt;code&gt;web-optimizer/config.php&lt;/code&gt; и (опционально) папки &lt;code&gt;web-optimizer/cache&lt;/code&gt; для пользователя, под которым работает сервер. Иначе настройки и закэшированные версии сжатых файлов не смогут сохраниться. При желании папка кэширования может быть другой (об этом чуть ниже), поэтому будет необходимо только выставить права на конфигурационный файл.&lt;/p&gt;&lt;h3&gt;Шаг 2: настройка&lt;/h3&gt;&lt;p&gt;Заходим в браузере по адресу&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;http://ваш_сайт/web-optimizer/index.php&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Вместо &lt;code&gt;web-optimizer&lt;/code&gt; может быть произвольная директория, в которой находится Web Optimizer. Видим приветственный экран от Web Optimizer. Если не видим, то стоит перепроверить, куда был скопирован Web Optimizer, а зайти именно в ту папку.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-05.png" alt="Настройка доступа" title="Настройка доступа"/&gt;&lt;/p&gt;&lt;p&gt;Здесь возможно 2 варианта развития событий:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Быстрая установка&lt;/li&gt;&lt;li&gt;Обычная установка&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Быстрая установка&lt;/h4&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-06.png" alt="Быстрая установка" title="Быстрая установка"/&gt;&lt;/p&gt;&lt;p&gt;Для начала быстрой установки вводим будущий логин и пароль доступа к административной части и нажимаем зеленую кнопку «Быстрая установка». После этого Web Optimizer вычисляет директории на сервере, сохраняет все настройки по умолчанию и осуществляет цепочную оптимизацию для главной страницы: создает закэшированные версии сжатых файлов. Только потом, если файлы (обычно только корневой &lt;code&gt;index.php&lt;/code&gt;, зависит от используемой CMS) доступны на запись, производится их автоматическое изменение.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-07.png" alt="Окончание установки" title="Окончание установки"/&gt;&lt;/p&gt;&lt;p&gt;Иначе Web Optimizer выведет инструкции по изменению этих файлов.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-12.png" alt="Инструкции по изменению файлов" title="Инструкции по изменению файлов"/&gt;&lt;/p&gt;&lt;h4&gt;Обычная установка&lt;/h4&gt;&lt;p&gt;Обычная установка отличается от быстрой только наличием промежуточного шага с редактированием настроек. Запустить ее можно, нажав по кнопке «Далее», цифре 2 или 3 в верхнем меню или оранжевой стрелочек справа.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-11.png" alt="Настройки" title="Настройки"/&gt;&lt;/p&gt;&lt;p&gt;Подробно все настройки и их особенности &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описаны в соответствующей статье&lt;/a&gt;. Прежде всего нужно убедиться в том, что вычисленные пути являются правильными. Также можно задать произвольные директории кэширования: это будет необходимо при включении настройки «Защищенный режим» (находится в разделе «Использование &lt;code&gt;.htaccess&lt;/code&gt;»). После этой настройки пароль при доступе к Web Optimizer будет запрашиваться только через HTTP Basic Authorization. Дополнительно вводить его не потребуется. Однако файлы, которые находятся внутри папки с Web Optimizer, станут не доступны обычным пользователям, поэтому директории кэширования нужно из нее перенести.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-10.png" alt="Защищенный режим" title="Защищенный режим"/&gt;&lt;/p&gt;&lt;h3&gt;Шаг 3: Управление&lt;/h3&gt;&lt;p&gt;В Web Optimizer версии 0.5 доступно несколько инструментов для управления приложением.&lt;/p&gt;&lt;p&gt;&lt;img width="10)%" src="http://i.webo.in/web-optimizer/7-09.png" alt="Обычный режим. Обновление" title="Обычный режим. Обновление"/&gt;&lt;/p&gt;&lt;p&gt;Во-первых, это конфигурирование всех настроек (здесь и далее при работе не в защищенном режиме нужно будет ввести логин и пароль), которое можно осуществить по кнопке «Далее» (или клику по цифрам 2 или 3 или оранжевой стрелочке справа). Во-вторых, это очистка кэша (будет необходимо, если вы провели изменение каких-либо CSS- или JS-файлов на сервере при включенной настройке «Не проверять время изменения файлов»)  кнопка «Очистить кэш». В-третьих, это возможность безболезненно удалить Web Optimizer (будут удалены все добавленные в файлы CMS вызовы, а файл &lt;code&gt;.htaccess&lt;/code&gt; будет очищен от оптимизационных директив)  кнопка «Удалить».&lt;/p&gt;&lt;p&gt;При наличии &lt;code&gt;curl&lt;/code&gt; на сервере и существовании более новой версии, чем текущая, будет предложено обновиться (появится блок с кнопкой «Обновить»). При обновлении все исходные настройки будут сохранены. Также могут добавиться некоторые новые. В обычном режиме панель администрирования для Web Optimizer выглядит следующим образом:&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-08.png" alt="Обычный режим" title="Обычный режим"/&gt;&lt;/p&gt;&lt;h3&gt;Решение возникающих проблем&lt;/h3&gt;&lt;p&gt;Часть известных проблем и методов решения уже &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описана в предыдущей статье&lt;/a&gt;. Если вы обнаружили некорректное поведение Web Optimizer для вашего сайта, вы можете &lt;a href="http://code.google.com/p/web-optimizator/issues/entry" rel="nofollow"&gt;опубликовать описание ошибки&lt;/a&gt; (требуется Google-аккаунт) или &lt;a href="http://code.google.com/p/web-optimizator/issues/list?can=1&amp;amp;cells=tiles" rel="nofollow"&gt;посмотреть все известные (или решенные) вопросы&lt;/a&gt;. На данный момент среднее время решения проблемы составляет около суток (обычно несколько часов).&lt;/p&gt;&lt;p&gt;Также можно попробовать решить проблему в интерактивном режиме, &lt;a href="http://webo.in/contacts/"&gt;используя указанные контакты&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Эффективность&lt;/h3&gt;&lt;p&gt;Несколько результатов использования Web Optimizer (для «чистой» установки системы, без каких-либо предварительных оптимизаций) &lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;приведено здесь&lt;/a&gt;. Оценка YSlow поднимается до 89-97, скорость клиентской загрузки в 2-3 (реже 3-5) раз. Сам Web Optimizer после создания кэшированных файлов тратит всего 3-10мс на проверку и обновление выходного HTML-документа (при настройках по умолчанию, корректное сжатие HTML в одну строку  достаточно ресурсоемкая операция и может занимать еще 50-100мс).&lt;/p&gt;&lt;p&gt;Загрузить Web Optimizer &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/98-web-optimizer-0.5/"&gt;Web Optimizer 0.5 "cheetah"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62861/#comments</comments></item><item><title>Web Optimizer 0.5 «cheetah», RC3</title><link>http://webo.in/articles/habrahabr/98-web-optimizer-0.5/</link><guid>http://webo.in/articles/habrahabr/98-web-optimizer-0.5/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Мы снова здесь со свежей версией приложения для автоматизации клиентской оптимизации  Web Optimizer. Больше месяца прошло с момента выхода последней стабильной версии, более 300 реальных сайтов испытали феноменальное ускорение, но нам этого показалось мало. И мы сделали хороший продукт еще лучше.&lt;/p&gt;&lt;p&gt;Итак, встречайте: версия 0.5 под кодовым именем «cheetah» (гепард), Release Candidate 3.&lt;/p&gt;&lt;p&gt;Загрузить: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Что нового?&lt;/h3&gt;&lt;p&gt;Естественно, весь месяц мы не сидели сложа руки и писали, тестировали, обновляли и тестировали вновь. Изменения по сравнению с версией 0.4.5:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Одним из главных бонусов является включение в состав Web Optimizer последней версии библиотеки для форматирования и оптимизации CSS-кода  CSS Tidy (наверное, в ближайшем будущем выйдет ее новая версия, 1.4, а то уже все заждались). Исправлено несколько очевидных и не очень ошибок (в частности, связанных с CSS3-селекторами).&lt;/li&gt;&lt;li&gt;Была существенно переработана логика самого Web Optimizer для максимальной производительности. По последним тестам время его работы для отдельной страницы составляет 3-10мс (в среднем сайт на Joomla! требует 200-500мс для выполнения всей серверной логики).&lt;/li&gt;&lt;li&gt;Исправлена проблема с «белым экраном» при использовании CSS Sprites (связана с «вылетом» GDLib при попытке создать слишком большое изображение). Теперь при недостатке памяти просто создается не такой большой спрайт, как хотелось бы. Видимо, в будущих версиях алгоритм расходования памяти будет существенно улучшен.&lt;/li&gt;&lt;li&gt;Полностью обновлен пользовательский интерфейс (спасибо &lt;a href="http://fade.habrahabr.ru/" rel="nofollow"&gt;&lt;img src="http://www.habrahabr.ru/i/small_default_userpic.gif" alt="посмотреть профиль" title="посмотреть профиль"/&gt;&amp;nbsp;fade&lt;/a&gt; ). Мы продолжаем &lt;a href="http://sprites.in/donate/"&gt;собирать деньги&lt;/a&gt;, чтобы отблагодарить автора дизайна. Еще не поздно внести свою лепту.&lt;/li&gt;&lt;li&gt;Авто-изменение PHP-файлов CMS включено по умолчанию. В случае невозможности такого изменения на последнем шаге выводится полный список необходимых изменений для файлов.&lt;/li&gt;&lt;li&gt;Добавлена возможность создать «защищенную» установку: Web Optimizer может находиться в произвольной директории и быть закрытым при помощи &lt;code&gt;.htpasswd&lt;/code&gt;. Более подробно данная тема раскрывается в &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;статье про настройки&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;В настройки Web Optimizer добавлены ссылки на соответствующие статьи, в которых заявленные техники освещаются в полном масштабе.&lt;/li&gt;&lt;li&gt;Добавлено достаточно простое кэширование для HTML-документов. Помогает в случае простых сайтов снять нагрузку с сервера (создаваемые HTML-документы надежно кэшируются). Доступные настройки: время кэширования, регулярное выражение для запрета кэширования, список USER AGENTS для форсирования кэширования, возможность сделать быстрый сброс документа.&lt;/li&gt;&lt;li&gt;Благодаря сотрудничеству с &lt;a href="http://ort.habrahabr.ru/" rel="nofollow"&gt;&lt;img src="http://www.habrahabr.ru/i/small_default_userpic.gif" alt="посмотреть профиль" title="посмотреть профиль"/&gt;&amp;nbsp;ort&lt;/a&gt; значительно улучшена стабильность работы и функционирование распределения изображений по статическим хостам. Все обнаруженные проблемы совместимости с LiveStreet 0.3 были устранены.&lt;/li&gt;&lt;li&gt;Добавлена возможность оптимизации фоновых изображений через API сервиса &lt;a href="http://smush.it/" rel="nofollow"&gt;smush.it&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;По умолчанию добавлено статическое архивирование для CSS/JS-файлов. Это означает, что если сжатием у вас заправляет сервер, то ему не придется каждый раз сжимать эти файлы перед отдачей клиенту  gzip-версии будут храниться на сервере рядом с обычными и отдаваться в случае необходимости. Даже если сжатием заправляет PHP, все равно он будет отдавать уже готовые сжатые файлы, а не запускать &lt;code&gt;ob_gzhandler&lt;/code&gt; каждый раз.&lt;/li&gt;&lt;li&gt;Улучшен алгоритм работы &lt;code&gt;data:URI&lt;/code&gt;: немного увеличен максимальный размер файла и добавлены исключения для некоторых типов (&lt;code&gt;.htc&lt;/code&gt;, &lt;code&gt;.cur&lt;/code&gt;, &lt;code&gt;.eot&lt;/code&gt; и т.д.).&lt;/li&gt;&lt;li&gt;Добавлена возможность вынести сгенерированный JS-файл перед &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. Также добавлена возможность вынести загрузку счетчиков и рекламы в самый низ документа, чтобы избежать блокирующего влияния скриптов.&lt;/li&gt;&lt;li&gt;Добавлена очистка кэша из панели администрирования.&lt;/li&gt;&lt;li&gt;Добавлена возможность корректно сжимать HTML в одну строку.&lt;/li&gt;&lt;li&gt;Добавленные системы:&lt;ul&gt;&lt;li&gt;Textpattern 4.0&lt;/li&gt;&lt;li&gt;Kohana 2.3&lt;/li&gt;&lt;li&gt;phpBB 3.0&lt;/li&gt;&lt;li&gt;Yii 1.0&lt;/li&gt;&lt;li&gt;SMF 1.1.8&lt;/li&gt;&lt;li&gt;IPB 2.3.6&lt;/li&gt;&lt;li&gt;Bitrix&lt;/li&gt;&lt;li&gt;cogear 1.0&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ну и сотня-другая не столь крупных исправлений и улучшений.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Что дальше?&lt;/h3&gt;&lt;p&gt;Видимо, главным приоритетом для новой версии станет максимальная совместимость с самыми различными вариантами поддерживаемхы CMS и максимальная производительность при любых настройках и любом серверном окружении (не у всех же сайтов выделенный сервер с 1Гб оперативной памяти?). На данный момент есть весьма интересная задача по оптимизации создания CSS Sprites (как показала практика, они стабильно создаются уже в 95-99% случаев) в случае ограниченной памяти. Если кто соберется помочь  пишите в комментариях, приват и по &lt;a href="http://webo.in/contacts/"&gt;указанным контактам&lt;/a&gt;. Только давайте не так, как вышло с версткой для нового интерфейса, когда 5 верстальщиков один за другим сошли с дистанции.&lt;/p&gt;&lt;h3&gt;Замеченные ошибки и документации&lt;/h3&gt;&lt;p&gt;Документация и описание приложения будет ширится и расти. на данный момент уже опубликована &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;статья с описанием настроек&lt;/a&gt;, готова к публикации статья с пошаговым руководством по установке. В процессе подготовки статья с описанием известных проблем под наиболее популярные CMS.&lt;/p&gt;&lt;p&gt;Часть документации (в основном, касательно принципов работы) выложена на английском здесь: &lt;a href="http://code.google.com/p/web-optimizator/w/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/w/list&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Некоторые известные проблемы и методы их решения уже &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описаны в предыдущей статье&lt;/a&gt;. Если вы обнаружили некорректное поведение Web Optimizer для вашего сайта, вы можете &lt;a href="http://code.google.com/p/web-optimizator/issues/entry" rel="nofollow"&gt;опубликовать описание ошибки&lt;/a&gt; (требуется Google-аккаунт) или &lt;a href="http://code.google.com/p/web-optimizator/issues/list?can=1&amp;amp;cells=tiles" rel="nofollow"&gt;посмотреть все известные (или решенные) вопросы&lt;/a&gt;. На данный момент среднее время решения проблемы составляет около суток (обычно несколько часов).&lt;/p&gt;&lt;p&gt;Также можно попробовать решить проблему в интерактивном режиме, &lt;a href="http://webo.in/contacts/"&gt;используя указанные контакты&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Монетизация&lt;/h3&gt;&lt;p&gt;На данный момент доступна платная установка и настройка приложения дл вашего сайта. &lt;a href="http://webo.in/speed/"&gt;Заказать можно здесь&lt;/a&gt;. Также есть вероятность того, что будет выпущена отдельная, коммерческая ветка приложения, которая будет каким-либо образом продаваться (политика лицензирования обсуждается).&lt;/p&gt;&lt;p&gt;Если у вас есть какие-то конкретные коммерческие предложения, их всегда можно озвучить по &lt;a href="http://webo.in/contacts/"&gt;указанным контактам&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Эффективность&lt;/h3&gt;&lt;p&gt;Несколько результатов использования Web Optimizer (для «чистой» установки системы, без каких-либо предварительных оптимизаций) &lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;приведено здесь&lt;/a&gt;. Оценка YSlow поднимается до 89-97, скорость клиентской загрузки в 2-3 (реже 3-5) раз. Сам Web Optimizer после создания кэшированных файлов тратит всего 3-10мс на проверку и обновление выходного HTML-документа (при настройках по умолчанию, корректное сжатие HTML в одну строку  достаточно ресурсоемкая операция и может занимать еще 50-100мс).&lt;/p&gt;&lt;p&gt;Ну, вроде все. До новых встреч :)&lt;/p&gt;&lt;p&gt;Загрузить Web Optimizer: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Поддержать проект материально: &lt;a href="http://sprites.in/donate/"&gt;sprites.in/donate/&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62009/#comments</comments></item><item><title>CSS Tidy: нужна помощь</title><link>http://webo.in/articles/habrahabr/97-css-tidy/</link><guid>http://webo.in/articles/habrahabr/97-css-tidy/</guid><description>&lt;p&gt;&lt;a href="http://csstidy.sourceforge.net/" rel="nofollow"&gt;CSS Tidy&lt;/a&gt; является полностью открытой и на данный момент одной из самых мощных библиотек по преобразования CSS-кода. В большинстве случаев ее используют для минимизации CSS-кода (что позволяет добиваться &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;весьма впечатляющих результатов&lt;/a&gt;, &lt;a href="http://csstidy.sourceforge.net/example.php" rel="nofollow"&gt;пример с сайта CSS Tidy&lt;/a&gt;). Огромное количество сайтов предлагают минимизаторы, основанные именно на CSS Tidy: &lt;a href="http://www.cleancss.com/" rel="nofollow"&gt;CleanCSS&lt;/a&gt;, &lt;a href="http://hellobmw.com/csstidy/" rel="nofollow"&gt;CSS Formatter and Optimizer&lt;/a&gt;, &lt;a href="http://www.csscompressor.com/" rel="nofollow"&gt;CSS Compressot&lt;/a&gt; и многие другие. Даже &lt;a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow"&gt;YUI Compressor&lt;/a&gt; год назад уступал CSS Tidy по степени сжатия.&lt;/p&gt;&lt;h3&gt;Преамбула&lt;/h3&gt;&lt;p&gt;Количество настроек CSS Tidy впечатляет: это и сжатие наименований свойств (цветов, шрифтов, фона), и регистро-независимый вывод, и объединение селекторов для максимальной минимизации кода, и их сортировка, и исключение нестандартных CSS-свойств, и сохранение синтаксиса введенного кода, и т.д. (&lt;a href="http://csstidy.sourceforge.net/usage.php" rel="nofollow"&gt;полный список поддерживаемых настроек с примерами&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Поскольку библиотека направлена на разбор и стандартизацию (как следует из названия - Tidy), а не только на минимизацию кода, то с ее помощью можно проворачивать довольно любопытные вещи. Например, выводить CSS-код в стандартном виде в любом формате (CSS Tidy &lt;a href="http://csstidy.sourceforge.net/templates.php" rel="nofollow"&gt;поддерживает шаблоны вывода&lt;/a&gt;). Или осуществлять любые преобразование с таблицей стилей на странице (к слову, именно она используется для &lt;a href="http://sprites.in/"&gt;создания CSS Sprites&lt;/a&gt; и, естественно, в приложении для автоматической клиентской оптимизации &amp;mdash; &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;). В Web Optimizer уже включена самая последняя версия CSS Tidy, в которой исправлены некоторые ошибки.&lt;/p&gt;&lt;p&gt;Так как приложение написано с учетом высоких требований к производительности, то работает оно очень шустро (в несколько раз быстрее того же YUI Compressor).&lt;/p&gt;&lt;p&gt;Но речь не совсем об этом.&lt;/p&gt;&lt;h3&gt;Амбула&lt;/h3&gt;&lt;p&gt;На данный момент (&lt;a href="http://en.wikipedia.org/wiki/CSSTidy" rel="nofollow"&gt;как написано в Wikipedia&lt;/a&gt;) автор (Florian Schmitz) ищет людей, который смогли бы вести проект дальше. PHP-часть библиотеки не так сложна, и я справляюсь с ней самостоятельно. Но проблемы возникли при необходимости параллельно поддерживать Win32-версию (CPP). Беглый взгляд на текущий состав файлов мне ничего не подсказал, поэтому я прошу у сообщества помощи и в свою очередь ищу людей, которые смогли бы поддерживать актуальность CPP-ветки.&lt;/p&gt;&lt;p&gt;Для примера текущий список файлов в ней:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;SConscript
background.cpp
background.hpp
conversions.cpp
conversions.hpp
cssopt.cpp
cssopt.hpp
csspp_globals.cpp
csspp_globals.hpp
csspp_private.h
csstidy.cpp
csstidy.hpp
datastruct.hpp
file_functions.cpp
file_functions.hpp
important.cpp
important.hpp
main.cpp
misc.cpp
misc.hpp
parse_css.cpp
parse_css.hpp
prepare.cpp
prepare.hpp
print_css.cpp
trim.cpp
trim.hpp
umap.cpp
umap.hpp
win32_resource.rc&lt;/pre&gt;&lt;/blockquote&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;CSS Tidy уже два года "застрял" на версии 1.3. Очень хотелось бы сдвинуть эту библиотеку с мертвой точки и продолжить ее полноценную разработку, ибо с появлением CSS3-селекторов задача эта становится уже гораздо интереснее.&lt;/p&gt;&lt;p&gt;Если добровольцы найдутся, то можно писать в комментариях, приват или &lt;a href="http://webo.in/contacts/"&gt;используя контакты&lt;/a&gt;. Будем решать, как организовывать дальнейшую работу.&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;CSS: все о сжатии&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62464/#comments</comments></item><item><title>Web Optimizer. Настройка и использование</title><link>http://webo.in/articles/habrahabr/96-web-optimizer-settings/</link><guid>http://webo.in/articles/habrahabr/96-web-optimizer-settings/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Пока выпуск версии 0.5 веб-приложения, автоматизирующего клиентскую оптимизацию для PHP-сайтов, отодвигается на некоторое неопределенное время, мы решили подготовить небольшой обзор текущих настроек и возможностей приложения.&lt;/p&gt;&lt;h3&gt;Особенности работы&lt;/h3&gt;&lt;p&gt;Web Optimizer перехватывает выводимый HTML-документ и преобразовывает его к оптимальному виду. В частности, анализируется вся секция &lt;code&gt;head&lt;/code&gt; на предмет CSS- и JavaScript-файлов, также при существовании статических хостов изображения распределяются по ним (меняются адреса у изображений), а блоки с рекламой и счетчиками переносятся перед &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; (опять-таки только при включении соответствующей настройки). Также HTML подвергается минимизации (удаляются лишние переводы строк и отступы, могут удаляться комментарии и вообще все лишние символы, но это ресурсоемкие операции, и по умолчанию они выключены).&lt;/p&gt;&lt;p&gt;Загрузить приложение: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;http://code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Настройка Web Optimizer&lt;/h3&gt;&lt;p&gt;Ниже приведены настройки, доступные в Web Optimizer версии 0.4.9.7 (войдут в 0.5 без изменений):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Директории кэширования&lt;/strong&gt;. Здесь можно выставить пути к кэширующим директориям (на файловой системе), в которых будут записываться сохраненные уменьшенные CSS-, JavaScript- и HTML-файлы. Также здесь можно определить корневую директорию сайта (необходима для правильного расчета всех относительных путей). По умолчанию все кэширующие директории назначаются в папке &lt;code&gt;cache&lt;/code&gt; в самом Web Optimizer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Настройки сжатия&lt;/strong&gt;. Эта группа настроек отвечает за объединении и минимизацию JavaScript- и CSS-файлов. По умолчанию JavaScript-файлы объединяются и минимизируются при помощи JSMin (или YUI Compressor, если доступна &lt;code&gt;java&lt;/code&gt;). Также можно сжимать JavaScript при помощи Dean Edwards Packer (является лучшим выбором при отсутствии &lt;code&gt;gzip&lt;/code&gt;-сжатия). Здесь также можно настроить, каким образом минимизировать выводимый HTML-код (простое удаление лишних переводов строк и пробелов, &amp;laquo;вытягивание&amp;raquo; в одну строку и(ли) удаление комментариев). Условные комментарии для IE не затрагиваются ни в каком случае.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Включить внешние JavaScript-файлы&lt;/strong&gt;. Web Optimizer может загружать внешние JavaScript-файлы (вызываемые с других доменов), а также внутренний код (заключенный прямо в &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;). Здесь можно настроить и &amp;laquo;склеивание&amp;raquo; CSS-кода, находящегося в &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; (по умолчанию включено). Также можно указать (через пробел) названия файлов (названия, а не полные пути), которые нужно исключить из логики объединения. На этапе тестирования была обнаружена невозможность объединить исходные библиотеки Tiny MCE и FCE Editor, поэтому они исключаются по умолчанию.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&amp;laquo;Ненавязчивый&amp;raquo; JavaScript&lt;/strong&gt;. В этой группе собраны настройки, отвечающие за неблокирующие загрузку различных вариантов JavaScript. В частности, можно вынести объединенный JavaScript-файл перед &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; (или вообще вызывать его загрузку по событию &lt;code&gt;DomContentLoaded&lt;/code&gt;), можно вынести загрузку некоторых счетчиков, рекламы и информеров также в самый низ документа (после JavaScript-кода результирующий HTML-код вставляется в исходное место на странице, обеспечивая постепенное появление дополнительных рекламных блоков после того, как загрузилось основное содержание).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Не проверять время изменения&lt;/strong&gt;. Данная настройка позволяет не проверять при загрузке каждой страницы время изменение и содержание всех файлов, только существование закэшированных версий. За счет этого мы получаем существенный прирост серверной производительности (по умолчанию настройка включена). В случае отладки или очень частого изменения исходных JavaScript- или CSS-файлов настройку лучше отключить.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Gzip-сжатие (архивирование)&lt;/strong&gt;. Данная группа настроек регулирует, отдавать ли браузеру JavaScript-, CSS- или HTML-файлы в виде архивов. Gzip-сжатие позволяет сэкономить 70-85% трафика при передаче текстовых файлов, однако может быть (особенно в случае сжатия через PHP и высоконагруженных проектов) не очень оптимальной для сервера. В любом случае по возможности все настройки сжатия выносятся в &lt;code&gt;.htaccess&lt;/code&gt; (для CSS- и JavaScript- в статическом виде). При невозможности изменения &lt;code&gt;.htaccess&lt;/code&gt; gzip-версии JavaScript- и CSS-кода сохраняются в кэширующих директориях, что также сводит нагрузку на процессор (через PHP) к минимуму.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&amp;laquo;Вечное&amp;raquo; кэширование&lt;/strong&gt;. Настройки этой группы отвечают за выставление кэширующих заголовков для JavaScript-, CSS-, HTML- или статических файлов (изображений и анимации). Для изображений и анимации соответствующие правила размещаются только в &lt;code&gt;.htaccess&lt;/code&gt;, для остальных файлов они дублируются по необходимости через PHP. По умолчанию для статических файлов выставляется срок кэширования на 10 лет (при изменении файлов новые версии имеют другое имя, создаваемое на основе md5-хэша от общего содержимого файлов). Для HTML-файлов есть возможность вручную выставить подходящий срок действия клиентского кэша. Отличие этой настройки от следующей группы (серверного кэширования HTML-файлов) заключается в том, что выводимый HTML никак на сервере не сохраняется, мы только указываем браузерам, что они могут не перезапрашивать HTML-документы в течение определенного времени. Будут ли браузеры следовать этому указания или нет, остается полностью на их совести.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кэширование HTML-файлов&lt;/strong&gt;. Для существенного ускорения работы серверной стороны практически во всех случаях требуется применять серверное кэширование. И практически все CMS это поддерживают (на том или ином уровне). Web Optimizer предлагает альтернативный вариант (для тех случаев, когда текущая система это не умеет, либо нужно более &amp;laquo;жесткое&amp;raquo; решение): простое кэширование HTML-документов. При включении этой настройки HTML-файлы сохраняются в директории кэширования и отдаются при первом вызове Web Optimizer, без обработки внутренней логики системы. Естественно, учитывается срок действия кэша. Также возможно выдавать сразу не весь документ, а первый 1-2 Кб (через сброс документа), а потом рассчитывать остальную часть. Это может помочь визуально ускорить загрузку страницы на некоторых окружениях. Для настройки кэширования доступен список частей URL сайта, которые нужно исключить (есть возможность задавать регулярные выражения) и список роботов (USER AGENTS), для которых нужно форсировать выдачу кэширующего файла.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CSS Sprites&lt;/strong&gt;. Пожалуй, самая технологически мощная и самая спорная часть Web Optimizer. Правильное использование спрайтов позволяет на порядок (!) уменьшить число запросов к серверу при загрузке страницы с большим количеством фоновых изображений (с 20-100 до 3-10). Однако существуют некоторые проблемы с отображением комбинированных картинок для IE6 (картинки по умолчанию создаются в 32-битной палитре, а IE6 не умеет корректно обрабатывать прозрачность для таких PNG), проблемы устраняются исключением IE6 из создания спрайтов (соответствующей настройкой), либо использованием непрозрачных картинок. Также доступны настройки по использованию JPEG вместо PNG для полноцветных изображений, &amp;laquo;агрессивному&amp;raquo; режиму (&lt;code&gt;repeat-x&lt;/code&gt; и &lt;code&gt;repeat-y&lt;/code&gt; будут объединяться без учета фактических размеров контейнеров), добавлению свободного пространства (позволяет избежать рудиментов при масштабировании таких картинок в современных браузерах).
Для повышения стабильности работы добавлен режим &amp;laquo;ограниченной&amp;raquo; памяти: если у PHP-процесса меньше 64 Мб памяти (этого хватает для создания спрайта примерно 3000 на 3000 пикселей, что вполне достаточно для большинства сайтов), то изображения, по площади большие 4000 пикселей, будут исключены. Также есть настройка по исключению больших изображений по их линейным размерам (в пикселах, по умолчанию 900) и прямому исключения файлов (опять-таки задаются имена файлов, а не полный путь к ним) из процесса создания CSS Sprites.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;data:URI&lt;/strong&gt;. Технология &lt;code&gt;data:URI&lt;/code&gt; позволяет включать фоновые изображения прямо в CSS-файл. Поддерживается всеми современными браузерами и IE8. Имеет ограничение на размер изображения в 24 Кб (32 Кб &lt;code&gt;data:URI&lt;/code&gt; кода получаются из 24576 байтов бинарного кода). При создании &lt;code&gt;data:URI&lt;/code&gt; для IE7- в CSS-файл вставляются хаки, благодаря чему дизайн сайта остается неизменным для этих браузеров. Также при создании &lt;code&gt;data:URI&lt;/code&gt; крайне желательно оптимизировать изображения. Для этого используется API от &lt;a href="http://smush.it/" rel="nofollow"&gt;smush.it&lt;/a&gt;. Для корректной оптимизации изображений нужны права на запись для веб-сервера на сами изображения. Эта настройка по умолчанию отключена, потому что оптимизировать изображения имеет смысл всего один раз, и при последующих сборках CSS-файлов использовать уже готовый результат.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Множественные хосты&lt;/strong&gt;. Данная настройка позволяет включить распределение изображений по статическим хостам. Каждому изображению всегда будет соответствовать один хост (чтобы избежать забивания кэша одними и теми же изображениями со всех доступных хостов). Для использования данного механизма ускорения загрузки необходимо прописать в DNS все альтернативные хосты на тот IP-адрес, который будет их обслуживать (обычно это текущий сайт) и добавить в конфигурации сервера алиасы для основного сайта в виде этих хостов. Например:&lt;blockquote&gt;&lt;pre&gt;ServerAlias i1.site.ru
ServerAlias i2.site.ru&lt;/pre&gt;&lt;/blockquote&gt; После этого можно добавить &lt;code&gt;i1 i2&lt;/code&gt; в список хостов для Web Optimizer и убедиться в том, что изображения &amp;laquo;раскидываются&amp;raquo; по этим хостам. При установке Web Optimizer автоматически проверяется ряд хостов на возможность их использования в качестве альтернативных (с тем же корнем сайта), также все вручную указанные хосты проверяются на доступность (с них загружаются тестовые картинки). Стоит иметь в виду, что пи включении &amp;laquo;безопасной&amp;raquo; установки (о ней чуть ниже) проверка хостов становится недоступной и их прописывать нужно будет вручную, не перезапуская настройку Web Optimizer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Использование &lt;code&gt;.htaccess&lt;/code&gt;&lt;/strong&gt;. Большая часть настроек gzip-сжатия и кэширования могут быть записаны в конфигурационном файле вашего сервера для избежания дополнительной работы на стороне серверных скриптов. Это может быть проделано с помощью файла &lt;code&gt;.htaccess&lt;/code&gt; (при необходимости вы можете впоследствии самостоятельно перенести все настройки в файл &lt;code&gt;httpd.cond&lt;/code&gt;). Web Optimizer автоматически проверяет доступные модули и конфигурирует запись в &lt;code&gt;. htaccess&lt;/code&gt; (естественно, для этого последний должен быть доступен на запись). &lt;code&gt;mod_gzip&lt;/code&gt;, &lt;code&gt;mod_deflate&lt;/code&gt; и &lt;code&gt;mod_filter&lt;/code&gt; отвечают за сжатие файлов &amp;laquo;на лету&amp;raquo;, &lt;code&gt;mod_rewrite&lt;/code&gt; и &lt;code&gt;mod_mime&lt;/code&gt; &amp;mdash; за статическое архивирование. &lt;code&gt;mod_headers&lt;/code&gt; и &lt;code&gt;mod_setenvif&lt;/code&gt; &amp;mdash; за обеспечение корректной обработки сжатых файлов на проксирующих серверах и в старых браузерах. &lt;code&gt;mod_expires&lt;/code&gt; &amp;mdash; за выставление кэширующих эаголовков. Также возможно расположить &lt;code&gt;.htaccess&lt;/code&gt; либо в директории сайта (это бывает полезно, если на одном хосте располагается несколько сайтов в разных дирекориях), либо в самом корне сайта. По умолчанию оба месторасположения совпадают. Также возможно защитить установку Web Optimizer с помощью &lt;code&gt;.htpasswd&lt;/code&gt;. В этом случае для доступа к настройкам нужно будет ввести логин и пароль через окно HTTP Basic Authorization в браузере (это позволяет вынести Web Optimizer в произвольную директорию внутри сайта, предварительно расположив директории кэширования вне защищенной области).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Логотип Веб Оптимизатора&lt;/strong&gt;. На данный момент эта группа настроек никак не используется. Может быть, в будущем на каждый сайт будет добавляться небольшая печать &amp;laquo;Ускорено при помощи Веб Оптимизатора&amp;raquo; со ссылкой на проект. Но пока решения на эту тему не принято.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Автоматическое изменение &lt;code&gt;/index.php&lt;/code&gt;&lt;/strong&gt;. Web Optimizer поддерживает автоматическое изменение необходимых для корректной работы файлов для нескольких десятков CMS (в случае неизвестной системы ее название выводится как CMS 42, и изменяется всегда корневой &lt;code&gt;index.php&lt;/code&gt;). Перед автоматическим изменением файла запускается цепочная оптимизация сайта, чтобы создать все кэширующие файлы и избежать длительной загрузки главной страницы сайта в первый раз.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Примеры использования&lt;/h3&gt;&lt;p&gt;Web Optimizer &amp;mdash; достаточно мощный и гибкий инструмент для клиентской оптимизации произвольного сайта. Но правильная его настройка требует внимательности и понимания желаемого результата. Давайте рассмотрим некоторые наиболее характерные изменения в конфигурации по умолчанию.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Подключение общего(-их) JavaScript- или CSS-файла(-ов) на всех страницах&lt;/strong&gt;. Достаточно часто мы можем вставить на все страницы какую-то общую JavaScript-библиотеку или таблицу стилей, нужную для всего сайта. Для того чтобы Web Optimizer не пытался объединить этот общий файл со всеми остальными, можно исключить его в конфигурации:&lt;blockquote&gt;&lt;pre&gt;Включить внешние JavaScript-файлы и встроенный код -&amp;gt; Исключить из объединения файлы -&amp;gt; список файлов через запятую&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Отключение CSS Sprites&lt;/strong&gt;. Зафиксированы случаи, когда в силу ряда причин (отсутствия корректной поддержки GDLib на хостинге, ограничениях по памяти, и т.д.) попытка создания CSS Sprites приводит к &amp;laquo;белому экрану&amp;raquo; в браузере (и сайт перестает открываться). В таких случаях обычно помогает полное отключение CSS Sprites:&lt;blockquote&gt;&lt;pre&gt;CSS Sprites -&amp;gt; Применить CSS Sprites -&amp;gt; нет&lt;/pre&gt;&lt;/blockquote&gt;При желании CSS Sprites можно создать вручную через &lt;a href="http://sprites.in/"&gt;Auto Sprites&lt;/a&gt;, указав минимизированный CSS-файл (или объединенный исходный).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Некорректное отображение сайта в IE6&lt;/strong&gt;. В этом случае может помочь простое отключение спрайтов для IE6:&lt;blockquote&gt;&lt;pre&gt;CSS Sprites -&amp;gt; Исключить IE6 (через хаки) из процесса создания CSS Sprites -&amp;gt; да&lt;/pre&gt;&lt;/blockquote&gt;Также возможно, что IE6 некорректно обрабатывает объединение стилей (и наложение фона вместе с рядом других хаков). Тогда может помочь отключение &lt;code&gt;data:URI&lt;/code&gt;&lt;blockquote&gt;&lt;pre&gt;Data:URI -&amp;gt; Применить data:URI -&amp;gt; нет&lt;/pre&gt;&lt;/blockquote&gt;или вообще объединения CSS-файлов:&lt;blockquote&gt;&lt;pre&gt;Настройки сжатия -&amp;gt; Минимизировать и объединить CSS-файлы -&amp;gt; нет&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Безопасная установка&lt;/strong&gt;. Web Optimizer может быть установлен в произвольную директорию (внутри сайта) и защищен с помощью пароля через &lt;code&gt;htpasswd&lt;/code&gt;. Для этого нужно включить:&lt;blockquote&gt;&lt;pre&gt;Использование .htaccess -&amp;gt; Защитить установку Веб Оптимизатора с помощью htpasswd -&amp;gt; да&lt;/pre&gt;&lt;/blockquote&gt;При этом нужно убедиться, чтобы &lt;code&gt;Директории кэширования&lt;/code&gt; были расположены вне папки с самим Web Optimizer (иначе все развалится для всех посетителей сайта кроме вас самих).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Подключение для статического сайта&lt;/strong&gt;. Web Optimizer может быть использован для любого сайта, для которого доступен PHP. Если у вас уже есть статический сайт, то вы можете подключить вызов Web Optimizer в самом верху каждой страницы (или &lt;code&gt;index.php&lt;/code&gt;):&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?php
require(/путь/к/Web/Optimizer/web.optimizer.php);
?&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;и затем в самом низу страницы:&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?php
$web_optimizer-&amp;gt;finish();
?&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;Поскольку в плановом режиме (после создания всеъ кэширующих файлов) высполнение логики Web Optimizer занимает 5-10мс, то на серверную сторону загрузки это не повлияет, зато клиентская будет существенно ускорена. Только надо убедиться, что те страницы, на которые вы добавите вызовы Web Optimizer будут обрабатываться через PHP-интерпретатор (будут иметь расширение &lt;code&gt;.php&lt;/code&gt; или какое-либо другое, определяемое настройками сервера).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Оптимизация по расписанию&lt;/strong&gt;. Уже сейчас Web Optimizer может быть встроен в схему публикации произвольного сайта в &amp;laquo;статическом&amp;raquo; режиме. Для этого необходимо открыть все страницы сайта с установленным Web Optimizer, а потом просто скопировать выведенный HTML и кэширующие директории. Предположим, что Web Optimizer установлен на &lt;code&gt;dev.site.ru&lt;/code&gt;. Запустив, например, &lt;code&gt;wget&lt;/code&gt;&lt;blockquote&gt;&lt;pre&gt;wget -d -r -c http://dev.site.ru/&lt;/pre&gt;&lt;/blockquote&gt;мы получим оптимизированный &amp;laquo;слепок&amp;raquo; сайта, который можно загрузить уже в рабочую систему.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Склейка HTML в одну строку&lt;/strong&gt;. Как уже было описано выше, Web Optimizer может &amp;laquo;слеить&amp;raquo; весь выводимый HTML в одну строку. Для этого нужно включить&lt;blockquote&gt;&lt;pre&gt;Настройки сжатия -&amp;gt; Сжать HTML до 1 строки -&amp;gt; да
Настройки сжатия -&amp;gt; Удалить HTML-комментарии -&amp;gt; да&lt;/pre&gt;&lt;/blockquote&gt;Стоит сразу отметить, что данные настройки вносят дополнительную нагрузку на сервер (корректное регулярное выражение достаточно ресурсоемко) и могут привести к вырезанию некоторого JavaScript-кода (который вставляется через комментарии). Также код внутри &lt;code&gt;script&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt;, &lt;code&gt;pre&lt;/code&gt; изменяться не будет (в соответствии со спецификацией). Поэтому использовать данные настройки нужно с большой осторожностью.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Оптимизация изображений через &lt;a href="http://smush.it/" rel="nofollow"&gt;smush.it&lt;/a&gt;&lt;/strong&gt;. Сервис smush.it разработан инженерами Yahoo! и Google и позволяет оптимизировать размер фоновых изображений в автоматическом режиме. Подключить оптимизацию изображений можно через библиотеку CSS Sprites (данный пример в версии 0.4.9.7 пока не работает, но уже доступен в SVN и будет включен в 0.5):&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?php
require('/полный/путь/до/css.sprites.php');
$smushit = new css_sprites();
$smushit-&gt;smushit('/полный/путь/до/изображения');
?&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;в результате вместо изображения (при наличии прав на его изменение) мы получим его оптимизированную копию. Лучше проводить не на группе рабочих изображениях, а на их копиях, чтобы была возможность откатить изменения.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Загрузить приложение: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;http://code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62009/#comments</comments></item><item><title>Data URI [CSS] Sprites 1.1 - Автоматизация процесса сборки css спрайтов</title><link>http://webo.in/articles/habrahabr/95-data-uri-sprites-1.1/</link><guid>http://webo.in/articles/habrahabr/95-data-uri-sprites-1.1/</guid><description>&lt;p&gt;&lt;img src="http://duris.ru/images/logo.png" width="434" height="85" alt="data:URI [CSS] Sprites" title="data:URI [CSS] Sprites"/&gt;&lt;/p&gt;&lt;p&gt;Многим профессиональным веб-разработчикам известны приемы оптимизации сайтов. Одним из способов оптимизации является использование &lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS спрайтов&lt;/a&gt;. Этим же разработчикам известно, какие существуют трудности с формированием, сборкой и пересборкой стандартных спрайтов. В инете можно найти инструменты для автоматизации этого процесса. При использовании стандартных спрайтов полностью автоматизировать сборку для всех случаев проблематично, из-за специфики background в css. Иногда камнем преткновения является свойство repeat фоновой картинки.&lt;/p&gt;&lt;h3&gt;Data:URI CSS&lt;/h3&gt;&lt;p&gt;Существует альтернативный вариант генерации CSS спрайтов, на основе &lt;a href="http://ru.wikipedia.org/wiki/Data:_URL" rel="nofollow"&gt;&lt;code&gt;data:uri&lt;/code&gt; схемы&lt;/a&gt;. Данный подход интересен тем, что максимально минимизируется кол-во обращений к серверу, + самое важное &amp;mdash; можно &lt;strong&gt;полностью&lt;/strong&gt; автоматизировать процесс сборки и перегенерации спрайтов. Для &lt;strong&gt;полной автоматизации&lt;/strong&gt; процесса оптимизации работы сайтов и сборки css спрайтов на основе &lt;code&gt;data:uri&lt;/code&gt; схемы была разработана специальная библиотека. На базе созданной библиотеки развернут сайт &lt;a href="http://duris.ru/"&gt;Duris.ru&lt;/a&gt;. Те кто ранее не слышал про данную разработку могут почитать &lt;a href="http://webo.in/articles/habrahabr/74-data-uri-sprites-automation/"&gt;предыдущую статью&lt;/a&gt; на эту тему.&lt;/p&gt;&lt;h3&gt;Обновление версия 1.1&lt;/h3&gt;&lt;p&gt;Теперь о главном. Инструмент генерации спрайтов обновился и заимел рад дополнительных возможностей:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;обработка &lt;code&gt;media&lt;/code&gt; в &lt;code&gt;link&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt; &amp;mdash; теперь css стили собираются в зависимости от &lt;code&gt;media&lt;/code&gt;, генерация происходит только для &lt;code&gt;@media = null || all || screen&lt;/code&gt;&lt;/li&gt;&lt;li&gt;улучшена обработка &lt;code&gt;@import&lt;/code&gt;&lt;/li&gt;&lt;li&gt;корректно обрабатываются условные комментарии (comment conditional) для IE&lt;/li&gt;&lt;li&gt;теперь спрайты работают и для IE8, причем независимо от режима работы (при разных &lt;code&gt;X-UA-Compatible&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;устранен ряд ошибок с последовательностью формирования правил в css стилях&lt;/li&gt;&lt;li&gt;добавлена возможность обрабатывать Javascript, а именно склеивать в один файл и применять компрессию&lt;/li&gt;&lt;li&gt;устранены все известные баги&lt;/li&gt;&lt;li&gt;добавлена возможность работы с локальной файловой системы (для интеграции в свои проекты)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Указанный инструмент генерации data:uri спрайтов интегрирован в один из серьезных проектов, естественно показать который на данный момент не могу, но результат интеграции больше чем просто радует. Наконец-то мучения со спрайтами закончены.&lt;/p&gt;&lt;h3&gt;Будущее&lt;/h3&gt;&lt;p&gt;При появлении поддержки в IE8 &lt;code&gt;data:uri&lt;/code&gt; схемы разработанный подход становится довольно перспективным, теперь все современные браузеры поддерживают такие спрайты. Для полного счастья осталось браузеру Opera увеличить размер поддерживаемой &lt;code&gt;data:uri&lt;/code&gt; схемы (пока в Opera имеется ограничение ~ 4кб). &lt;em&gt;Примечание от sunnybear: подтверждения этого найти не удалось, но есть &lt;a href="http://msdn.microsoft.com/en-us/library/cc848897(VS.85).aspx" rel="nofollow"&gt;ограничение на 32Кб в IE8&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Детально ознакомится с принципами генерации и подключения data:uri css спрайтов можно в разделе &lt;a href="http://duris.ru/faq/"&gt;FAQ&lt;/a&gt;. Если у вас возникли вопросы или предложения по работе сайта или алгоритма в целом, вы можете оставить свои пожелания на нашем сайте в виджете обратной связи, или просто пишите в комментарии.&lt;/p&gt;&lt;p&gt;Напоследок, отличная подборка инструментов для генерации CSS спрайтов &lt;a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/"&gt;www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Пользуйтесь на здоровье.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPD&lt;/strong&gt;: Сайт &lt;a href="http://artlebedev.ru/" rel="nofollow"&gt;artlebedev.ru/&lt;/a&gt;, на который настроен duris.ru по умолчанию «в тумане», соот-но чтобы оценить работу вставляйте свои или какие-то другие рабочие на данный момент сайты.&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;Установка Web Optimizer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/86-auto-css-sprites/"&gt;Автогенерация CSS Sprites&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/76-web-evolution/"&gt;Развитие веба с 2000 до 2007&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/74-data-uri-sprites-automation/"&gt;Data:URI CSS Sprites современный подход к генерации CSS спрайтов&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/69-total-image-optimization/"&gt;Оптимизация изображений, часть 3: 4 шага для уменьшения размера файлов &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/67-practical-example/"&gt;Оптимизация загрузки страниц на практике&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/66-online-store-speed-up/"&gt;Эксперимент сколько живых денег может принести ускорение загрузки сайта?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/60757/#comments</comments></item><item><title>Web Optimizer. Часто задаваемые вопросы - 1</title><link>http://webo.in/articles/habrahabr/94-web-optimizer-faq-1/</link><guid>http://webo.in/articles/habrahabr/94-web-optimizer-faq-1/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Добавление DLE в список поддерживаемых систем &lt;a href="http://datalife-engine.net/blog/web-development/123.html" rel="nofollow"&gt;вызвало&lt;/a&gt; &lt;a href="http://skripters.com/raznoe_skripti/3446-web-optimizer.html" rel="nofollow"&gt;бурный&lt;/a&gt; &lt;a href="http://6dle.ru/dle_hak/1113-web-optimizer-046-zastav-datalife-engine-rabotat.html" rel="nofollow"&gt;отклик&lt;/a&gt; (мною замечено порядка 5 новостей на различных &lt;a href="http://4dle.ru/tips/1147157490-web-optimizer-0.4.6-zastav-datalife.html" rel="nofollow"&gt;про-DLE сайтах&lt;/a&gt;), поэтому ниже постараюсь ответить на несколько наиболее распространенных вопросов.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; платный проект?&lt;/strong&gt; Нет, проект (на данный момент) абсолютно бесплатный и загружаемый свободно. Есть некоторые планы по его монетизации, но они пока не озвучены (может быть, платной будет только установка для сайтов с посещаемостью более 1000 хитов в сутки, например). Если у вас есть предложения, которые позволил бы окупить качественную разработку и были бы выгодны вам лично, их можно написать в комментариях.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; от гугла?&lt;/strong&gt; Нет, проект разрабатывается группой активистов (прямо или косвенно связанных с &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt;). &lt;a href="http://code.google.com/" rel="nofollow"&gt;Google Code&lt;/a&gt; &amp;mdash; просто хостинг для файлов и SVN, почти что &lt;a href="http://narod.yandex.ru/" rel="nofollow"&gt;narod.yandex.ru&lt;/a&gt;. Вы же сайты на Народе не называете проектами Яндекса, правда?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; грузит сервер?&lt;/strong&gt; Нет, проект разрабатывается с учетом самых высоких требований к производительности. Наоборот, при правильной настройке сервера нагрузка только уменьшится. Давайте рассмотрим такой случай: на странице у нас находится 3 файла стилей и 5 файлов скриптов. Средний посетитель просматривает за присест 3 страницы. Web Optimizer создаст 1 файл скриптов и 1 файл стилей. При загрузке каждой страницы данные файлы будут только проверены на существование (это менее ресурсоемко, чем их отдача пользователю). За счет клиентского кэширования данные файлы будут запрошены пользователем только при первом заходе на сайт. Итого имеем выигрыш на каждого пользователя в:&lt;blockquote&gt;&lt;pre&gt;(3 + 5) * 3 &amp;mdash; (2 + 2 * 3 *~0,2) ~= 20 запросов к серверу.&lt;/pre&gt;&lt;/blockquote&gt;Налицо явное преимущество.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Фигня полная?&lt;/strong&gt; Нет, не полная :). Проект разрабатывается отечественными разработчиками и по функциональности не имеет аналогов в мире. При правильной установке и настройке способен обеспечить ускорение сайта порядка 10 раз. Обычно это 3-5 раз.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;После установки возможны ошибки?&lt;/strong&gt; Да, естественно. Поскольку приложение некоммерческое, то тестами покрыты далеко не все случаи. Если у вас возникли проблемы в ходе или после установки, то стоит запостить их сюда: &lt;a href="http://code.google.com/p/web-optimizator/issues/list" rel="nofollow"&gt;http://code.google.com/p/web-optimizator/issues/list&lt;/a&gt;. Они будут довольно быстро решены (при воспроизводимой по описанию ошибке).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Сколько гугл запросил за скриптик?&lt;/strong&gt; Пока предложений от гугла не поступало :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Куда и зачем он лезет?&lt;/strong&gt; Алгоритм оптимизатора довольно сложен, в двух словах его не описать. Более-менее подробные документы выложены здесь (на английском): &lt;a href="http://code.google.com/p/web-optimizator/wiki/Welcome"&gt;http://code.google.com/p/web-optimizator/wiki/Welcome&lt;/a&gt;. Если совсем кратко, то &lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; перехватывает выводимый HTML от серверного движка, оптимизирует его (создает кэшированные версии необходимых файлов) и отдает в браузер уже полностью «перелопаченным» (на данный момент изменяется только head-секция + при наличии параллельных хостов меняются пути к ним в самом документе).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Многа букв!&lt;/strong&gt; Здесь все описано намного подробнее: &lt;a href="http://webo.in/articles/"&gt;http://webo.in/articles/&lt;/a&gt;, &lt;a href="http://speedupyourwebsite.ru/books/speed-up-your-website/online/"&gt;http://speedupyourwebsite.ru/books/speed-up-your-website/online/&lt;/a&gt;. Если будет желание, можно значительно увеличить свой багаж знаний о клиентской оптимизации&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Лень раздолбиватся с настройками...&lt;/strong&gt; Настройки по умолчанию конфигурируется для оптимальной производительности при установке приложения. Сам &lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; спроектирован таким образом, чтобы не перегружать ненужной информацией (есть режим «Быстрой установки»). Также доступны опции «Изменение настроек», «Обновление», «Очистка кэша» и «Удаление».&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Если есть еще вопросы &amp;mdash; можно задать в приват, комментариях или по: &lt;a href="http://webo.in/contacts/"&gt;http://webo.in/contacts/&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/60313/#comments</comments></item><item><title>Web Optimizer. Версия 0.4.5 - Release Candidate 2</title><link>http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/</link><guid>http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/</guid><description>&lt;!--#set var="TITLE" value="Web Optimizer. Версия 0.4.5 - Release Candidate 2" --&gt;&lt;!--#include virtual="/includes/top.shtml" --&gt;&lt;div class="i y"&gt;&lt;span&gt;&lt;/span&gt;&lt;i&gt;&lt;/i&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;&lt;a href="http://webo.in/articles/" rel="directory"&gt;Статьи&lt;/a&gt;&lt;i&gt; &lt;/i&gt;&lt;a href="http://webo.in/articles/archive/" rel="directory" class="current"&gt;Архив статей&lt;/a&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;Автор:&lt;/strong&gt; Мациевский Николай aka sunnybear&lt;/div&gt;&lt;div&gt;Опубликована: 13 мая 2009&lt;/div&gt;&lt;/div&gt;


&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer" title="Загрузить Web Optimizer" width="151" height="150"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Можно снова радоваться. Веб-приложение для автоматизации клиентской оптимизации дошло до версии 0.4.5 &amp;mdash; RC 2. Значительно улучшено быстродействие, потребление памяти, добавлено много новых возможностей и поддерживаемых CMS.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;Подробное руководство по установке&lt;/a&gt; (устарело уже, правда)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;Загрузить последнюю версию или мини-установщик&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sprites.in/donate/"&gt;Помочь проекту материально&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Что нового?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Переработано ядро разбора HTML-файла. Теперь весь функционал вызывается только по необходимости и только нужное число раз (таким образом улучшено быстродействие и потребление оперативной памяти). Дополнительно в «зачистке» HTML добавлено удаление комментариев (по умолчанию отключено, ибо не для всех систем безопасно).&lt;/li&gt;
&lt;li&gt;Стили, заданные через &lt;code&gt;&amp;lt;style type="text/css"&amp;gt;&lt;/code&gt; в &lt;code&gt;head&lt;/code&gt;, теперь тоже объединяются (настройка «Объединять внешние файлы и встроенный код»).&lt;/li&gt;
&lt;li&gt;Настройка «Не проверять дату изменения» исправлена. Теперь по умолчанию (наличию файлов в кэше) индекс строится на основе только имен файлов, что исключает множественные обращения к файловой системе (проверяется только существование 1-2 закэшированных файлов).&lt;/li&gt;
&lt;li&gt;Очередной пакет улучшений для CSS Sprites:&lt;ul&gt;
&lt;li&gt;Изменен порядок сортировки изображений для работы с большим количеством «разнокалиберных» изображений.&lt;/li&gt;
&lt;li&gt;Теперь учитываются отступы (&lt;code&gt;padding&lt;/code&gt;), заданные в стилям.&lt;/li&gt;
&lt;li&gt;Добавлена настройка для исключения IE6 из процесса создания спрайтов.&lt;/li&gt;
&lt;li&gt;Исправлена проблема с приоритетами стилей. Теперь отсутствие фона задается через &lt;code&gt;!important&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ускорена работа с полноцветными изображениями (теперь все по умолчанию создается в 32битной палитре).&lt;/li&gt;
&lt;li&gt;Изображения при создании дополнительно проверяются не только по расширению, но и по допустимому формату.&lt;/li&gt;
&lt;li&gt;Добавлено ограничение при создании больших спрайтов (теперь должно работать на системах с 16 или 32 Мб оперативной памяти).&lt;/li&gt;
&lt;li&gt;Добавлена автоматическая оптимизация изображений при помощи API &lt;a href="http://smush.it"&gt;smush.it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Добавлена поддержка множественных хостов для распараллеливания загрузки картинок и проч. Необходимо наличие соответствующих записей в DNS и конфигурации сервера, но возможность загрузки с этих хостов проверяется автоматически (по умолчанию проверяется 16 названий типа &lt;code&gt;img&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;, &lt;code&gt;js&lt;/code&gt;, и т.д.).&lt;/li&gt;
&lt;li&gt;По умолчанию &lt;code&gt;.htaccess&lt;/code&gt; создается в той же папке, что и сайт. Есть настройка для вынесения его в общий Document Root. Также исправлена небольшая ошибка при настройке &lt;code&gt;mod_deflate&lt;/code&gt; (необходим &lt;code&gt;mod_filter&lt;/code&gt;). Улучшена работа сжатия и кэширования при отключенном &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Добавлено сжатие JS через YUI Compressor (требуется установленная java, наличие проверяется автоматически).&lt;/li&gt;
&lt;li&gt;Добавлена HE-локализация (иврит) от &lt;a href="http://mamyta.habrahabr.ru/" rel="nofollow"&gt;mamyta&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Добавлено простейшее кэширование созданного HTML (со задаваемым временем кэширования). Может помочь для совсем «слабых» серверов и CMS, не обладающих этой функциональностью. Надо понимать, что при наличии любой серверной динамики (публикация комментариев, например) данный подход может быть не применим. Также добавлен список частей URL для исключения из логики кэширования (можно сразу не кэшировать часть сайта).&lt;/li&gt;
&lt;li&gt;Добавлена очистка кэша прямо из панели администрирования.&lt;/li&gt;
&lt;li&gt;Все файлы теперь подключаются через абсолютные пути. Это помогло настроить приложения использование для фреймворков.&lt;/li&gt;
&lt;li&gt;В список поддерживаемых систем добавлено:&lt;ul&gt;
&lt;li&gt;Symfony 1.2&lt;/li&gt;
&lt;li&gt;CodeIngiter 1.7 вместе с MaxSite 0.3&lt;/li&gt;
&lt;li&gt;Zend Framework&lt;/li&gt;
&lt;li&gt;MODx 0.9&lt;/li&gt;
&lt;li&gt;DataLife Engine 8.0&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;А также сотня-другая мелких правок и улучшений.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Планы на будущее&lt;/h3&gt;
&lt;p&gt;Следующий выпуск (0.5) будет посвящен безопасности. Планируется полностью изолировать установку Web Optimizer от его работы (и закрыть заодно доступ к нему через &lt;code&gt;.htaccess&lt;/code&gt;). Естественно, в него войдут все замеченные ошибки, часть новых CMS и фреймворков и некоторый новый функционал. Поскольку почти весь план по автоматизации клиентской оптимизации уже выполнен, то текущую версию можно считать весьма близкой к финальной.&lt;/p&gt;
&lt;h3&gt;Дизайн&lt;/h3&gt;
&lt;p&gt;На данный момент у нас готовы макеты дизайна (&lt;a href="http://fade.habrahabr.ru/" rel="nofollow"&gt;fade&lt;/a&gt; ), но верстать и прикручивать клиентскую логику к ним некому. Поэтому если кто хочет поучаствовать в проекте  пока еще не поздно присоединиться. Надеюсь, что новый дизайн войдет в версию 0.5&lt;/p&gt;
&lt;p&gt;&lt;img src="http://i.webo.in/web.optimizer.design.01.png" alt="Дизайн для Web Optimizer" title="Дизайн для Web Optimizer" width="624" height="423"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://i.webo.in/web.optimizer.design.02.png" alt="Дизайн для Web Optimizer" title="Дизайн для Web Optimizer" width="624" height="423"/&gt;&lt;/p&gt;

&lt;h3&gt;Примеры оптимизации&lt;/h3&gt;
&lt;p&gt;Слева YSlow для сайта до установки Web Optimizer, справа тот же самый сайт после установки (сама установки занимает менее минуты). Дополнительного тюнинга (типа ручной настройки CDN-хостов в Firefox) не производилось.&lt;/p&gt;
&lt;h4&gt;LiveStreet 0.3alpha&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://i.webo.in/web.optimizer.livestreet.png" alt="Web Optimizer для LiveSteert 0.3alpha" title="Web Optimizer для LiveSteert 0.3alpha" width="732" height="549"/&gt;&lt;/p&gt;
&lt;h4&gt;MODx 0.9&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://i.webo.in/web.optimizer.modx.png" alt="Web Optimizer для MODx 0.9" title="Web Optimizer для MODx 0.9" width="581" height="249"/&gt;&lt;/p&gt;
&lt;h4&gt;DataLife Engine 8.0&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://i.webo.in/web.optimizer.dle.png" alt="Web Optimizer для DataLife Engine 8.0" title="Web Optimizer для DataLife Engine 8.0" width="672" height="223"/&gt;&lt;/p&gt;

&lt;h3&gt;Монетизация&lt;/h3&gt;
&lt;p&gt;Поскольку регулярно достаточно большое число человек проявляет недюжинную активность и засыпает вопросами, связанными с особенностями конкретного хостинга или интеграцией с конкретной CMS, то большая часть технической поддержки и интеграции будет проводиться далее на платной основе.&lt;/p&gt;
&lt;p&gt;Если вы хотите заказать установку или настройку Web Optimizer для вашего сайта, то &lt;a href="http://webo.in/speed/"&gt;можно воспользоваться этой формой&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Если вы хотите добавить поддержку какой-либо CMS или нашли явный баг, то &lt;a href="http://code.google.com/p/web-optimizator/issues/list" rel="nofollow"&gt;стоит опубликовать запрос здесь&lt;/a&gt;. С вероятностью, близкой к 1, проблема будет решена, и решена достаточно быстро.&lt;/p&gt;

&lt;h3&gt;Использование Web Optimizer&lt;/h3&gt;
&lt;p&gt;Ранее уже заходил разговор о том, как приложение можно внедрять в текущую схему публикации сайта или «оптимизации по расписанию». Поскольку при установке используется «цепочная оптимизация», то никаких сложностей в ее настройке и запуске по событию или по расписанию для произвольных страниц нет. Подробности можно уточнить в привате.&lt;/p&gt;
&lt;p&gt;На данной этапе Web Optimizer можно смело использовать также как API для автоматической оптимизации любой системы. Поскольку лиценция MIT, то достаточно просто сохранить комментарии в PHP-коде.&lt;/p&gt;

&lt;h3&gt;Поддержка&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://twitter.com/dreamwind" rel="nofollow"&gt;Подписаться на twitter-канал&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sprites.in/donate"&gt;Помочь проекту материально&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Вы также можете перевести Web Optimizer на свой язык. Всего сейчас порядка 200 фраз в файле локализации.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;Загрузить последнюю версию или мини-установщик&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;Установка Web Optimizer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/86-auto-css-sprites/"&gt;Автогенерация CSS Sprites&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/76-web-evolution/"&gt;Развитие веба с 2000 до 2007&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/74-data-uri-sprites-automation/"&gt;Data:URI CSS Sprites современный подход к генерации CSS спрайтов&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/69-total-image-optimization/"&gt;Оптимизация изображений, часть 3: 4 шага для уменьшения размера файлов &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/67-practical-example/"&gt;Оптимизация загрузки страниц на практике&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/66-online-store-speed-up/"&gt;Эксперимент сколько живых денег может принести ускорение загрузки сайта?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/54-psychology-web-performance/"&gt;Психология веб-производительности, или когда время равно деньги&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sun, 28 Feb 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/59403/#comments</comments></item><atom:link href="http://webo.in/rss20.xml.gz" rel="self" type="application/rss+xml"/></channel></rss>