Slide 1

Slide 1 text

Come to the Dart side! We have cookies!

Slide 2

Slide 2 text

Dart: The Dawn of Web Apps ladicek.github.com

Slide 3

Slide 3 text

500 000 lines of JS

Slide 4

Slide 4 text

500 000 lines of JS Say hello to Dart!

Slide 5

Slide 5 text

main() { print("Hello, Dart!"); }

Slide 6

Slide 6 text

class Person { var name, age; Person(this.name, this.age); toString() => "$name ($age years)"; } main() { var me = new Person("Ladislav Thon", 30); print(me); }

Slide 7

Slide 7 text

Optional typing void main() { Person me = new Person("Ladislav Thon", 30); List people = [me, ...]; people.forEach((Person person) => print(person)); people.forEach((person) { // iterable print(person); }); people.forEach(print); // closurization }

Slide 8

Slide 8 text

Innocent until proven guilty

Slide 9

Slide 9 text

Client-side code import 'dart:html'; main() { query('#button').onClick.listen((event) { // stream ... }); }

Slide 10

Slide 10 text

Server-side code import 'dart:io'; main() { HttpServer.bind('127.0.0.1', 1337).then((server) { // future server.listen((request) { // stream … }); }); }

Slide 11

Slide 11 text

Isolates import 'dart:isolate'; main() { var box = new MessageBox(); streamSpawnFunction(worker).add( { 'replyTo': box.sink, 'value': ... } ); // sink box.stream.listen((response) { ... }); // stream } worker() { stream.listen((message) { ... }); }

Slide 12

Slide 12 text

Mirrors import 'dart:mirrors'; main() { var person = new Person(...); var personMirror = reflect(person); personMirror.getField('name').then((resultMirror) { print(resultMirror.reflectee); }); // async today, probably sync in the future }

Slide 13

Slide 13 text

And a lot more

Slide 14

Slide 14 text

Implicit interfaces & properties abstract class Person { get name; get age; set age(value); } class Monster implements Person { final name = 'Cthulhu'; var age = '?!?!?!'; }

Slide 15

Slide 15 text

Inheritance & mixins class Entity { int id; } // or whatever abstract class Named { get name; toString() => '$name'; } class Person extends Entity with Named { get name => 'Cthulhu'; }

Slide 16

Slide 16 text

Optional parameters class Person { var name, age; Person({this.name: '', this.age: 0}); growOlder([years = 1]) { age += years; } } main() { var me = new Person(name: 'Ladislav Thon'); me.growOlder(30); }

Slide 17

Slide 17 text

Constructors class Person { final name, age; Person(this.name, this.age); Person.me() : name = 'Ladislav Thon', age = 30; static Person cache; factory Person.cachedMe() { if (cache == null) { cache = new Person.me(); } return cache; } }

Slide 18

Slide 18 text

Cascades class Person { var name, age; } main() { var me = new Person() ..name = 'Ladislav Thon' ..age = 30; }

Slide 19

Slide 19 text

Privacy class Person { var _isEnemy; var name, age; } main() { // in another library var me = ...; print(me._isEnemy); // NO! }

Slide 20

Slide 20 text

class Proxy { var target; Proxy(this.target); noSuchMethod(invocation) { print('Calling ${invocation.memberName}'); return invocation.invokeOn(target); } }

Slide 21

Slide 21 text

Web UI

Slide 22

Slide 22 text

Web UI Web Components

Slide 23

Slide 23 text

Web UI MDV Templates

Slide 24

Slide 24 text

Web UI Polyfill for current browsers

Slide 25

Slide 25 text

HTML part {{value}} +1 ...

Slide 26

Slide 26 text

Dart part import 'package:web_ui/web_ui.dart'; class Counter extends WebComponent { int value = 0; increment() { value++; } }

Slide 27

Slide 27 text

Usage main() {}

Slide 28

Slide 28 text

Conditions & iteration {{headerItem}} {{item}}

Slide 29

Slide 29 text

Passing values ...

Slide 30

Slide 30 text

Performance Fast startup

Slide 31

Slide 31 text

Performance Fast runtime (beats V8 already)

Slide 32

Slide 32 text

Tooling Eclipse, IntelliJ IDEA vim, Sublime Text

Slide 33

Slide 33 text

So what is it all about?

Slide 34

Slide 34 text

So what is it all about? Structure!

Slide 35

Slide 35 text

www.dartlang.org

Slide 36

Slide 36 text

ladicek.github.com ?