Automate all the things

Post on 27-Jan-2015

387 views 2 download

Tags:

description

 

Transcript of Automate all the things

Automate All the Front-End Development Things!

Text

Kitt Hodsden • http://ki.tt • @kitt

1

Kitt Hodsden • @kitt • http://ki.tt/cfo 2

Hi!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Who are you?

3

Kitt Hodsden • @kitt • http://ki.tt/cfo

And what do have we here?

4

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://ki.tt/cfo

5

Kitt Hodsden • @kitt • http://ki.tt/cfo 6

http://ki.tt/cfo

Kitt Hodsden • @kitt • http://ki.tt/cfo 7

http://ki.tt/cfo

http://ki.tt/cfo

Kitt Hodsden • @kitt • http://ki.tt/cfo

Wait... what?

8

What are we talking about?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Wait... what?

9

What are we talking about?

Kitt Hodsden • @kitt • http://ki.tt/cfo

You are invited to participate in group note taking at:

http://ki.tt/cfo14notes

10

Community knowledge!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Prerequisites!

11

Kitt Hodsden • @kitt • http://ki.tt/cfo

node & ruby

12

We need node and ruby to use the tools we’re going to talk about.

Kitt Hodsden • @kitt • http://ki.tt/cfo 13

Setup node by downloading the installer and running it.

http://nodejs.org

Kitt Hodsden • @kitt • http://ki.tt/cfo 14

# mac / linux$ which ruby/usr/local/bin/ruby$ ruby --version ruby 2.0.0p195

# windows> where rubyC:\Ruby200\bin\ruby.exe> ruby --versionruby 2.0.0p451

Yay! Sass installed!See if you already have ruby installed

Kitt Hodsden • @kitt • http://ki.tt/cfo 15

HOMEBREWhttp://mxcl.github.com/homebrew/$ brew install ruby

RVM RUBY VERSION MANAGERhttps://rvm.io/rvm/install

Install ruby in different ways on OSX

OSX

Kitt Hodsden • @kitt • http://ki.tt/cfo 16

HOMEBREWhttp://mxcl.github.com/homebrew/$ brew install ruby

RVM RUBY VERSION MANAGERhttps://rvm.io/rvm/install

Install ruby in different ways on OSX

OSX

Kitt Hodsden • @kitt • http://ki.tt/cfo 17

https://unfiniti.com/software/mac/jewelrybox

Ruby on OSX, I recommend JewelryBox, too.

Kitt Hodsden • @kitt • http://ki.tt/cfo 18

APT / YUM$ sudo apt-get install ruby1.9.1$ sudo yum install ruby1.9.1

RVM RUBY VERSION MANAGERhttps://rvm.io/rvm/install

Install ruby in different ways on Linux

Linux

Kitt Hodsden • @kitt • http://ki.tt/cfo 19

APT / YUM$ sudo apt-get install ruby1.9.1$ sudo yum install ruby1.9.1

RVM RUBY VERSION MANAGERhttps://rvm.io/rvm/install

Install ruby in different ways on Linux

Linux

Kitt Hodsden • @kitt • http://ki.tt/cfo 20

RUBYINSTALLERhttp://rubyinstaller.org/downloads/

PIKhttps://github.com/vertiginous/pik

Install ruby in different ways on Windows

Windows

Kitt Hodsden • @kitt • http://ki.tt/cfo 21

RUBYINSTALLERhttp://rubyinstaller.org/downloads/

PIKhttps://github.com/vertiginous/pik

Install ruby in different ways on Windows

Windows

CYGWINhttp://cygwin.com

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://ki.tt/cfo

22

Kitt Hodsden • @kitt • http://ki.tt/cfo 23

Kitt Hodsden • @kitt • http://ki.tt/cfo 24

Automate All the Front-End Development Things!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Make your Front-End Workflow AWESOME

25

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle

26

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy

27

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

28

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototype

29

What magic do we do?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designs

30

What magic do we do?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsers

31

What magic do we do?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

32

What magic do we do?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

33

What magic do we do?

Kitt Hodsden • @kitt • http://ki.tt/cfo 34

We’re MAGICAL

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

35

Kitt Hodsden • @kitt • http://ki.tt/cfo 36

How often do we have a blank slate, really?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

37

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

38

Kitt Hodsden • @kitt • http://ki.tt/cfo

change.click.

change.click.

39

Kitt Hodsden • @kitt • http://ki.tt/cfo

change.click.

change.click.

40

change.click.

change.click.

change.click.

change.click.change.

click.change.

click.

change.click.

change.click.

change.click.

change.click.

change.click.

change.click. change.

click.change.

click.

change.click.

change.click.

change.click.

change.click.change.

click.change.

click.

Kitt Hodsden • @kitt • http://ki.tt/cfo 41

Guiding principles!

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

Kitt Hodsden • @kitt • http://ki.tt/cfo 42

Kitt Hodsden • @kitt • http://ki.tt/cfo

LiveReload

43

http://livereload.com/

Kitt Hodsden • @kitt • http://ki.tt/cfo 44

Kitt Hodsden • @kitt • http://ki.tt/cfo 45

http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-

http://ki.tt/LR

Kitt Hodsden • @kitt • http://ki.tt/cfo 46

http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-

http://ki.tt/LR

