Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automate ALL THE FRONT-END THINGS

Automate ALL THE FRONT-END THINGS

Kitt Hodsden

June 05, 2014
Tweet

More Decks by Kitt Hodsden

Other Decks in Programming

Transcript

  1. Automate ALL THE FRONT-END THINGS! Text SotR 2014 • Kitt

    Hodsden • http://ki.tt • @kitt 1
  2. Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to

    participate in group note taking at: http://ki.tt/sotr14notes 11 Community knowledge!
  3. Kitt Hodsden • @kitt • http://ki.tt/sotr Demo files / examples

    available at: http://ki.tt/sotr.zip 12 Demo files!
  4. Kitt Hodsden • @kitt • http://ki.tt/sotr node & ruby (and

    maybe python & php) 14 We need node and ruby to use the tools we’re going to talk about.
  5. Kitt Hodsden • @kitt • http://ki.tt/sotr 15 Setup node by

    downloading the installer and running it. http://nodejs.org
  6. Kitt Hodsden • @kitt • http://ki.tt/sotr 16 # mac /

    linux $ which ruby /usr/local/bin/ruby $ ruby --version ruby 2.0.0p195 # windows > where ruby C:\Ruby200\bin\ruby.exe > ruby --version ruby 2.0.0p451 Yay! Sass installed! See if you already have ruby installed
  7. Kitt Hodsden • @kitt • http://ki.tt/sotr 17 RVM RUBY VERSION

    MANAGER https://rvm.io/rvm/install Install ruby in different ways on OSX OSX
  8. Kitt Hodsden • @kitt • http://ki.tt/sotr 18 RVM RUBY VERSION

    MANAGER https://rvm.io/rvm/install Install ruby in different ways on OSX OSX
  9. Kitt Hodsden • @kitt • http://ki.tt/sotr 20 APT / YUM

    $ sudo apt-get install ruby1.9.1 $ sudo yum install ruby1.9.1 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on Linux Linux http://ki.tt/s223
  10. Kitt Hodsden • @kitt • http://ki.tt/sotr 21 APT / YUM

    $ sudo apt-get install ruby1.9.1 $ sudo yum install ruby1.9.1 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on Linux Linux http://ki.tt/s223
  11. Kitt Hodsden • @kitt • http://ki.tt/sotr 22 Install ruby in

    different ways on Windows Windows http://chocolatey.org/
  12. Kitt Hodsden • @kitt • http://ki.tt/sotr 23 C:\> cinst ruby

    Install ruby in different ways on Windows Windows
  13. Kitt Hodsden • @kitt • http://ki.tt/sotr 24 RUBYINSTALLER http://rubyinstaller.org/downloads/ PIK

    https://github.com/vertiginous/pik Install ruby in different ways on Windows Windows CYGWIN http://cygwin.com
  14. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 28 Guiding principles of making our workflows AWESOME
  15. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 29 Guiding principles of making our workflows AWESOME
  16. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 30 Guiding principles of making our workflows AWESOME
  17. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs 32 What magic do we do?
  18. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers 33 What magic do we do?
  19. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 34 What magic do we do?
  20. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 35 What magic do we do?
  21. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 37
  22. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 39
  23. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 40
  24. Kitt Hodsden • @kitt • http://ki.tt/sotr change. click. change. click.

    42 change. click. change. click. change click. change. click. change. click. hange. click. hange. click. hange. click. change. click. change click. change click. change. click.
  25. Kitt Hodsden • @kitt • http://ki.tt/sotr 43 Guiding principles! 1.

    Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy
  26. Kitt Hodsden • @kitt • http://ki.tt/sotr 50 <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
  27. Kitt Hodsden • @kitt • http://ki.tt/sotr 54 Guiding principles! 1.

    Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy
  28. Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/3ws 57 LOTS of

    different ways to start a local webserver Need one quick?
  29. Kitt Hodsden • @kitt • http://ki.tt/sotr 60 In OSX, drag

    and drop the folder into the terminal window for the path.
  30. Kitt Hodsden • @kitt • http://ki.tt/sotr 63 $ npm install

    connect && echo "var c = require('connect');c.createServer(c .static(__dirname)).listen(8000);" | node
  31. Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/sotr.zip 66 Demo files

    if you’d like to follow along Example files, if you’d like.
  32. Kitt Hodsden • @kitt • http://ki.tt/sotr 71 $ browser-sync init

    [BS] Config file created (bs-config.js) [BS] To use it, in the same directory run: browser-sync $
  33. Kitt Hodsden • @kitt • http://ki.tt/sotr 72 module.exports = {

    files: "css/*.css", proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; https://github.com/shakyShane/browser-sync/wiki/options
  34. Kitt Hodsden • @kitt • http://ki.tt/sotr module.exports = { files:

    "css/*.css", proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; 73 https://github.com/shakyShane/browser-sync/wiki/options
  35. Kitt Hodsden • @kitt • http://ki.tt/sotr 74 module.exports = {

    files: ["css/*.css", "**.*.html", "js/**/*.js"], proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; https://github.com/shakyShane/browser-sync/wiki/options
  36. Kitt Hodsden • @kitt • http://ki.tt/sotr 77 $ 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...
  37. Kitt Hodsden • @kitt • http://ki.tt/sotr Skylight http://www.candylabs.com/skylight Launchy http://www.launchy.net/

    http://pylaunchy.sourceforge.net/docs/ FARR https://www.donationcoder.com/Software/Mouser/findrun/ 83
  38. Kitt Hodsden • @kitt • http://ki.tt/sotr Gnome Launch Box https://live.gnome.org/

    Gnome Do http://do.davebsd.com/ Launchy http://www.launchy.net/ http://pylaunchy.sourceforge.net/ 84
  39. Kitt Hodsden • @kitt • http://ki.tt/sotr Can you feel the

    awesome? 94 Awwwwwwwww yissssssssssssssssssss!
  40. Kitt Hodsden • @kitt • http://ki.tt/sotr 97 $ npm install

    -g grunt-cli Install the grunt package
  41. Kitt Hodsden • @kitt • http://ki.tt/sotr 99 $ 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 ...
  42. Kitt Hodsden • @kitt • http://ki.tt/sotr 102 { "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
  43. Kitt Hodsden • @kitt • http://ki.tt/sotr 103 $ npm install

    With a package.json file, you can install the needed packages easily.
  44. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Watch for file

    changes 2. Refresh the browser on change 104 What we want grunt to do.
  45. Kitt Hodsden • @kitt • http://ki.tt/sotr 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
  46. Kitt Hodsden • @kitt • http://ki.tt/sotr 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
  47. Kitt Hodsden • @kitt • http://ki.tt/sotr 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
  48. Kitt Hodsden • @kitt • http://ki.tt/sotr 108 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
  49. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Find grunt plugin*

    2. Install with npm install --save-dev 3. Add the task to our Gruntfile.js file 4. Add the tasks to a command 5. Run the command ... 7. Profit! *write if you need to 110 How to add a task to grunt
  50. Kitt Hodsden • @kitt • http://ki.tt/sotr 115 $ npm install

    grunt-browser-sync --save-dev Installing the browser-sync grunt package
  51. Kitt Hodsden • @kitt • http://ki.tt/sotr 116 $ ls Gemfile!!

    README.txt fonts node_modules template.php Gemfile.lock bs-config.js images package.json templates Gruntfile.js config.rb js screenshot.png theme.info Guardfile! css logo.png scss widgets
  52. Kitt Hodsden • @kitt • http://ki.tt/sotr 118 browserSync: { files:

    { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },
  53. Kitt Hodsden • @kitt • http://ki.tt/sotr 119 browserSync: { files:

    { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },
  54. Kitt Hodsden • @kitt • http://ki.tt/sotr 120 browserSync: { files:

    { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },
  55. Kitt Hodsden • @kitt • http://ki.tt/sotr 121 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'] } }
  56. Kitt Hodsden • @kitt • http://ki.tt/sotr 124 $ grunt gogogo

    Running the newly defined “gogogo” command
  57. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 128
  58. Kitt Hodsden • @kitt • http://ki.tt/sotr 130 1. Find grunt

    plugin* 2. Install with npm install --save-dev 3. Add the task to our Gruntfile.js file 4. Add the tasks to a command 5. Run the command ... 7. Profit! *write if you need to
  59. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 131 Guiding principles of making our workflows AWESOME
  60. Kitt Hodsden • @kitt • http://ki.tt/sotr 132 $ npm install

    matchdep --save-dev Installing the browser-sync grunt package
  61. Kitt Hodsden • @kitt • http://ki.tt/sotr 133 ... // load

    all the grunt modules instead of one each line require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks); grunt.registerTask('checkjs', ['jshint']); grunt.registerTask('watchjs', ['jshint', 'watch']); grunt.registerTask('gruntjs', ['jshint:gruntfile', 'watch']);
  62. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-jshint --save-dev

    135 Use jshint when editing your Gruntfile.js https://github.com/gruntjs/grunt-contrib-jshint
  63. Kitt Hodsden • @kitt • http://ki.tt/sotr 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']);
  64. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-qunit --save-dev

    138 Javascript unit tests https://github.com/gruntjs/grunt-contrib-qunit
  65. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-jasmine --save-dev

    139 Javascript unit tests https://github.com/gruntjs/grunt-contrib-jasmine
  66. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-simple-mocha --save-dev

    140 Javascript unit tests https://github.com/yaymukund/grunt-simple-mocha
  67. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 141
  68. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 142
  69. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Reduce file sizes

    2. Reduce the number of files 3. Reduce content rendering time 143
  70. Kitt Hodsden • @kitt • http://ki.tt/sotr 144 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  71. Kitt Hodsden • @kitt • http://ki.tt/sotr 147 imagemin: { prod:

    { files: [{ expand: true, cwd: 'imgs-src/', src: ['**/*.{png,jpg,gif}'], dest: 'imgs/' }] } }
  72. Kitt Hodsden • @kitt • http://ki.tt/sotr 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
  73. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-responsive-images --save-dev

    150 Responsive images by resizing https://github.com/andismith/grunt-responsive-images
  74. Kitt Hodsden • @kitt • http://ki.tt/sotr 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
  75. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-grunticon --save-dev

    152 SVG with PNG fallbacks https://github.com/filamentgroup/grunticon
  76. Kitt Hodsden • @kitt • http://ki.tt/sotr 158 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  77. Kitt Hodsden • @kitt • http://ki.tt/sotr 163 grunt.initConfig({ montage: {

    iconaroo: { files: { "images/sprites": [ "images/icons/*.png" ] }, options: { size: 32, outputImage: "sprite-icons.png", outputStylesheet: "sprite-icons.css" } } } }); Sample grunt-montage configuration
  78. Kitt Hodsden • @kitt • http://ki.tt/sotr 165 $ mkdir 640x480;

    for file in *.jpg; do convert $file -resize \ 640x480 640x480/$file; done A “one-liner” that resizes images
  79. Kitt Hodsden • @kitt • http://ki.tt/sotr 168 zsh, bash format

    alias d="dirs -v" tcsh format alias d 'dirs -v' Alias syntax
  80. Kitt Hodsden • @kitt • http://ki.tt/sotr 169 $ cat ~/.bash_profile

    alias d='dirs -v' alias pu='pushd' alias po='popd' alias sa='source ~/.bash_profile' alias pdw='pwd' alias purge='rm *.~*~' alias mroe='more' alias memacs='emacs `git st | grep modified | cut -c14-180`' alias sotr='pushd ~/talks/2014/sotr' Create aliases
  81. Kitt Hodsden • @kitt • http://ki.tt/sotr 170 history | cut

    -c8-120 | cut -d" " -f1 | sort | uniq -c | sort Good candidates for your aliases
  82. Kitt Hodsden • @kitt • http://ki.tt/sotr 174 function envg() {

    env | grep -i $1; } Functions if your arguments vary
  83. Kitt Hodsden • @kitt • http://ki.tt/sotr 175 $ mkdir new-dir

    && cd $_ # function mkcd { mkdir $1 && cd $1; } $ mkcd new-dir Functions if your arguments vary
  84. Kitt Hodsden • @kitt • http://ki.tt/sotr 177 #!/usr/bin/env bash mkdir

    640x480 for file in *.jpg; do convert $file -resize 640x480 640x480/$file; done A bash script to convert
  85. Kitt Hodsden • @kitt • http://ki.tt/sotr 178 #!/usr/bin/env bash echo

    “make the resize dir 640x480” mkdir 640x480 echo “resize each file” for file in *.jpg; echo “ resizing $file” do convert $file -resize 640x480 640x480/$file; done A bash script to convert
  86. Kitt Hodsden • @kitt • http://ki.tt/sotr 179 #!/usr/bin/env bash -x

    echo “make the resize dir 640x480” mkdir 640x480 echo “resize each file” for file in *.jpg; echo “ resizing $file” do convert $file -resize 640x480 640x480/$file; done A bash script to convert
  87. Kitt Hodsden • @kitt • http://ki.tt/sotr 180 bash-3.2$ resize-images.sh +

    mkdir 640x480 mkdir: 640x480: File exists + for file in '*.jpg' + convert place-kitten-01.jpg -resize 640x480 640x480/place-kitten-01.jpg + for file in '*.jpg' + convert place-kitten-02.jpg -resize 640x480 640x480/place-kitten-02.jpg + for file in '*.jpg' + convert place-kitten-03.jpg -resize 640x480 640x480/place-kitten-03.jpg + for file in '*.jpg' + convert place-kitten-04.jpg -resize 640x480 640x480/place-kitten-04.jpg + for file in '*.jpg' + convert place-kitten-05.jpg -resize 640x480 640x480/place-kitten-05.jpg Output with -x for the bash script
  88. Kitt Hodsden • @kitt • http://ki.tt/sotr sass, media queries, source

    maps, pattern lab, phantomcss, wraith, emmet, yeoman, bower 185
  89. all the front-end things? (automating front-end workflows, part two) Text

    SotR 2014 • Kitt Hodsden • http://ki.tt • @kitt 187
  90. Kitt Hodsden • @kitt • http://ki.tt/sotr sass, media queries, source

    maps, pattern lab, phantomcss, wraith, emmet, yeoman, bower 190
  91. Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to

    participate in group note taking at: http://ki.tt/sotr14notes 192 Community knowledge!
  92. Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to

    participate in group note taking at: http://ki.tt/sotr14notes 193 Community knowledge!
  93. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 194 Guiding principles of making our workflows AWESOME
  94. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 195 What magic do we do?
  95. Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or

    prototype Update the designs Make sure it works in all browsers Make it faster 196 What magic do we do?
  96. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Reduce file sizes

    2. Reduce the number of files 3. Reduce content rendering time 197
  97. Kitt Hodsden • @kitt • http://ki.tt/sotr 198 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  98. Kitt Hodsden • @kitt • http://ki.tt/sotr 199 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  99. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 200 Guiding principles of making our workflows AWESOME
  100. Kitt Hodsden • @kitt • http://ki.tt/sotr 207 Guiding principles! 1.

    Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy
  101. Kitt Hodsden • @kitt • http://ki.tt/sotr 208 Guiding principles! 1.

    Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy
  102. Kitt Hodsden • @kitt • http://ki.tt/sotr Sass / LESS /

    Stylus 210 Saw that coming, didn’t you?
  103. Kitt Hodsden • @kitt • http://ki.tt/sotr 215 $ gem update

    --system $ gem install sass $ sudo gem update --system $ sudo gem install sass Yay! Sass installed!
  104. Kitt Hodsden • @kitt • http://ki.tt/sotr 217 $ gem update

    --system $ gem install compass $ sudo gem update --system $ sudo gem install compass Setting up tools. In this case, Compass.
  105. Kitt Hodsden • @kitt • http://ki.tt/sotr See also: Bourbon 218

    Bourbon is another example of extending Sass http://bourbon.io/
  106. Kitt Hodsden • @kitt • http://ki.tt/sotr Let us count the

    (3) ways. 220 How we get started with Sass in an existing project.
  107. Kitt Hodsden • @kitt • http://ki.tt/sotr Move and rename files.

    221 How we get started with Sass in an existing project.
  108. Kitt Hodsden • @kitt • http://ki.tt/sotr 222 $ mkdir scss

    $ mv css/styles.css scss/styles.scss Setting up tools. In this case, Compass.
  109. Kitt Hodsden • @kitt • http://ki.tt/sotr Use sass-convert 223 How

    we get started with Sass in an existing project.
  110. Kitt Hodsden • @kitt • http://ki.tt/sotr 224 $ sass-convert --help

    Usage: sass-convert [options] [INPUT] [OUTPUT] $ $ cd theme-dir $ sass-convert --recursive --from=css --to=scss css scss Setting up tools. In this case, Compass.
  111. Kitt Hodsden • @kitt • http://ki.tt/sotr 229 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...
  112. Kitt Hodsden • @kitt • http://ki.tt/sotr 230 $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!
  113. Kitt Hodsden • @kitt • http://ki.tt/sotr 231 $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/
  114. Kitt Hodsden • @kitt • http://ki.tt/sotr 232 $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!
  115. Kitt Hodsden • @kitt • http://ki.tt/sotr 234 $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
  116. Kitt Hodsden • @kitt • http://ki.tt/sotr 236 .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
  117. Kitt Hodsden • @kitt • http://ki.tt/sotr 237 .navigation { a

    { display: block; padding: .5em; &:hover { color: $color-link; border: none; } } &>.first { padding-left: 0; } } Sass syntax, talking nesting
  118. Kitt Hodsden • @kitt • http://ki.tt/sotr 239 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; }
  119. Kitt Hodsden • @kitt • http://ki.tt/sotr 240 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; }
  120. Kitt Hodsden • @kitt • http://ki.tt/sotr 242 Sass syntax, talking

    @extend <div class=”box-info”> ... </div>
  121. Kitt Hodsden • @kitt • http://ki.tt/sotr 244 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; }
  122. Kitt Hodsden • @kitt • http://ki.tt/sotr 246 Sass syntax, @mixin

    @import "compass/css3/box-sizing"; el { @include box-sizing(border-box); } http://compass-style.org/reference/compass/css3/box_sizing/
  123. Kitt Hodsden • @kitt • http://ki.tt/sotr 251 Sass syntax, @mixin

    @import "vars"; @import "mixins"; @import "layouts/*";
  124. Kitt Hodsden • @kitt • http://ki.tt/sotr 253 Quick! Sass in

    5 slides! @if/@else @for @each @functions (return a single value)
  125. Kitt Hodsden • @kitt • http://ki.tt/sotr 255 @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; } } }
  126. Kitt Hodsden • @kitt • http://ki.tt/sotr 256 h1 { font-size:

    20px; font-family: $font-main; @include bp(mq-notso) { font-size: 30px; } @include bp(mq-fullon) { font-size: 60px; } }
  127. Kitt Hodsden • @kitt • http://ki.tt/sotr 257 h1 { font-size:

    20px; } @media (max-width: 1250px) { h1 { font-size: 30px; } } @media (max-width: 1600px) { h1 { font-size: 60px; } }
  128. Kitt Hodsden • @kitt • http://ki.tt/sotr More Information. 259 Sass

    for Designers Pragmatic Guide To Sass Sass and Compass in Action
  129. Kitt Hodsden • @kitt • http://ki.tt/sotr 261 Guiding principles! 1.

    Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy
  130. Kitt Hodsden • @kitt • http://ki.tt/sotr 263 alias sassgo="cd ~/project

    ;sass --watch \ --line-numbers --style expanded scss:css"
  131. Kitt Hodsden • @kitt • http://ki.tt/sotr 264 function sassgo() {

    cd $1; sass --watch --line-numbers --style expanded scss:css }
  132. Kitt Hodsden • @kitt • http://ki.tt/sotr 265 #!/usr/bin/env bash cd

    ~/project sass --watch --line-numbers --style expanded scss:css
  133. Kitt Hodsden • @kitt • http://ki.tt/sotr 270 compass config config.rb

    --sass-dir=scss \ --css-dir=css --javascripts-dir=js \ --output-style=expanded How to create a compass conifig.rb file
  134. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Watch for file

    changes 2. Compile our Sass to CSS 3. Refresh the browser on change 277 What we want grunt to do.
  135. Kitt Hodsden • @kitt • http://ki.tt/sotr 280 grunt.initConfig({ watch: {

    scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });
  136. Kitt Hodsden • @kitt • http://ki.tt/sotr 281 grunt.initConfig({ watch: {

    scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });
  137. Kitt Hodsden • @kitt • http://ki.tt/sotr 282 grunt.initConfig({ watch: {

    scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });
  138. Kitt Hodsden • @kitt • http://ki.tt/sotr 283 compass: { dev:

    { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }
  139. Kitt Hodsden • @kitt • http://ki.tt/sotr 286 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  140. Kitt Hodsden • @kitt • http://ki.tt/sotr 287 @import "compass/utilities/sprites"; ...

    $sprites-spacing: 20px; @import “../img/sprites/*png”; Creating sprite images with Compass
  141. Kitt Hodsden • @kitt • http://ki.tt/sotr 288 @import "compass/utilities/sprites"; ...

    $orange-spacing: 20px; @import “../img/orange/*png”; Sprite names are dependent on your directory name
  142. Kitt Hodsden • @kitt • http://ki.tt/sotr 289 @import "compass/utilities/sprites"; ...

    $awesome-spacing: 20px; @import “../img/awesome/*png”; Sprite names are dependent on your directory name
  143. Kitt Hodsden • @kitt • http://ki.tt/sotr 290 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; }
  144. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 292 Guiding principles of making our workflows AWESOME
  145. Kitt Hodsden • @kitt • http://ki.tt/sotr 299 compass: { dev:

    { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded', sourcemap: true } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }
  146. Kitt Hodsden • @kitt • http://ki.tt/sotr 301 # apache <Files

    ~ "\.map$"> Order allow, deny Deny from all </Files> # nginx location ~* \.map$ { ! deny all; }
  147. Kitt Hodsden • @kitt • http://ki.tt/sotr 305 1. Reduce file

    sizes 2. Reduce the number of files 3. Reduce content rendering time
  148. Kitt Hodsden • @kitt • http://ki.tt/sotr Don’t nest more than

    3 deep 306 http://css-tricks.com/sass-style-guide/
  149. Kitt Hodsden • @kitt • http://ki.tt/sotr Avoid using tag selectors

    Use class selectors if you can. 307 https://developers.google.com/speed/docs/best-practices/rendering
  150. Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY

    principle 2. Make changes easy 3. Make finding mistakes easy 312 Guiding principles of making our workflows AWESOME
  151. Kitt Hodsden • @kitt • http://ki.tt/sotr 317 $ wraith setup

    create configs/config.yaml create javascript/snap.js phantomcss grunt task
  152. Kitt Hodsden • @kitt • http://ki.tt/sotr 318 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  153. Kitt Hodsden • @kitt • http://ki.tt/sotr 319 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  154. Kitt Hodsden • @kitt • http://ki.tt/sotr 320 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  155. Kitt Hodsden • @kitt • http://ki.tt/sotr 321 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  156. Kitt Hodsden • @kitt • http://ki.tt/sotr 322 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  157. Kitt Hodsden • @kitt • http://ki.tt/sotr 323 #Headless browser option

    browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task
  158. Kitt Hodsden • @kitt • http://ki.tt/sotr 326 $ ls -l

    configs/ automate.yaml config.yaml phantomcss grunt task
  159. Kitt Hodsden • @kitt • http://ki.tt/sotr 327 $ wraith capture

    automate Creating Folders Snapping http://localhost:8000/ at width 320 Snapping http://localhost:8000/ at width 1280 Snapping http://localhost:8000/ at width 768 Snapping http://localhost:8000/all-the-things.html at width 320 Snapping http://fontsmack.fallgears.com/ at width 320 Snapping http://fontsmack.fallgears.com/ at width 768 Snapping http://fontsmack.fallgears.com/ at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 320 Snapping http://localhost:8000/all-the-things.html at width 768 Snapping http://localhost:8000/all-the-things.html at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 768 phantomcss grunt task
  160. Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-phantomcss --save-dev

    install details at https://www.npmjs.org/package/grunt-phantomcss 330
  161. Kitt Hodsden • @kitt • http://ki.tt/sotr 331 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
  162. Kitt Hodsden • @kitt • http://ki.tt/sotr 332 casper.start('http://localhost:8000/') .then(function() {

    phantomcss.screenshot('#region-branding', 'region-branding'); }). then(function now_check_the_screenshots(){ phantomCSS.compareAll(); }); phantomcss website flow
  163. Kitt Hodsden • @kitt • http://ki.tt/sotr 337 watch: { ...

    html: { files: ['patternlab/source/_patterns/**/*.mustache', 'patternlab/source/**/*.json'], tasks: ['shell:patternlab'], options: { spawn: false } } } ... copy: { styleguide: { files: [{ src: ['css/main.css'], dest: 'patternlab/public/css/style.css', filter: 'isFile'}] } } } phantomcss website flow
  164. Kitt Hodsden • @kitt • http://ki.tt/sotr 342 What magic do

    we do? Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster
  165. Kitt Hodsden • @kitt • http://ki.tt/sotr <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> 347
  166. Kitt Hodsden • @kitt • http://ki.tt/sotr 353 # use a

    generator $ yo webapp # start the server $ grunt server # run tests $ grunt test # run default $ grunt
  167. Kitt Hodsden • @kitt • http://ki.tt/sotr 354 # download new

    generator $ npm install generator-gruntplugin # run the generator $ yo gruntplugin
  168. Kitt Hodsden • @kitt • http://ki.tt/sotr 355 # download new

    generator $ npm install generator-gruntfile # run the generator $ yo gruntfile
  169. Kitt Hodsden • @kitt • http://ki.tt/sotr 356 Lots of generators

    available http://yeoman.io/official-generators.html
  170. Kitt Hodsden • @kitt • http://ki.tt/sotr 357 # download new

    generator $ npm install generator-generator # create the directory $ mkdir generator-bigred && cd $_ # run the generator $ yo generator
  171. Kitt Hodsden • @kitt • http://ki.tt/sotr I skipped over Bundler

    Managing what ruby gems you have installed http://bundler.io/ Vagrant Setting up development instances for consistency http://www.vagrantup.com/ Creating your own Grunt tasks http://gruntjs.com/creating-tasks Bower Managing project dependencies http://bower.io/ 360