99

Templates don’t need to break the browser by Nikolas Martens

Embed Size (px)

DESCRIPTION

Despite the fact that most templates in web application are HTML documents, modern template engines are strictly text-manipulating, relying on specific mark-up. Although this makes them universally usable, it also imposes a burden by requiring extra tools to render a template, while making it unreadable for a common tool specialized in mark-up parsing: the browser. In my talk, I’m proposing an approach to writing templates for web applications that leverages the capabilities of HTML to create highly maintainable templates by requiring no tools besides the browser for development and testing.

Citation preview

Page 1: Templates don’t need to break the browser by Nikolas Martens
Page 2: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Templating seems like a soved problem. But the solutions I see seem more complicated than necessary. I will show a more light-weight, leaner approach-
Page 3: Templates don’t need to break the browser by Nikolas Martens
Page 4: Templates don’t need to break the browser by Nikolas Martens
Page 5: Templates don’t need to break the browser by Nikolas Martens
Page 6: Templates don’t need to break the browser by Nikolas Martens
Page 7: Templates don’t need to break the browser by Nikolas Martens
Page 8: Templates don’t need to break the browser by Nikolas Martens
Page 9: Templates don’t need to break the browser by Nikolas Martens
Page 10: Templates don’t need to break the browser by Nikolas Martens
Page 11: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
I enjoy tinkering with the basics of web applications...
Page 12: Templates don’t need to break the browser by Nikolas Martens
Page 13: Templates don’t need to break the browser by Nikolas Martens
Page 14: Templates don’t need to break the browser by Nikolas Martens
Page 15: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
So I build a new experimental framework for web apps ever now and then. It's a great way to learn.
Nikolas
Notiz
My current project is called watoki http://github.com/watoki
Page 16: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
I found this article by Ian Dooley. It sounds like a rant but it's actually a really neat aproach. This talk is about his approach and how I implemented it.
Page 17: Templates don’t need to break the browser by Nikolas Martens
Page 18: Templates don’t need to break the browser by Nikolas Martens
Page 19: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<?php if($db->fetchOne('select count(*) from messages')) { ?>

<?php $messages = $db->fetchAll('select * from messages'); ?>

<h1>There are <?php echo count($messages); ?> messages:<h1>

<ul>

<li>From <?php echo $message['from']; ?></li>

<?php foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<?php } else { ?>

<php } ?>

Nikolas
Notiz
When Ian says spaghetti, he means files that contain more than one language. Like PHP and HTML in this case.
Page 20: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<?php if($db->fetchOne('select count(*) from messages')) { ?>

<?php $messages = $db->fetchAll('select * from messages'); ?>

<h1>There are <?php echo count($messages); ?> messages:<h1>

<ul>

<li>From <?php echo $message['from']; ?></li>

<?php foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<?php } else { ?>

<php } ?>

Page 21: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<?php if($db->fetchOne('select count(*) from messages')) { ?>

<?php $messages = $db->fetchAll('select * from messages'); ?>

<h1>There are <?php echo count($messages); ?> messages:<h1>

<ul>

<li>From <?php echo $message['from']; ?></li>

<?php foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<?php } else { ?>

<php } ?>

Page 22: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<?php if($db->fetchOne('select count(*) from messages')) { ?>

<?php $messages = $db->fetchAll('select * from messages'); ?>

<h1>There are <?php echo count($messages); ?> messages:<h1>

<ul>

<li>From <?php echo $message['from']; ?></li>

<?php foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<?php } else { ?>

<php } ?>

Page 23: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<? if (count($messages)) { ?>

<h1>There are <?= count($messages) ?> messages:<h1>

<ul>

<li>From <?= $message['from']; ?></li>

<? foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<? } else { >

<php } ?>

<? $messages = $messageStore->getAll(); ?>

Nikolas
Notiz
I actually use this style for small projects. Most times, no library is the best library.
Page 24: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<? if (count($messages)) { ?>

<h1>There are <?= count($messages) ?> messages:<h1>

<ul>

<li>From <?= $message['from']; ?></li>

<? foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<? } else { >

<php } ?>

<? $messages = $messageStore->getAll(); ?>

Page 25: Templates don’t need to break the browser by Nikolas Martens

<h1>There are no messages</h1>

<? if (count($messages)) { ?>

<h1>There are <?= count($messages) ?> messages:<h1>

<ul>

<li>From <?= $message['from']; ?></li>

<? foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<? } else { >

<php } ?>

