Slide 1

Slide 1 text

Application The UI is an

Slide 2

Slide 2 text

who am i? Ben Smithett Front End Dev @ @bensmithett / bensmithett.com

Slide 3

Slide 3 text

I know nothing about PHP

Slide 4

Slide 4 text

complex application In 2015, a web app’s user interface is a

Slide 5

Slide 5 text

web designer The UI used to be the domain of the

Slide 6

Slide 6 text

More complex interactivity Ajax Preprocessors & build tooling

Slide 7

Slide 7 text

Front end developer The UI is now the domain of the

Slide 8

Slide 8 text

javascript The language of UI development is

Slide 9

Slide 9 text

• Application logic: written in JS • Routing: written in JS • Templates: compiled by JS • CSS: pre- and post-processed by JS • Build tooling: powered by JS • Compile-to-JS languages: …it’s all JS

Slide 10

Slide 10 text

all the way down UI development for the web is JavaScript

Slide 11

Slide 11 text

app models controllers views

Slide 12

Slide 12 text

app models controllers views

Slide 13

Slide 13 text

app models controllers views config routes

Slide 14

Slide 14 text

app models controllers views config routes API pages

Slide 15

Slide 15 text

config routes API pages app models controllers views API pages

Slide 16

Slide 16 text

config routes API pages app models controllers views API pages assets

Slide 17

Slide 17 text

config routes API pages app models controllers views API pages assets images

Slide 18

Slide 18 text

config routes API pages app models controllers views API pages assets images icons sprites

Slide 19

Slide 19 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites

Slide 20

Slide 20 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets

Slide 21

Slide 21 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins

Slide 22

Slide 22 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts

Slide 23

Slide 23 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views

Slide 24

Slide 24 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates

Slide 25

Slide 25 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router

Slide 26

Slide 26 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes

Slide 27

Slide 27 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor

Slide 28

Slide 28 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling

Slide 29

Slide 29 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests

Slide 30

Slide 30 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests UI tests

Slide 31

Slide 31 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests UI tests deployment

Slide 32

Slide 32 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests UI tests deployment asset pipeline

Slide 33

Slide 33 text

this is insane!

Slide 34

Slide 34 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests UI tests deployment asset pipeline

Slide 35

Slide 35 text

a first class citizen Today’s frameworks don’t treat the UI as

Slide 36

Slide 36 text

“real” application code Today’s frameworks don’t treat the UI as

Slide 37

Slide 37 text

There has to be a better way…

Slide 38

Slide 38 text

assets webfonts config routes API pages app models controllers views API pages images icons sprites stylesheets vars mixins javascripts models controllers views templates router js app routes vendor tooling back end tests UI tests deployment asset pipeline

Slide 39

Slide 39 text

API app config api endpoint routes models controllers tooling back end tests deployment ui app images stylesheets webfonts config vars mixins functions javascripts models controllers views templates router vendor tests asset pipeline

Slide 40

Slide 40 text

browser PHP api APP static host javascript UI APP

Slide 41

Slide 41 text

• Load JS file • Make API request • Generate initial HTML

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

break your javascript Network conditions, browser extensions and plain old bugs can (and will)

Slide 44

Slide 44 text

real html Search engine crawlers prefer

Slide 45

Slide 45 text

browser PHP api APP static host javascript UI APP

Slide 46

Slide 46 text

browser PHP api APP node.js javascript UI APP

Slide 47

Slide 47 text

browser PHP api APP node.js javascript UI APP

Slide 48

Slide 48 text

browser PHP api APP node.js javascript UI APP

Slide 49

Slide 49 text

browser PHP api APP node.js javascript UI APP real

Slide 50

Slide 50 text

browser PHP api APP node.js javascript UI APP real static host javascript UI APP

Slide 51

Slide 51 text

browser PHP api APP node.js javascript UI APP real static host javascript UI APP

Slide 52

Slide 52 text

Embracing JavaScript as the language of UI development enables a focused, DRY codebase and a slick, yet fault- tolerant, end user experience.

Slide 53

Slide 53 text

templates & styles You’re probably not authoring in JavaScript

Slide 54

Slide 54 text

template? What is a

Slide 55

Slide 55 text

"
" + "

" + "Hello " + name + "!" + "

" + "
"

Slide 56

Slide 56 text

function A template is a Data in. HTML string out.

Slide 57