Kitt Hodsden • @kitt • http://ki.tt/cfo 47

or!

Kitt Hodsden • @kitt • http://ki.tt/cfo 48

<script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script>

If you don’t use browser plugins, you need this JS for LiveReload

Kitt Hodsden • @kitt • http://ki.tt/cfo 49

<cfoutput><script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script></cfoutput>

If you don’t use browser plugins, you need this JS for LiveReload

Kitt Hodsden • @kitt • http://ki.tt/cfo 50

Kitt Hodsden • @kitt • http://ki.tt/cfo

IE options

http://github.com/dvdotsenko/livereload_ie_extension

http://reloadit.codeplex.com/

51

LiveReload IE options

Kitt Hodsden • @kitt • http://ki.tt/cfo 52

Kitt Hodsden • @kitt • http://ki.tt/cfo 53

Guiding principles!

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

Kitt Hodsden • @kitt • http://ki.tt/cfo

browser-sync

54

http://browsersync.io/

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://ki.tt/cfo

55

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm

56

Node Package Manager for installng node packages

Kitt Hodsden • @kitt • http://ki.tt/cfo 57

Open a new terminal or command window

Kitt Hodsden • @kitt • http://ki.tt/cfo 58

In OSX, drag and drop the folder into the terminal window for the path.

Kitt Hodsden • @kitt • http://ki.tt/cfo 59

In Windows, use right click cut and paste

Kitt Hodsden • @kitt • http://ki.tt/cfo 60

// save this into run-server.jsvar connect = require('connect');connect.createServer( connect.static(__dirname)).listen(8080);

If you don’t have a local development environment, use this run-server.js

Kitt Hodsden • @kitt • http://ki.tt/cfo 61

$ npm install connect...$ node run-server.js

# open http://localhost:8080/index.html# control-c to stop

If you don’t have a local development environment, install the connect package

Kitt Hodsden • @kitt • http://ki.tt/cfo 62

> npm install connect...> node run-server.js

# open http://127.0.0.1:8080/index.html# control-c to stop

If you don’t have a local development environment on Windows, install the connect package

Kitt Hodsden • @kitt • http://ki.tt/cfo 63

You can accept this local JS file running on node, turn it off later!

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://localhost:8080/index.html

http://127.0.0.1:8080/index.html

64

You can see the temporary site running locally!

Kitt Hodsden • @kitt • http://ki.tt/cfo

browser-sync

65

http://browsersync.io/

Kitt Hodsden • @kitt • http://ki.tt/cfo 66

$ npm install -g browser-sync

Kitt Hodsden • @kitt • http://ki.tt/cfo 67

$ browser-sync$

Kitt Hodsden • @kitt • http://ki.tt/cfo 68

$ browser-sync start --server --files "css/*.css"

Kitt Hodsden • @kitt • http://ki.tt/cfo

bs-config.js

69

Kitt Hodsden • @kitt • http://ki.tt/cfo 70

$ browser-sync init[BS] Config file created (bs-config.js)[BS] To use it, in the same directory run: browser-sync$

Kitt Hodsden • @kitt • http://ki.tt/cfo 71

