DailyJS

Static Site Generators for Yeoman

2013-09-12 00:00:00 +0100 by Alex R. Young

I often find myself being the only guy in the team who can make (or wants to make) a good ol' fashioned website. No dynamic stuff, just a simple static marketing site to sell a product. "No problem," I say confidently, dreaming up designs I can implement rapidly with Vim, Bootstrap, and Glyphish.

The problem I've ran into consistently over the last year or so is Yeoman doesn't do what I think it does. This is what it does in my head:

Here's what it actually does when I use generator-webapp:

Then I realise generator-webapp might not be for me, so I try starting a project from scratch. Then I get into an incredible mess trying to automate the minimization of each Bower component's JavaScript, CSS, and copying assets to a suitable location with Grunt.

I Miss Makefiles

Here's how you copy a file in the shell:

* cp tmp/*/*.min.js site/js/

Here's how you do it with Grunt:

copy: {
  dist: {
    files: [{
      expand: true,
      cwd: 'tmp/',
      src: ['*.min.js'],
      dest: 'site/js/',
      filter: 'isFile'
    },

Not only is it a whole bunch of lines to do something that should be simple, it also has weirdly named properties. I see isFile and start an internal monologue about everything being a file because it's Unix.

I could write a Makefile in two lines that does this.

Yeoman Static Site Generators

This time I decided to persevere: I tried a bunch of static site generators for Yeoman.

There were more but I only have bad things to say about them. What I ended up with was this:

The Shit Sandwich

I think the reason I have difficulty with Yeoman and Grunt is I see client-side development as "open source stuff" and "my stuff". I want open source stuff poured out into buckets that I never look at, in a way that's easy for other people to repeat should they want to install the dependencies fresh (I keep the files in the repository), or experiment with upgraded versions of each module.

Conversely, my stuff should be elegantly encapsulated with a module loader like RequireJS, kept separate and decoupled.

Instead of a neatly organized bento box with very clear sections I end up with a shit sandwich.