Slide 57 text

function template (name) { return "
" + "

" + "Hello " + name + "!" + "

" + "
" }

Slide 58

Slide 58 text

Hello {{ name }}!

Slide 59

Slide 59 text

function template (name) { return "
" + "

" + "Hello " + name + "!" + "

" + "
" }

Slide 60

Slide 60 text

embedded languages & logic-less templates Different kinds of string templates:

Slide 61

Slide 61 text

embedded language template - php
Welcome to ! Wrong conference!

Slide 62

Slide 62 text

embedded language template - ERB
<% if @conference == "DPC" %> Welcome to <%= @conference %>! <% else %> Wrong conference! <% end %>

Slide 63

Slide 63 text

embedded language template - EJS
<% if (conference === "DPC") { %> Welcome to <%= conference %>! <% } else { %> Boooo <% } %>

Slide 64

Slide 64 text

<% if @conference == "DPC" %>

DPC Speakers

    <% @speakers.each |speaker| do %>
  • <%= speaker.name %>
  • <% end %>
<% elsif @conference && @conference.name %> No speakers found for <%= @conference.name %>! <% end %>

Slide 65

Slide 65 text

posts.* FROM $wpdb->posts, $wpdb->postmeta WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = 'tag' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.post_date DESC "; $pageposts = $wpdb->get_results($querystr, OBJECT); ?>

Not Found

Sorry, but you are looking for something that isn't here.

Source: Wordpress Codex

Slide 66

Slide 66 text

logic-less templates! We revolted against the spaghetti code enabled by embedded language templates No more logic allowed in Views!

Slide 67

Slide 67 text

Welcome to {{conference}}!

Slide 68

Slide 68 text

Are a lie Logic-less templates

Slide 69

Slide 69 text

{{#conference}}

DPC Speakers

    {{#speakers}}
  • {{speaker_name}}
  • {{/speakers}} {{^speakers}}
  • No speakers found!
  • {{/speakers}}
{{/conference}}

Slide 70

Slide 70 text

hamstrung languages We’re writing our views with

Slide 71

Slide 71 text

Is string templating useful in 2015?

Slide 72

Slide 72 text

Welcome to {{conference}}!

Slide 73

Slide 73 text

Unread: {{unread_message_count}}

Send message:

Slide 74

Slide 74 text

stateful The DOM is

Slide 75

Slide 75 text

String templates aren’t the best tool for expressing UI structure in web apps.

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

pure javascript React components are written in

Slide 78

Slide 78 text

React.createClass({ render () { return ( React.createElement('div', {}, React.createElement('h1', {}, “Hi DPC!” ) ) ) } })

Slide 79

Slide 79 text

React.createClass({ render () { return ( React.createElement('div', {}, React.createElement('h1', {}, “Hi DPC!” ) ) ) } }) //
//

// Hi DPC! //

//

Slide 80

Slide 80 text

React.createClass({ render () { return (

Hi DPC!

) } })

Slide 81

Slide 81 text

React.createClass({ render () { return (

Hi DPC!

) } }) React.createElement('div', {}, React.createElement('h1', {}, “Hi DPC!” ) )

Slide 82

Slide 82 text

    { this.props.speakers ? this.props.speakers.map((speaker) => { var name = speaker.name.toUpperCase() return
  • {name}
  • }) :
  • No speakers found!
  • }

Slide 83

Slide 83 text

the virtual dom abstracts away the hard work of syncing your views with the stateful DOM

Slide 84

Slide 84 text

virtual dom
Unread: 4

Send message:

Slide 85

Slide 85 text

virtual dom real dom
Unread: 4

Send message:

Unread: 3

Send message:

Slide 86

Slide 86 text

virtual dom real dom
Unread: 4

Send message:

Unread: 3

Send message:

document.querySelector('#count').innerHTML('4') minimum possible imperative update

Slide 87

Slide 87 text

fewer moving parts fewer things to learn No template engine required

Slide 88

Slide 88 text

const Header = React.createClass({ render () { return (

Hi DPC!

) } }) React.renderToString() // "

Hi DPC!

"

Slide 89

Slide 89 text

tightly coupled View logic & structure are

Slide 90

Slide 90 text

Favorite this $('.fav').on('click', function (event) { Api.favorite(event.target.id) })

Slide 91

Slide 91 text

Favorite this $('.fav').on('click', function (event) { Api.favorite(event.target.id) })

Slide 92

Slide 92 text

const FavButton = React.createClass({ handleClick () { Api.favourite(this.props.id) }, render () { return ( Favorite this ) } })

Slide 93

Slide 93 text

pure javascript components Replace templates & separated logic with

Slide 94

Slide 94 text

css What about

Slide 95

Slide 95 text

everybody uses a preprocessor

Slide 96

Slide 96 text

i ❤

Slide 97

Slide 97 text

.btn { color: #f00; width: 200px; } .btn:hover { background: #00f; } .col-1 { width: 8.33333%; } .col-2 { width: 16.66667%; }

Slide 98

Slide 98 text

.btn { color: #f00; width: 200px; } .btn:hover { background: #00f; } .col-1 { width: 8.33333%; } .col-2 { width: 16.66667%; } .btn { color: $red; width: 200px; &:hover { background: $yellow; } } @for $i from 1 through 12 { .col-#{$i} { width: 100% / ($i * 12); } }

Slide 99

Slide 99 text

variables conditionals loops functions math string manipulation JavaScript already has

Slide 100

Slide 100 text

objects with keys & values JavaScript great for working with

Slide 101

Slide 101 text

var myStyles = { color: colors.red, backgroundColor: signedInUser ? colors.green : colors.grey, backgroundImage: CDNPathFor('forest_bg.png'), width: Math.round(document.body.offsetWidth / 2) + 'px' }

Slide 102

Slide 102 text

var totalCols = 12 var gridColClasses = {} for (var i = 1; i <= totalCols; i++) { gridColClasses['col-' + i] = { width: ((100 / totalCols) * i) + '%' } }

Slide 103

Slide 103 text

var totalCols = 12 var gridColClasses = {} for (var i = 1; i <= totalCols; i++) { gridColClasses['col-' + i] = { width: ((100 / totalCols) * i) + '%' } }

Slide 104

Slide 104 text

import createGrid from 'grid' var gridStyles = createGrid(12)

Slide 105

Slide 105 text

mature fully featured well understood JavaScript is a more language than the CSS preprocessors

Slide 106

Slide 106 text

real css… … great, but browsers still need

Slide 107

Slide 107 text

inline styles

Slide 108

Slide 108 text

No content

Slide 109

Slide 109 text

why not use inline styles? • Because it isn’t DRY!

Slide 110

Slide 110 text

Slide 111

Slide 111 text

Slide 112

Slide 112 text

don’t write the same html twice! How to not repeat yourself:

Slide 113

Slide 113 text

var Thumb = React.createClass({ render () { return (
) } })

Slide 114

Slide 114 text

Slide 115

Slide 115 text

var Thumb = React.createClass({ render () { return (
) } })

Slide 116

Slide 116 text

var thumbStyles = { border: '2px solid #0f0', height: '100px', width: '100px', float: left } var Thumb = React.createClass({ render () { return (
) } })

Slide 117

Slide 117 text

var thumbStyles = { border: '2px solid #0f0', height: '100px', width: '100px', float: left } var Thumb = React.createClass({ render () { return (
) } })

Slide 118

Slide 118 text

don’t write the same html twice! No, really…

Slide 119

Slide 119 text

why not use inline styles? • Because it isn’t DRY!
 It can be, if you stop writing the same HTML multiple times

Slide 120

Slide 120 text

why not use inline styles? • Because it isn’t DRY!
 It can be, if you stop writing the same HTML multiple times • Performance?

Slide 121

Slide 121 text

why not use inline styles? • Because it isn’t DRY!
 It can be, if you stop writing the same HTML multiple times • Performance?
 Maybe… but probably not enough for you to worry about!

Slide 122

Slide 122 text

But CSS syntax is kinda nice…

Slide 123

Slide 123 text

PostCSS + Autoprefixer

Slide 124

Slide 124 text

react-style var styles = StyleSheet.create` .foo { color: red; background-color: white; } ` github.com/js-next/react-style

Slide 125

Slide 125 text

github.com/css-modules

Slide 126

Slide 126 text

import styles from './profile.css'; var Profile = React.createClass({ render() { return
...
} }

Slide 127

Slide 127 text

In conclusion…

Slide 128

Slide 128 text

complex application Your user interface is a

Slide 129

Slide 129 text

javascript The language of UI development is

Slide 130

Slide 130 text

thanks! @bensmithett