<? $messages = $messageStore->getAll(); ?>

Page 26: Templates don’t need to break the browser by Nikolas Martens

<? $messages = $store->getMessages();

'messageCount' => count($messages),

'messages' => $messages

$model = array(

); ?>

<h1>There are no messages</h1>

{{^messageCount}}

<h1>There are {{messageCount}} messages:<h1>

<ul>

<li>From {{from}}</li>

{{#messages}}

{{/messages}}

</ul>

{{/messageCount}}{{#messageCount}}

{{/messageCount}}

Page 27: Templates don’t need to break the browser by Nikolas Martens

<? $messages = $store->getMessages();

'messageCount' => count($messages),

'messages' => $messages

$model = array(

); ?>

<h1>There are no messages</h1>

{{^messageCount}}

<h1>There are {{messageCount}} messages:<h1>

<ul>

<li>From {{from}}</li>

{{#messages}}

{{/messages}}

</ul>

{{/messageCount}}{{#messageCount}}

{{/messageCount}}

Nikolas
Notiz
This is how most modern templating systems work: mostly text manipulation baaed on a special syntax. But still spaghetti according so Ian's definition.
Page 28: Templates don’t need to break the browser by Nikolas Martens
Page 29: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Maintainance cost is said to be 80% of a projects lifetime cost. In my experience that's true.
Page 30: Templates don’t need to break the browser by Nikolas Martens
Page 31: Templates don’t need to break the browser by Nikolas Martens

<? $messages = $messageStore->getAll(); ?>

<h1>There are no messages</h1>

<? if (count($messages)) { ?>

<h1>There are <?= count($messages) ?> messages:<h1>

<ul>

<li>From <?= $message['from']; ?></li>

<? foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<? } else { >

<php } ?>

<h1>There are no messages</h1>

{{^messageCount}}

{{/messageCount}}

<h1>There are {{messageCount}} messages:<h1>

<ul>

<li>From {{from}}</li>

{{#messages}}

{{/messages}}

</ul>

{{#messageCount}}

{{/messageCount}}

Page 32: Templates don’t need to break the browser by Nikolas Martens

<? $messages = $messageStore->getAll(); ?>

<h1>There are no messages</h1>

<? if (count($messages)) { ?>

<h1>There are <?= count($messages) ?> messages:<h1>

<ul>

<li>From <?= $message['from']; ?></li>

<? foreach ($messages as $message) { ?>

<?php } ?>

</ul>

<? } else { >

<php } ?>

<h1>There are no messages</h1>

{{^messageCount}}

{{/messageCount}}

<h1>There are {{messageCount}} messages:<h1>

<ul>

<li>From {{from}}</li>

{{#messages}}

{{/messages}}

</ul>

{{#messageCount}}

{{/messageCount}}

Page 33: Templates don’t need to break the browser by Nikolas Martens
Page 34: Templates don’t need to break the browser by Nikolas Martens
Page 35: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
For me, runability is more important than readability.
Page 36: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Runability is also a core believe of TDD
Page 37: Templates don’t need to break the browser by Nikolas Martens
Page 38: Templates don’t need to break the browser by Nikolas Martens
Page 39: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
This is a recent project of mine.
Page 40: Templates don’t need to break the browser by Nikolas Martens
Page 41: Templates don’t need to break the browser by Nikolas Martens
Page 42: Templates don’t need to break the browser by Nikolas Martens
Page 43: Templates don’t need to break the browser by Nikolas Martens
Page 44: Templates don’t need to break the browser by Nikolas Martens
Page 45: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
That's what happens when you open the template file in a browser.
Page 46: Templates don’t need to break the browser by Nikolas Martens
Page 47: Templates don’t need to break the browser by Nikolas Martens
Page 48: Templates don’t need to break the browser by Nikolas Martens
Page 49: Templates don’t need to break the browser by Nikolas Martens
Page 50: Templates don’t need to break the browser by Nikolas Martens
Page 51: Templates don’t need to break the browser by Nikolas Martens
Page 52: Templates don’t need to break the browser by Nikolas Martens
Page 53: Templates don’t need to break the browser by Nikolas Martens
Page 54: Templates don’t need to break the browser by Nikolas Martens
Page 55: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Rendering the template eveey time you do a small design change seems to take forever even if it's just a second. It kills the flow.
Page 56: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Installing and maintaing a development emvironment is a pain if you just want to edit the template. Especially for non-technical people.
Page 57: Templates don’t need to break the browser by Nikolas Martens
Page 58: Templates don’t need to break the browser by Nikolas Martens
Page 59: Templates don’t need to break the browser by Nikolas Martens
Page 60: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
If we just concentrate on what we want...
Page 61: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
..you would get someting like that.
Page 62: Templates don’t need to break the browser by Nikolas Martens
Page 63: Templates don’t need to break the browser by Nikolas Martens
Page 64: Templates don’t need to break the browser by Nikolas Martens
Page 65: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
Ian calls it template animation. So let's go with that.
Page 66: Templates don’t need to break the browser by Nikolas Martens
Page 67: Templates don’t need to break the browser by Nikolas Martens
Page 68: Templates don’t need to break the browser by Nikolas Martens

{ date: '2010-05-10',

slot: '9h - 14h' }

bookings: [

],

{ name: 'April'

… }

months: [

] ...

Page 69: Templates don’t need to break the browser by Nikolas Martens

{ date: '2010-05-10',

slot: '9h - 14h' }

bookings: [

],

{ name: 'April'

… }

months: [

] ...

Page 70: Templates don’t need to break the browser by Nikolas Martens
Page 71: Templates don’t need to break the browser by Nikolas Martens
Page 72: Templates don’t need to break the browser by Nikolas Martens
Page 73: Templates don’t need to break the browser by Nikolas Martens
Page 74: Templates don’t need to break the browser by Nikolas Martens
Page 75: Templates don’t need to break the browser by Nikolas Martens
Page 76: Templates don’t need to break the browser by Nikolas Martens
Page 77: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
This is the quint-essence of this talk: DOM manipulation instead of text-manipulation
Page 78: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
How to target the DOM nodes?
Page 79: Templates don’t need to break the browser by Nikolas Martens
Page 80: Templates don’t need to break the browser by Nikolas Martens
Page 81: Templates don’t need to break the browser by Nikolas Martens
Page 82: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
I use annotations but other methods would be possible.
Page 83: Templates don’t need to break the browser by Nikolas Martens

<div>

Name: <span>John Wayne</span>

Homepage: <a href="http://johnwayne.com">

<span>johnwayne.com</span>

</a>

</div>

Page 84: Templates don’t need to break the browser by Nikolas Martens

<div>

Name: <span>John Wayne</span>

Homepage: <a href="http://johnwayne.com">

<span>johnwayne.com</span>

</a>

</div>

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

Page 85: Templates don’t need to break the browser by Nikolas Martens

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

Page 86: Templates don’t need to break the browser by Nikolas Martens

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Page 87: Templates don’t need to break the browser by Nikolas Martens

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Page 88: Templates don’t need to break the browser by Nikolas Martens

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Page 89: Templates don’t need to break the browser by Nikolas Martens

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Nikolas
Notiz
Annotations allow the whole animation to become a simple mapping task.
Page 90: Templates don’t need to break the browser by Nikolas Martens

{

person: {

name: "John Wayne",

url : {

href: "http://johnwayne.com",

caption: "johnwayne.com"

}

}

}

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Page 91: Templates don’t need to break the browser by Nikolas Martens
Page 92: Templates don’t need to break the browser by Nikolas Martens
Page 93: Templates don’t need to break the browser by Nikolas Martens
Page 94: Templates don’t need to break the browser by Nikolas Martens
Page 95: Templates don’t need to break the browser by Nikolas Martens
Page 96: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
If you want to this in action, clone https://github.com/rtens/lacarte, open src/rtens/lacarte/web/order/list.html in your browser and navigate through the app. Mind that these are all the actual templates.
Page 97: Templates don’t need to break the browser by Nikolas Martens

<div property="person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

Page 98: Templates don’t need to break the browser by Nikolas Martens

<div property="person" typeof="Person">

Name: <span property="name">John Wayne</span>

Homepage: <a property="url" href="http://johnwayne.com">

<span property="caption">johnwayne.com</span>

</a>

</div>

<div vocab="http://schema.org/">

</div>

Nikolas
Notiz
The collision with RDFa is imtentional but avoidable by choosing a different attribute name.
Page 99: Templates don’t need to break the browser by Nikolas Martens
Nikolas
Notiz
You find these slides and my contact info at http://rtens.org