module.exports = { files: "css/*.css", proxy: { host: "localhost", port: 8080 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true,};

https://github.com/shakyShane/browser-sync/wiki/options

Kitt Hodsden • @kitt • http://ki.tt/cfo

module.exports = { files: "css/*.css", proxy: { host: "localhost", port: 8080 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true,};

72

https://github.com/shakyShane/browser-sync/wiki/options

Kitt Hodsden • @kitt • http://ki.tt/cfo 73

module.exports = { files: ["css/*.css", "**.*.html", "js/**/*.js"], proxy: { host: "localhost", port: 8080 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true,};

https://github.com/shakyShane/browser-sync/wiki/options

Kitt Hodsden • @kitt • http://ki.tt/cfo

https://github.com/shakyShane/browser-sync/wiki/options

74

Kitt Hodsden • @kitt • http://ki.tt/cfo 75

$ browser-sync start

Kitt Hodsden • @kitt • http://ki.tt/cfo 76

$ browser-sync start[BS] Copy the following snippet into your website, just before the closing </body> tag

<script src='//192.168.5.6:3000/socket.io/socket.io.js'></script><script>var ___socket___ = io.connect('http://192.168.5.6:3000');</script><script src='//192.168.5.6:3001/client/browser-sync-client.0.7.0.js'></script>

[BS] Watching files...

Kitt Hodsden • @kitt • http://ki.tt/cfo 77

Kitt Hodsden • @kitt • http://ki.tt/cfo 78

MAGICAL

Kitt Hodsden • @kitt • http://ki.tt/cfo

click.copy.scroll.click.paste.

79

Kitt Hodsden • @kitt • http://ki.tt/cfo 80

Kitt Hodsden • @kitt • http://ki.tt/cfo

Alfredhttp://alfredapp.com/

Quicksilverhttp://qsapp.com/

Launchbarhttp://www.obdev.at/products/launchbar/

81

Kitt Hodsden • @kitt • http://ki.tt/cfo

Skylighthttp://www.candylabs.com/skylight

Launchyhttp://www.launchy.net/http://pylaunchy.sourceforge.net/docs/

82

Kitt Hodsden • @kitt • http://ki.tt/cfo

Gnome Launch Boxhttps://live.gnome.org/

Gnome Dohttp://do.davebsd.com/

Launchyhttp://www.launchy.net/http://pylaunchy.sourceforge.net/

83

Kitt Hodsden • @kitt • http://ki.tt/cfo 84

Kitt Hodsden • @kitt • http://ki.tt/cfo 85

Kitt Hodsden • @kitt • http://ki.tt/cfo 86

Kitt Hodsden • @kitt • http://ki.tt/cfo 87

Kitt Hodsden • @kitt • http://ki.tt/cfo 88

Kitt Hodsden • @kitt • http://ki.tt/cfo 89

Alfred looking up jQuery.

Kitt Hodsden • @kitt • http://ki.tt/cfo 90

Dash has a large number of document sets

Kitt Hodsden • @kitt • http://ki.tt/cfo 91

Naïve way to open all the browsers at once

Kitt Hodsden • @kitt • http://ki.tt/cfo 92

https://github.com/zenorocha/alfred-workflows/

https://github.com/aiyodk/Alfred-Extensions/tree/master/AlfredApp_2.x

https://github.com/willfarrell/alfred-workflows

Alfred Workflows

Kitt Hodsden • @kitt • http://ki.tt/cfo

Can you feel the awesome?

93

Awwwwwwwww yissssssssssssssssssss!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

94

Kitt Hodsden • @kitt • http://ki.tt/cfo 95

Kitt Hodsden • @kitt • http://ki.tt/cfo 96

$ npm install -g grunt-cli

Install the grunt package

Kitt Hodsden • @kitt • http://ki.tt/cfo 97

Windows users, use PowerShell

Kitt Hodsden • @kitt • http://ki.tt/cfo 98

$ npm install -g grunt-init

$ git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile

$ grunt-init gruntfile

Download the grunt template files and generate the grunt config files ...

Kitt Hodsden • @kitt • http://ki.tt/cfo

Or just download them.http://ki.tt/fgrf

99

Kitt Hodsden • @kitt • http://ki.tt/cfo 100

package.jsonGruntfile.js

The two files grunt uses

Kitt Hodsden • @kitt • http://ki.tt/cfo 101

{ "engines": { "node": ">= 0.10.0" }, "devDependencies": { "grunt": "~0.4.2", "grunt-contrib-jshint": "~0.7.2", "grunt-contrib-watch": "~0.5.3", }}

This is what a package.json file looks like

Kitt Hodsden • @kitt • http://ki.tt/cfo 102

$ npm install

With a package.json file, you can install the needed packages easily.

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Watch for file changes2. Refresh the browser on change

103

What we want grunt to do.

Kitt Hodsden • @kitt • http://ki.tt/cfo 104

module.exports = function(grunt) {

// Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } });

// Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify');

// Default task(s). grunt.registerTask('default', ['uglify']);

};

A basic Gruntfile.js file

Kitt Hodsden • @kitt • http://ki.tt/cfo 105

module.exports = function(grunt) {

// Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } });

// Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify');

// Default task(s). grunt.registerTask('default', ['uglify']);

};

A basic Gruntfile.js file

Kitt Hodsden • @kitt • http://ki.tt/cfo 106

module.exports = function(grunt) {

// Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } });

// Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify');

// Default task(s). grunt.registerTask('default', ['uglify']);

};

A basic Gruntfile.js file

Kitt Hodsden • @kitt • http://ki.tt/cfo 107

module.exports = function(grunt) {

// Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } });

// Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify');

// Default task(s). grunt.registerTask('default', ['uglify']);

};

A basic Gruntfile.js file

Kitt Hodsden • @kitt • http://ki.tt/cfo

browser-sync

108

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Find grunt plugin*2. Install with npm install --save-dev3. Add the task to our Gruntfile.js file4. Add the tasks to a command5. Run the command...7. Profit!

*write if you need to

109

How to add a task to grunt

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://npmjs.org

110

Where to find node and grunt packages

Kitt Hodsden • @kitt • http://ki.tt/cfo

“grunt browser-sync”

111

What I searched for on npmjs.org

Kitt Hodsden • @kitt • http://ki.tt/cfo

THIS IS OKAY.

112

Kitt Hodsden • @kitt • http://ki.tt/cfo 113

Check for current state before downloading.

Kitt Hodsden • @kitt • http://ki.tt/cfo 114

$ npm install grunt-browser-sync --save-dev

Installing the browser-sync grunt package

Kitt Hodsden • @kitt • http://ki.tt/cfo 115

$ lsGemfile!! README.txt fonts node_modules template.phpGemfile.lock bs-config.js images package.json templatesGruntfile.js config.rb js screenshot.png theme.infoGuardfile! css logo.png scss widgets

Kitt Hodsden • @kitt • http://ki.tt/cfo 116

"grunt-browser-sync": "~0.7.0"

Kitt Hodsden • @kitt • http://ki.tt/cfo 117

browserSync: { bsFiles: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8082 }, server: false, } },

Kitt Hodsden • @kitt • http://ki.tt/cfo 118

browserSync: { bsFiles: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8082 }, server: false, } },

Kitt Hodsden • @kitt • http://ki.tt/cfo 119

browserSync: { bsFiles: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8082 }, server: false, } },

Kitt Hodsden • @kitt • http://ki.tt/cfo 120

