Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

144
OPTIMISING YOUR FRONT END WORKFLOW

description

We take great care in our back end coding workflow, optimising, automating and abstracting as much as is possible. So why don't we do that with our front end code? We'll take a look at some tools to help us take our front end workflow to the next level, and hopefully optimise our load times in the process! We'll be looking at using Twig templates and optimising them for the different areas of your application, integrating Bower and Gulp for managing assets and processing our front-end code to avoid repetitive tasks - looking at how that impacts the typical Symfony workflow.

Transcript of Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Page 1: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

OPTIMISING YOURFRONT END

WORKFLOW

Page 2: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

MATTHEW DAVIS

@mdavis1982

Page 3: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

phpspec/nyan-formatters

PhpSpec

Page 4: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

phpspec/nyan-formatters

PhpSpec

RAWWWR!

Page 5: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Terrible at jokes

Page 6: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Terrible at jokes

Sorry!

Page 7: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Advances in back end code

Page 8: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Advances in back end code

DDD

SOLIDPSR

CALISTHENICS

INTERFACESTDD

COMPOSITION

DRY

Page 9: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

COMPOSER

Page 10: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

When we look at front end code…

Page 11: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Page 12: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Cool tools for front end code

Page 13: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Cool tools for front end codeTWIG

GRUNT

GULPREQUIRE JS

BOWER ANGULAR

SASS

YEOMAN

LESS

COFFEE SCRIPT

Page 14: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

And a GAZILLION* more

Page 15: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

And a GAZILLION* more

*approximately

Page 16: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Lack of practical examples

Page 17: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

😢

Page 18: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Let’s change that!

Page 19: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

😄

Page 20: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Example Project

https://github.com/mdavis1982/workflow

Page 21: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Simple Article ManagementExample Project

https://github.com/mdavis1982/workflow

Page 22: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Simple Article ManagementExample Project

Administration Area

https://github.com/mdavis1982/workflow

Page 23: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Twig

Page 24: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Insanely powerful

Page 25: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Compiled and cachedInsanely powerful

Page 26: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Compiled and cachedInsanely powerful

Often overlooked

Page 27: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Translate all the things

Page 28: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Translations are notoriously messy

Page 29: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

But it’s easy to keep them organised

Page 30: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

framework: translator: { fallback: "%locale%" }

config.yml

Page 31: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

/** * The title of the Article * * @var string * * @ORM\Column(type="string", length=255) * * @Assert\NotBlank(message="article.title.not_blank") * @Assert\Length( * max=255, * maxMessage="article.title.length.max" * ) */ protected $title;

Article.php

Page 32: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

article: title: not_blank: You must enter a title length: max: The title cannot be longer than {{ limit }} characters content: not_blank: You must enter some content

validators.en.yml

Page 33: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

$builder ->add( 'title', 'text', [ 'label' => 'article.label.title' ] )

ArticleType.php

Page 34: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

$builder ->add( 'title', 'text', [ 'label' => 'article.label.title' ] )

ArticleType.php

For all properties in the form

Page 35: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

article: label: title: Title content: Content submit: Save

forms.en.yml

Page 36: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

forms.en.yml?!

Page 37: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

/** * {@inheritdoc} */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults([ 'data_class' => 'MD\Entity\Article', 'translation_domain' => 'forms' ]); }

ArticleType.php

Page 38: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Page 39: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

When your translations don’t work…

Page 40: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

CLEAR THE CACHE!

Page 41: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

CLEAR THE CACHE!

Even in the dev environment

Page 42: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Translate everything

Page 43: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Translate everythingAll titles, actions, single words

Page 44: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Translate everythingAll titles, actions, single words

Translations per ‘section’

Page 45: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

article: title: list: All Articles create: Add a New Article action: create: Add New cancel: Cancel

admin.en.yml

Page 46: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% block body %} <h1>{{ 'article.title.list'|trans({}, 'admin') }}</h1> {% if articles %} <ul class="articles"> {% for article in articles %} <li>{{ article.title }}</li> {% endfor %} </ul> {% endif %} <a href="{{ path('admin.article.create') }}”> {{ 'article.action.create'|trans({}, 'admin') }} </a> {% endblock body %}

