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 %>
<% 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);
?>
Posted in |
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.
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!