watch: { gruntfile: { files: '<%= jshint.gruntfile.src %>', tasks: ['jshint:gruntfile'] }, scss: {        files: ['scss/*.scss'],        tasks: ['sass:dev']      },      js: { // watch for js changes except for script.min.js        files: ['js/*.js', '!js/script.min.js'],         tasks: ['uglify:dev']      } }

Kitt Hodsden • @kitt • http://ki.tt/cfo 121

grunt.loadNpmTasks('grunt-browser-sync');

...

grunt.registerTask('default', ['browserSync', ‘watch’]);

Kitt Hodsden • @kitt • http://ki.tt/cfo 122

grunt.registerTask('gogogo', ['browserSync', 'watch']);

Kitt Hodsden • @kitt • http://ki.tt/cfo 123

$ grunt gogogo

Running the newly defined “gogogo” command

Kitt Hodsden • @kitt • http://ki.tt/cfo 124

Kitt Hodsden • @kitt • http://ki.tt/cfo 125

modern.ie

Kitt Hodsden • @kitt • http://ki.tt/cfo 126

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

127

Kitt Hodsden • @kitt • http://ki.tt/cfo

Javascript?

128

Kitt Hodsden • @kitt • http://ki.tt/cfo 129

1. Find grunt plugin*2. Install with npm install --save-dev3. Add the task to our Gruntfile.js file4. Add the tasks to a command5. Run the command...7. Profit!

*write if you need to

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

130

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo 131

$ npm install matchdep --save-dev

Installing the browser-sync grunt package

Kitt Hodsden • @kitt • http://ki.tt/cfo 132

...

// load all the grunt modules instead of one each linerequire("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks);

grunt.registerTask('checkjs', ['jshint']);grunt.registerTask('watchjs', ['jshint', 'watch']);grunt.registerTask('gruntjs', ['jshint:gruntfile', 'watch']);

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

133

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

jshint

134

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-jshint --save-dev

135

Use jshint when editing your Gruntfile.js

https://github.com/gruntjs/grunt-contrib-jshint

Kitt Hodsden • @kitt • http://ki.tt/cfo 136

jshint: { options: { ... }, gruntfile: { src: ‘Gruntfile.js’ }}

...

grunt.loadNpmTasks('grunt-contrib-jshint');

grunt.registerTask('checkjs', ['jshint']);grunt.registerTask('watchjs', ['jshint', 'watch']);grunt.registerTask('gruntjs', ['jshint:gruntfile', 'watch']);

Kitt Hodsden • @kitt • http://ki.tt/cfo 137

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-qunit --save-dev

138

Javascript unit tests

https://github.com/gruntjs/grunt-contrib-qunit

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-jasmine --save-dev

139

Javascript unit tests

https://github.com/gruntjs/grunt-contrib-jasmine

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-simple-mocha --save-dev

140

Javascript unit tests

https://github.com/yaymukund/grunt-simple-mocha

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

141

Kitt Hodsden • @kitt • http://ki.tt/cfo

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

142

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

143

Kitt Hodsden • @kitt • http://ki.tt/cfo 144

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo

Images

145

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-imagemin --save-dev

146

Make pages load faster by reducing image sizes

Kitt Hodsden • @kitt • http://ki.tt/cfo 147

imagemin: { prod: { files: [{ expand: true, cwd: 'imgs-src/', src: ['**/*.{png,jpg,gif}'], dest: 'imgs/' }] }}

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-svgmin --save-dev

148

Reduce SVG sizes, too

Kitt Hodsden • @kitt • http://ki.tt/cfo 149

grunt.initConfig({ svgmin: { // Task options: { // Configuration that will be passed directly to SVGO plugins: [ { removeViewBox: false }, { removeUselessStrokeAndFill: false } ] }, dist: { // Target files: [{ // Dictionary of files expand: true, // Enable dynamic expansion. cwd: 'img/src', // Src matches are relative to this path. src: ['**/*.svg'], // Actual pattern(s) to match. dest: 'img/', // Destination path prefix. ext: '.min.svg' // Dest filepaths will have this extension. // ie: optimise img/src/branding/logo.svg and store it in img/branding/logo.min.svg }] }});

grunt.loadNpmTasks('grunt-svgmin');grunt.registerTask('default', ['svgmin']);

Sample grunt-svgmin configuration

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-responsive-images --save-dev

150

Responsive images by resizing

https://github.com/andismith/grunt-responsive-images

Kitt Hodsden • @kitt • http://ki.tt/cfo 151

grunt.initConfig({ responsive_images: { myTask: { options: { sizes: [{ width: 320, height: 240 },{ name: 'large', width: 640 },{ name: "large", width: 1024, suffix: "_x2", quality: 60 }] }, files: [{ expand: true, src: ['assets/**.{jpg,gif,png}'], cwd: 'test/', dest: 'resize/{%= width %}/' }] } },});

Sample grunt-responsive-images configuration

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-grunticon --save-dev

152

SVG with PNG fallbacks

https://github.com/filamentgroup/grunticon

Kitt Hodsden • @kitt • http://ki.tt/cfo

Non-images

153

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-cssmin --save-dev

154

Minimize CSS files

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-csscss --save-dev

155

Minimize CSS files

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-uglify --save-dev

156

Minimize javascript files

Kitt Hodsden • @kitt • http://ki.tt/cfo 157

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo

Sprites!

158

Making things easier with sprites!

Kitt Hodsden • @kitt • http://ki.tt/cfo

WHOO!159

Kitt Hodsden • @kitt • http://ki.tt/cfo

Creating them is EASY!

160

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-montage --save-dev

161

Sprite your images

Kitt Hodsden • @kitt • http://ki.tt/cfo 162

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo 163

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

164

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

Change the font BLUE

165

Easiest change ever!

Kitt Hodsden • @kitt • http://ki.tt/cfo

#6c869d ⇒ #212939

166

Easiest change ever!

Kitt Hodsden • @kitt • http://ki.tt/cfo 167

Well, phooey. The ticket was reopened.

Kitt Hodsden • @kitt • http://ki.tt/cfo 168

Soon, EVERYTHING is important!

Kitt Hodsden • @kitt • http://ki.tt/cfo 169

Kitt Hodsden • @kitt • http://ki.tt/cfo 170

Kitt Hodsden • @kitt • http://ki.tt/cfo 171

Guiding principles!

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

Kitt Hodsden • @kitt • http://ki.tt/cfo 172

Guiding principles!

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

Kitt Hodsden • @kitt • http://ki.tt/cfo

Use a CSS preprocessor.

173

Saw that coming, didn’t you?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Sass / LESS / Stylus

174

Saw that coming, didn’t you?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Quick Check!

Did you go to Andy Matthews Sass session?

175

Kitt Hodsden • @kitt • http://ki.tt/cfo

Are we passing GO?Are we collecting $200?

176

Kitt Hodsden • @kitt • http://ki.tt/cfo

Sass ⟳ CSS

177

Kitt Hodsden • @kitt • http://ki.tt/cfo

Getting started with Sass

178

Kitt Hodsden • @kitt • http://ki.tt/cfo

Install it.

179

Kitt Hodsden • @kitt • http://ki.tt/cfo 180

$ gem update --system$ gem install sass

$ sudo gem update --system$ sudo gem install sass

Yay! Sass installed!

Kitt Hodsden • @kitt • http://ki.tt/cfo

COMPASS

181

Install Compass, too

http://compass-style.org/install/

Kitt Hodsden • @kitt • http://ki.tt/cfo 182

$ gem update --system$ gem install compass

$ sudo gem update --system$ sudo gem install compass

Setting up tools. In this case, Compass.

Kitt Hodsden • @kitt • http://ki.tt/cfo

CSS ⇒ Sass

183

Kitt Hodsden • @kitt • http://ki.tt/cfo

Let us count the (3) ways.

184

How we get started with Sass in an existing project.

Kitt Hodsden • @kitt • http://ki.tt/cfo

Move and rename files.

185

How we get started with Sass in an existing project.

Kitt Hodsden • @kitt • http://ki.tt/cfo 186

$ mkdir scss$ mv css/styles.css scss/styles.scss

Setting up tools. In this case, Compass.

Kitt Hodsden • @kitt • http://ki.tt/cfo

Use sass-convert

187

How we get started with Sass in an existing project.

Kitt Hodsden • @kitt • http://ki.tt/cfo 188

$ sass-convert --helpUsage: sass-convert [options] [INPUT] [OUTPUT] $$ cd theme-dir$ sass-convert --recursive --from=css --to=scss css scss

Setting up tools. In this case, Compass.

Kitt Hodsden • @kitt • http://ki.tt/cfo

Use http://css2sass.heroku.com

189

How we get started with Sass in an existing project.

Kitt Hodsden • @kitt • http://ki.tt/cfo 190

Kitt Hodsden • @kitt • http://ki.tt/cfo

$variables

191

Quick! Sass in 5 slides!

Kitt Hodsden • @kitt • http://ki.tt/cfo 192

$variable: value;

Before variables...

Kitt Hodsden • @kitt • http://ki.tt/cfo 193

dev[405]% grep background-color * style.css: background-color: #edf5fa;style.css: background-color: #ddecf5;style.css: background-color: #e6f1f7;style.css: background-color: #d4e7f3;style.css: background-color: #edf5fa;style.css: background-color: #fcfce8;style.css: background-color: #fcf9e5;style.css: background-color: #fbf5cf;style.css: background-color: #fefefe;style.css: background-color: #f5f5f5;style.css: background-color: #fdf5e6;style.css: background-color: #fdf2de;style.css: background-color: #fbe4e4;style.css: background-color: #fbdbdb;style.css: background-color: #ffcccc;style.css: background-color: #ffffdd;style.css: background-color: #ddffdd;

Before variables...

Kitt Hodsden • @kitt • http://ki.tt/cfo 194

$color-main: rgb(255,251,114);$color-second: rgb(70,87,204);$color-hilite: rgb(189,177,255);

...

.button { background-color: $color-main; ...}

See? Easy!

Kitt Hodsden • @kitt • http://ki.tt/cfo 195

$font-times: Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", serif;

$font-garamond: "Palatino Linotype", Palatino, Palladio, "URW Palladio L", "Book Antiqua", Baskerville, "Bookman Old Style", "Bitstream Charter", "Nimbus Roman No9 L", Garamond, "Apple Garamond", "ITC Garamond Narrow", "New Century Schoolbook", "Century Schoolbook", "Century Schoolbook L", Georgia, serif;

Uses of variables: fonts

http://css-tricks.com/snippets/css/font-stacks/

Kitt Hodsden • @kitt • http://ki.tt/cfo 196

$color-main: #ff0000;$border-main: 2px solid $color-main;.multivalue-example { border-top: $border-main;}

# compiles to.multivalue-example { border-top: 2px solid red;}

See? Easy!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Variable name best practice.

197

Kitt Hodsden • @kitt • http://ki.tt/cfo 198

$ourBlue : #1f4363;$ourBlueLight : #355673;$ourBlueLighter : #6c869d;$ourBlueDark : #0e2c47;$ourBlueDarker : #212939;$ourBlueHover : #7e99b3;

...

$color_border $ourBlue;$color_link: $ourBlue;$table_header: $ourBlueLighter;

Use descriptive AND functional variable names

http://sachagreif.com/sass-color-variables

Kitt Hodsden • @kitt • http://ki.tt/cfo

Nested syntax

199

Quick! Sass in 5 slides!

Kitt Hodsden • @kitt • http://ki.tt/cfo 200

.navigation {

a {

display: block; padding: .5em; color: $color-link; border: none; } b {

font-size: .9em; } span { display: block; font-size: .8em; }

}

.navigation a {

display: block;

padding: .5em;

color: #444040;

border: none;

}

.navigation b {

font-size: .9em;

}

.navigation span {

display: block;

font-size: .8em;

}

Sass syntax, talking nesting

Kitt Hodsden • @kitt • http://ki.tt/cfo 201

.navigation {

a {

display: block; padding: .5em; &:hover {

color: $color-link; border: none; } } &>.first { padding-left: 0; }}

Sass syntax, talking nesting

Kitt Hodsden • @kitt • http://ki.tt/cfo

@extend

202

Quick! Sass in 5 slides!

Kitt Hodsden • @kitt • http://ki.tt/cfo 203

Sass syntax, talking @extend

.box { padding: 2em; color: $color-text; background-color: $color-bg;}

.box-warning { @extend .box; border: 2px dotted $color-yikes;}

.box-success { @extend .box; border: 2px dotted $color-success;}

.box-info { @extend .box; border: 2px dotted $color-info;}

Kitt Hodsden • @kitt • http://ki.tt/cfo 204

Sass syntax, talking @extend

.box, .box-warning, .box-success, .box-info { padding: 2em; color: #333333; background-color: white;}

.box-warning { border: 2px dotted #cc0000;}

.box-success{ border: 2px dotted #33cc00;}

.box-info { border: 2px dotted #996633;}

Kitt Hodsden • @kitt • http://ki.tt/cfo

<div class=”box box-info”>...</div>

205

Sass syntax, talking @extend

Kitt Hodsden • @kitt • http://ki.tt/cfo 206

Sass syntax, talking @extend

<div class=”box-info”>...</div>

Kitt Hodsden • @kitt • http://ki.tt/cfo

@mixin@include

207

Quick! Sass in 5 slides!

Kitt Hodsden • @kitt • http://ki.tt/cfo 208

Sass syntax, @mixin

@mixin module($parent-color) { color: darken($parent-color, 50%); }

.main_module { @include module(#ccc); min-height: 3em;}

.sidebar_module { @include module(#444); min-height: 2em;}

Kitt Hodsden • @kitt • http://ki.tt/cfo

When you can, use a Compass mixin.

209

Kitt Hodsden • @kitt • http://ki.tt/cfo 210

Sass syntax, @mixin

@import "compass/css3/box-sizing";* { @include box-sizing(border-box); }

http://compass-style.org/reference/compass/css3/box_sizing/

Kitt Hodsden • @kitt • http://ki.tt/cfo

@mixin vs @extend

211

Sass Overview

Kitt Hodsden • @kitt • http://ki.tt/cfo

You’re awesome.

212

Kitt Hodsden • @kitt • http://ki.tt/cfo

_partials.scss

213

Quick! Sass in 5 slides!

Kitt Hodsden • @kitt • http://ki.tt/cfo 214

Sass syntax, @mixin

@import "vars";@import "mixins";@import "layouts/*";

Kitt Hodsden • @kitt • http://ki.tt/cfo 215

Quick! Sass in 5 slides!

@if/@else

@for

@each

@functions (return a single value)

Kitt Hodsden • @kitt • http://ki.tt/cfo

Media Queriesmade EASY

216

Kitt Hodsden • @kitt • http://ki.tt/cfo 217

@mixin bp($point) { $bp-mobile: "(max-width: 600px)"; $bp-notso: "(max-width: 1250px)"; $bp-fullon: "(max-width: 1600px)";

@if $point == mq-fullon { @media #{$bp-fullon} { @content; } } @else if $point == mq-notso { @media #{$bp-notso} { @content; } } @else if $point == mq-mobile { @media #{$bp-mobile} { @content; } }}

Kitt Hodsden • @kitt • http://ki.tt/cfo 218

h1 { font-size: 20px; font-family: $font-main; @include bp(mq-notso) { font-size: 30px; } @include bp(mq-fullon) { font-size: 60px; }}

Kitt Hodsden • @kitt • http://ki.tt/cfo 219

h1 { font-size: 20px;}@media (max-width: 1250px) { h1 { font-size: 30px; }}@media (max-width: 1600px) { h1 { font-size: 60px; }}

Kitt Hodsden • @kitt • http://ki.tt/cfo 220

Guiding principles!

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

Kitt Hodsden • @kitt • http://ki.tt/cfo

More Information.

221

Sass for DesignersPragmatic Guide To Sass

Sass and Compass in Action

Kitt Hodsden • @kitt • http://ki.tt/cfo 222

sass --watch --line-numbers --style expanded scss:css

Kitt Hodsden • @kitt • http://ki.tt/cfo

Compass has its config.rb

223

Kitt Hodsden • @kitt • http://ki.tt/cfo 224

Kitt Hodsden • @kitt • http://ki.tt/cfo 225

compass config config.rb --sass-dir=scss \--css-dir=css --javascripts-dir=js \--output-style=expanded

How to create a compass conifig.rb file

Kitt Hodsden • @kitt • http://ki.tt/cfo 226

$ compass watch

Kitt Hodsden • @kitt • http://ki.tt/cfo

GUI

227

Kitt Hodsden • @kitt • http://ki.tt/cfo 228

https://incident57.com/codekit/

Kitt Hodsden • @kitt • http://ki.tt/cfo 229

http://compass.kkbox.com/

Kitt Hodsden • @kitt • http://ki.tt/cfo 230

http://koala-app.com/

Kitt Hodsden • @kitt • http://ki.tt/cfo 231

https://github.com/vladikoff/grunt-devtools

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Watch for file changes2. Compile our Sass to CSS3. Refresh the browser on change

232

What we want grunt to do.

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-contrib-compass --save-dev

233

Installing the compass compiling node package

Kitt Hodsden • @kitt • http://ki.tt/cfo 234

grunt.initConfig({ compass: { dist: { options: { config: 'config.rb' } } }});

Kitt Hodsden • @kitt • http://ki.tt/cfo 235

grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, }});

Kitt Hodsden • @kitt • http://ki.tt/cfo 236

grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, }});

Kitt Hodsden • @kitt • http://ki.tt/cfo 237

grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, }});

Kitt Hodsden • @kitt • http://ki.tt/cfo 238

compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }

Kitt Hodsden • @kitt • http://ki.tt/cfo 239

grunt.loadNpmTasks('grunt-contrib-compass');

...

grunt.registerTask('default', ['compass:dev', ‘watch’]);

Kitt Hodsden • @kitt • http://ki.tt/cfo 240

Kitt Hodsden • @kitt • http://ki.tt/cfo 241

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo 242

@import "compass/utilities/sprites";

...

$sprites-spacing: 20px;@import “../img/sprites/*png”;

Creating sprite images with Compass

Kitt Hodsden • @kitt • http://ki.tt/cfo 243

@import "compass/utilities/sprites";

...

$orange-spacing: 20px;@import “../img/orange/*png”;

Sprite names are dependent on your directory name

Kitt Hodsden • @kitt • http://ki.tt/cfo 244

@import "compass/utilities/sprites";

...

$awesome-spacing: 20px;@import “../img/awesome/*png”;

Sprite names are dependent on your directory name

Kitt Hodsden • @kitt • http://ki.tt/cfo 245

Using generated sprites

.footer-follow-us{ .twitter { @include awesome-sprite(follow-us-twitter); } .facebook { @include awesome-sprite(follow-us-fb); } .google { @include awesome-sprite(follow-us-google); } .pinterest { @include awesome-sprite(follow-us-pins); }}

.awesome-sprite,

.footer-follow-us .twitter,

.footer-follow-us .facebook,

.footer-follow-us .google,

.footer-follow-us .pinterest { background: url('../images/awesome-s34fe0604ab.png') no-repeat; }

.footer-follow-us .twitter { background-position: 0 -96px; }

.footer-follow-us .facebook { background-position: 0 0; }

.footer-follow-us .google { background-position: 0 -32px; }

.footer-follow-us .pinterest { background-position: 0 -64px; }

Kitt Hodsden • @kitt • http://ki.tt/cfo

Uh...

246

How do we check these?

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

247

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo 248

How do we check these?

Kitt Hodsden • @kitt • http://ki.tt/cfo

Source Maps

249

How do we check these?

Kitt Hodsden • @kitt • http://ki.tt/cfo 250

c

http://code.tutsplus.com/tutorials/developing-with-sass-and-chrome-devtools--net-32805

Kitt Hodsden • @kitt • http://ki.tt/cfo 251

Generating

Kitt Hodsden • @kitt • http://ki.tt/cfo 252

sass --compass --sourcemap --watch scss:css

Kitt Hodsden • @kitt • http://ki.tt/cfo 253

compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded', sourcemap: true } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }

Kitt Hodsden • @kitt • http://ki.tt/cfo 254

Don’t deploy to production!

Kitt Hodsden • @kitt • http://ki.tt/cfo 255

Using

Kitt Hodsden • @kitt • http://ki.tt/cfo 256

This works in > Firefox 29, right click to show CSS

Kitt Hodsden • @kitt • http://ki.tt/cfo 257

1. Reduce file sizes2. Reduce the number of files3. Reduce content rendering time

Kitt Hodsden • @kitt • http://ki.tt/cfo

Don’t nest more than 3 deep

258

http://css-tricks.com/sass-style-guide/

Kitt Hodsden • @kitt • http://ki.tt/cfo

Avoid using tag selectorsUse class selectors if you can.

259

https://developers.google.com/speed/docs/best-practices/rendering

Kitt Hodsden • @kitt • http://ki.tt/cfo

1. Embrace the DRY principle2. Make changes easy3. Make finding mistakes easy

260

Guiding principles of making our workflows AWESOME

Kitt Hodsden • @kitt • http://ki.tt/cfo

Regression testing

261

Kitt Hodsden • @kitt • http://ki.tt/cfo

PhantomCSS

262

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install grunt-phantomcss --save-dev

install details at

https://www.npmjs.org/package/grunt-phantomcss

263

Kitt Hodsden • @kitt • http://ki.tt/cfo 264

phantomcss: { desktop: { options: { screenshots: 'test/visual/desktop/', results: 'results/visual/desktop', viewportSize: [1024, 768] }, src: [ 'test/visual/**.js' ] }, mobile: { options: { screenshots: 'test/visual/mobile/', results: 'results/visual/mobile', viewportSize: [320, 480] }, src: [ 'test/visual/**.js' ] } }

phantomcss grunt task

Kitt Hodsden • @kitt • http://ki.tt/cfo 265

casper.start('http://cfobj.localhost:8082/').then(function() { phantomcss.screenshot('#region-branding', 'region-branding');}).then( function now_check_the_screenshots(){ phantomCSS.compareAll();});

phantomcss website flow

Kitt Hodsden • @kitt • http://ki.tt/cfo

Seeing failures

266

http://tldr.huddle.com/blog/css-testing/

Kitt Hodsden • @kitt • http://ki.tt/cfo

Phew!

267

Kitt Hodsden • @kitt • http://ki.tt/cfo

Triggering tests

268

Kitt Hodsden • @kitt • http://ki.tt/cfo

git pre-commit hook

269

svn works, too!

Kitt Hodsden • @kitt • http://ki.tt/cfo

Vagrant

270

Kitt Hodsden • @kitt • http://ki.tt/cfo

Say Goodbye to “It works on my machine” with Chef

and Vagrant.Curt Gratz, 3pm this room

271

Kitt Hodsden • @kitt • http://ki.tt/cfo 272

What magic do we do?

Implement a design or prototypeUpdate the designsMake sure it works in all browsersMake it faster

Kitt Hodsden • @kitt • http://ki.tt/cfo

From the beginning!

273

Kitt Hodsden • @kitt • http://ki.tt/cfo

Faster HTML

274

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://docs.emmet.io/

275

Kitt Hodsden • @kitt • http://ki.tt/cfo

div#banner>div.logo+ul#navigation>li*4>a

276

Kitt Hodsden • @kitt • http://ki.tt/cfo

<div id="banner"> <div class="logo"></div> <ul id="navigation"> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul></div>

277

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://www.thoughtdelimited.org/thoughts/post.cfm/zen-coding-a-faster-way-to-write-html-and-tag-based-cfml-in-cfbuilder-cfeclipse

278

http://ki.tt/cfoem

Kitt Hodsden • @kitt • http://ki.tt/cfo 279

http://ki.tt/cfoem

http://www.thoughtdelimited.org/thoughts/post.cfm/zen-coding-a-faster-way-to-write-html-and-tag-based-cfml-in-cfbuilder-cfeclipse

Kitt Hodsden • @kitt • http://ki.tt/cfo 280

http://yeoman.io

Yeoman

Kitt Hodsden • @kitt • http://ki.tt/cfo

yo

281

Kitt Hodsden • @kitt • http://ki.tt/cfo

npm install -g yo

282

Installing yeoman globally

Kitt Hodsden • @kitt • http://ki.tt/cfo 283

# use a generator $ yo webapp

# start the server$ grunt server

# run tests$ grunt test

# run default$ grunt

Kitt Hodsden • @kitt • http://ki.tt/cfo 284

# download new generator$ npm install generator-gruntplugin

# run the generator$ yo gruntplugin

Kitt Hodsden • @kitt • http://ki.tt/cfo 285

# download new generator$ npm install generator-gruntfile

# run the generator$ yo gruntfile

Kitt Hodsden • @kitt • http://ki.tt/cfo 286

Lots of generators available

http://yeoman.io/official-generators.html

Kitt Hodsden • @kitt • http://ki.tt/cfo 287

# download new generator$ npm install generator-generator

# create the directory$ mkdir generator-bigred && cd $_

# run the generator$ yo generator

Kitt Hodsden • @kitt • http://ki.tt/cfo

http://yeoman.io/generators.html#writing-your-first-generator

288

http://ki.tt/yog

Kitt Hodsden • @kitt • http://ki.tt/cfo

Wow, that was fast.

289

Kitt Hodsden • @kitt • http://ki.tt/cfo

I skipped over

BundlerManaging what ruby gems you have installed

http://bundler.io/

Creating your own Grunt tasks http://gruntjs.com/creating-tasks

Bowerhttp://bower.io/

290

Kitt Hodsden • @kitt • http://ki.tt/cfo

Questions?

291

Thanks!

292

You’re awesome!