list.html.twig

Page 47: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Messy

Page 48: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Template Inheritance

Page 49: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Default base template

Page 50: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %}{% endblock %} <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" /> </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html>

base.html.twig

Page 51: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Doesn’t promote great code

Page 52: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

<!doctype html> <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6 lt-ie9 lt-ie8 lt-ie7"> <![endif]--> <!--[if IE 7 ]> <html lang="en" class="no-js ie7 lt-ie9 lt-ie8"> <![endif]--> <!--[if IE 8 ]> <html lang="en" class="no-js ie8 lt-ie9"> <![endif]--> <!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]--> <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"><!--<![endif]--> <head> <meta charset="utf-8" /> <title>{% block title %}{% endblock title %}</title> <!-- Set up mobile viewport for responsive design --> <meta name="viewport" content="width=device-width" /> {% block stylesheets %}{% endblock stylesheets %} </head> <body> {% block content %}{% endblock content %} {% block javascripts %}{% endblock javascripts %} </body> </html>

base.html.twig

Page 53: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Gives us a better foundation

Page 54: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Page 55: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

The same HTML structure and assets per ‘section’?

Page 56: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

New ‘Layouts’ Directory

Page 57: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Directory Structure

Page 58: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% extends "::base.html.twig" %} {% block title %} {{ 'defaults.title'|trans({}, 'admin') }}{% endblock title %} {% block content %} {% block body %}{% endblock body %} {% endblock content %}

admin.html.twig

Page 59: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% extends "::base.html.twig" %} {% block title %}{{ 'defaults.title'|trans }}{% endblock title %} {% block content %} {% block header %}{% endblock header %} {% block body %}{% endblock body %} {% block footer %}{% endblock footer %} {% endblock content %}

frontend.html.twig

Page 60: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

What?!

Page 61: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Change the extends

Page 62: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% extends "MDMainBundle:Layouts:admin.html.twig" %} {% block body %} <h1>{{ 'article.title.list'|trans({}, 'admin') }}</h1> {% if articles %} <ul class="articles"> {% for article in articles %} <li>{{ article.title }}</li> {% endfor %} </ul> {% endif %} <a href="{{ path('admin.article.create') }}”> {{ 'article.action.create'|trans({}, 'admin') }} </a> {% endblock body %}

list.html.twig

Page 63: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Given ourselves flexible base

Page 64: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

All boilerplate code is DRYGiven ourselves flexible base

Page 65: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

All boilerplate code is DRYGiven ourselves flexible base

Defaults per ‘section’

Page 66: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

trans_default_domain

Page 67: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% extends "MDMainBundle:Layouts:admin.html.twig" %} {% trans_default_domain "admin" %} {% block body %} <h1>{{ 'article.title.list'|trans }}</h1> {% if articles %} <ul class="articles"> {% for article in articles %} <li>{{ article.title }}</li> {% endfor %} </ul> {% endif %} <a href="{{ path('admin.article.create') }}”> {{ 'article.action.create'|trans }} </a> {% endblock body %}

list.html.twig

Page 68: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

But wait!

Page 69: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% trans_default_domain "admin" %}

admin.html.twig

Page 70: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

NOPE

Page 71: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

And it won’t be fixed

Page 72: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Node.js

http://nodejs.org

Page 73: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Server-side JavaScriptNode.js

http://nodejs.org

Page 74: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Server-side JavaScriptNode.js

Adds extra functionality

http://nodejs.org

Page 75: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

npm

Page 76: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Composer for nodenpm

Page 77: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Composer for nodenpm

Install globally or into project

Page 78: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

OMG!!1!

Page 79: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Bower

http://bower.io

Page 80: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Installing Bower With No Sudo - Eek!

Page 81: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

👎

Page 82: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Installing Bower Successfully - Yay!

Page 83: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

👍

Page 84: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Getting stuff into your project

Page 85: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Find dependencies

Page 86: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Using Bower To Search For Packages - Modernizr

Page 87: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Install dependencies

