Hello my dear friends.
Today we will speed up our rails application using webp images.
What is WebP?
WebP is an image format that employs both lossy and lossless compression. It was developed by Google. As we can see on this page, today only Google Chrome (+ Android) and Opera support this type of images. But it is not a problem. We can show webp images in these browsers, but in another browsers we will show a png, jpg or gif images.
WebP and Ruby on Rails
After the release of webp library I wrote webp gem - webp-ffi. You can use this gem to work with webp images in Ruby. Two good Ruby gems were released later - sprockets-webp and carrierwave-webp. Sprockets-webp provides a Rails Asset Pipeline hook for converting PNG and JPEG assets to the WebP format. At first, just add this gem in the Gemfile:
Put some PNGs and JPGs into “app/assets/images” and you can test converter locally with the Rake task:
Now for each image webp will be created:
If you want to convert images upload by users in your application, you can use carrierwave-webp (of course, if you use for this purpose carrierwave gem).
Nginx with WebP
We have to show webp images only in browsers, which support this format. For this purpose we will use Ngnix web server. Chrome and Opera advertise image/webp on its Accept header for all image requests. Now, we have to configure our Nginx server for automatically choosing the right file.
Then, we check if the Accept header is an advertising WebP. Then we check if there is a corresponding file with a .webp extension on disk. If both conditions match, we serve the WebP asset and add “Vary: Accept” header.
Now we can see results of our work. First we check the speed of loading of our assets in Firefox (full image):
As we can see, many big image have size 145.07 Kb. Now let’s check the result in Chrome (full image):
As we can see, image with size 145.07 Kb was converted in webp image with size 17.2 Kb. Another images also have smaller size, than png or jpeg images. By the way, the visual quality of images has not become worse.
As the result we reduced load time of rails application almoust in 2 times: before we have in average time 800ms, now an average response time of the page is 500ms.
As we can see using webp images, we have accelerated load speed of our application in Chrome and Opera browsers. Hopefully support of this image format will come into sight in Firefox (and maybe in IE).
That’s all folks! Thank you for reading till the end.