Improving page speed with a framework change

Reading time: about 3 minutes

When I migrated my website to Jekyll a few months ago, I used a free template for my layout. Although it looked quite good, it came with a major tradeoff. It used Skel, a JavaScript framework for responsive websites. Skel loads arbitrary CSS stylesheets with JavaScript, based on the user’s screen resolution. This may sound convenient, but the page will load visibly slower, because the stylesheets will only load after all the JavaScript is loaded and executed. See an example of Skel in action in the following listing:

skel.init({
    reset: 'full',
    breakpoints: {
        global:   { range: '*', href: '/css/style.css', containers: 1400, grid: { gutters: 50 } },
        wide:     { range: '-1680', href: '/css/style-wide.css', containers: 1200, grid: { gutters: 40 } },
        normal:   { range: '-1280', href: '/css/style-normal.css', containers: 960, viewport: { scalable: false } },
        narrow:   { range: '-980', href: '/css/style-narrow.css', containers: '95%', grid: { gutters: 30 } },
        narrower: { range: '-840', href: '/css/style-narrower.css', grid: { collapse: 1 } },
        mobile:   { range: '-736', href: '/css/style-mobile.css', containers: '100%', grid: { gutters: 15, collapse: 2 } }
    },
    // ...
});

Replacing Skel with Bootstrap

So I decided to replace Skel with Bootstrap. Bootstrap uses media queries to determine the user’s screen resolution. As media queries are executed when the stylesheet is loaded, the page will display content significantly faster. In the following listing, you can see the differences regarding loaded stylesheets and scripts:

<!-- Before -->
<script src="/js/skel.min.js"></script>
<script src="/js/skel-layers.min.js"></script>
<script src="/js/init.js"></script>

<link rel="stylesheet" href="/css/syntax.css"/>

<noscript>
    <link rel="stylesheet" href="/css/skel.css"/>
    <link rel="stylesheet" href="/css/style.css"/>
    <link rel="stylesheet" href="/css/style-wide.css"/>
    <link rel="stylesheet" href="/css/style-noscript.css"/>
</noscript>

<!-- After -->
<link rel="stylesheet" href="/css/bootstrap.min.css"/>
<link rel="stylesheet" href="/css/bootstrap-grid.min.css"/>
<link rel="stylesheet" href="/css/bootstrap-reboot.min.css"/>
<link rel="stylesheet" href="/css/syntax.css"/>
<link rel="stylesheet" href="/css/style.css"/>

<script src="/js/bootstrap.min.js"></script>

On the other side, the HTML markup got a little more complex - but that’s just the bootstrap way. As long as the page loads faster, I’m happy ;)