Page 88: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Using Bower To Install Packages - Modernizr

Page 89: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

We can do better

Page 90: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

.bowerrc

Page 91: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Using .bowerrc To Customise Installation Directory

Page 92: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Better

Page 93: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

BetterSave dependencies

Page 94: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

bower.json

Page 95: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Using Bower To Save Dependencies To bower.json

Page 96: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Don’t forget .gitignore

Page 97: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Easy to reference assets

Page 98: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% block javascripts %}<script src="{{ asset('/vendor/modernizr/modernizr.js') }}"></script>

{% endblock javascripts %}

Easy to reference assets

Page 99: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% block javascripts %}<script src="{{ asset('/vendor/modernizr/modernizr.js') }}"></script>

{% endblock javascripts %}

Easy to reference assets

Globally or per ‘section’

Page 100: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Different locations?

Page 101: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Non-standard install

Page 102: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Make it clearNon-standard install

Page 103: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Make it clearNon-standard install

Potentially more flexibility

Page 104: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Gulp

http://gulpjs.com

Page 105: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Build tool

Page 106: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

“Every week someone who doesn’t understand Make writes a new build

system in JavaScript. #gruntjs #gearjs #gulpjs #broccolijs.

Laugh or cry? ”https://twitter.com/aslak_hellesoy/status/435506106496851968

Page 107: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Streaming

Page 108: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Plugin architecture

Page 109: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Installing Gulp Globally With npm

Page 110: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

One extra step

Page 111: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Installing Gulp and Gulp-Util Into A Project With npm

Page 112: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Don’t forget .gitignore

Page 113: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Minify JavaScript

Page 114: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Using Gulp To Minify JavaScript

Page 115: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Use it in our project

Page 116: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% block javascripts %} <script src="{{ asset('/web/js/vendor/modernizr.js') }}"></script> {% endblock javascripts %}

frontend.html.twig

Page 117: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

ITCHY NOSE!!!

Page 118: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

We have 2 copies in web/

Page 119: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

We have 2 copies in web/Bower install to /assets/vendor

Page 120: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

We have 2 copies in web/Bower install to /assets/vendor

Prevents source being public

Page 121: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

(S)CSS

Page 122: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Normal SCSS workflow

Page 123: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

@import "assets/vendor/normalize-scss/normalize"; $body-width: 60% !default; body { width: $body-width; margin: 0 auto; }

frontend.scss

Page 124: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

var scss = require('gulp-sass');!!gulp.task('scss', function() { return gulp.src('assets/scss/*.scss') .pipe(scss()) .pipe(gulp.dest('web/css')); });

gulpfile.js

Page 125: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

{% block stylesheets %} <link rel="stylesheet" href="{{ asset('/css/frontend.css') }}" /> {% endblock stylesheets %}

frontend.html.twig

Page 126: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

matt at Chloe in ~/Sites/workflow.dev on dev *🍔 $ gulp scss[gulp] Using file /Users/matt/Sites/workflow.dev/gulpfile.js[gulp] Working directory changed to /Users/matt/Sites/workflow.dev[gulp] Running 'scss'...[gulp] Finished 'scss' in 11 ms

Page 127: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Page 128: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Running commands manually gets old real fast

Page 129: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Watching!

Page 130: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

gulp.task('watch', function() { gulp.watch('assets/scss/**/*.scss', ['scss']); });

gulpfile.js

Page 131: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Demo: Gulp Watch In Action

Page 132: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Awesomesauce!

Page 133: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Only scratching the surface!

Page 134: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Gulp plugins

Page 135: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Gulp pluginsTWIG

COPY

GITBROWSERIFY

TESTS RENAME

CONCAT

OPTIMISE

LINT

NOTIFICATIONS

Page 136: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Custom actions are easy

Page 137: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Setting up a project can be tedious

Page 138: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Can be taken much further!

Page 139: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

GAZILLIONS of tools available

Page 140: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

GAZILLIONS of tools availableDon’t use all of them!

Page 141: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Plan it!

Page 142: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Plan it!

**groan**

Page 143: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

Questions?

Page 144: Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp

@mdavis1982Thanks!