This post is on basic site performance tweaks that we make on every site we work on over at Up&Up. We try to keep it updated as our work progresses, but here it is as of now:
Measuring Performance
There's a couple ways you can measure performance. There are some simple, browser based solutions, like Web Page Test, GT Metrix, and Google's PageSpeed Insights.
Those are good to use when you're first starting out as they give you good explanations of the kind of changes you'll need to perform. As you gain more experience with site performance, however, you'll come to see patterns that you'll need to implement for almost every site and you'll want a faster way to run those tests.
Command Line Speed Tests
There are also some fun command line tests. Google's Pagespeed Insights has a node.js wrapper, built by Addy Osmani. If you've got node.js and npm installed, run
npm install -g psi
to install. Then run psi example.com
to get the Pagespeed analysis of your site on mobile and psi example.com --strategy=desktop
to get the desktop analysis.
This test is like golf--high scores are bad. The lower your scores across all the test parameters, the faster your site will be. Tackle the high numbers first to get the biggest gains the fastest.
Basic Performance Tweaks
Here are the standard things that we should always make sure that we are doing.
Leverage Browser Caching
This one shows up all the time. It's a really easy fix--just stick this in the .htaccess
file. If you don't want a certain file type cached for as long, just move it into a different section.
<IfModule mod_headers.c>
# 1 YEAR
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>
# 1 Month
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=2592000, must-revalidate"
</FilesMatch>
# 1 WEEK
<FilesMatch "\.(jpg|jpeg|png|gif|swf|svg|.mp4)$">
Header set Cache-Control "max-age=604800, must-revalidate"
</FilesMatch>
# 1 MIN
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=60, private, must-revalidate"
</FilesMatch>
</IfModule>
Enable GZIP Compression
This one goes in the .htaccess
file as well. Usually if this one pops up it's because svgs aren't being compressed. We add the first two lines to add svgs to the compression.
AddType image/svg+xml .svg
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
Optimizing SVGs
How we handle SVGs is the topic of a yet-to-be written post, but no matter what they should be optimized. There is a really cool SVG optimizer that has a GUI: SVG OMG. You just paste in your svg markup and it spits out the optimized SVG. You can play with all the different settings. Our standard setting is to take all the defaults, and then we also want to enable prettify code and sort attrs. This makes it easier to work with the file in development.
The optimizer also exists in a node.js form. To install run: npm install -g svgo
To run on a file:
svgo test.svg --pretty --enable=sortAttrs
This gives the same output as the SVG OMG GUI with the options we specified.
To run it on a folder:
svgo -f ../path/to/folder/with/svg/files --pretty --enable=sortAttrs
... and BAM! all your svgs are optimized and ready to use. Here's the full documentation: SVGO