Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dart: The Dawn of Web Apps
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ladislav Thon
February 24, 2013
490
1
Share
Dart: The Dawn of Web Apps
Ladislav Thon
February 24, 2013
More Decks by Ladislav Thon
See All by Ladislav Thon
On Value Types or Why Reference Locality Matters
ladicek
0
61
Write Yourself an Annotation Processor
ladicek
0
48
Kotlin or The Quest For Java.Next
ladicek
0
180
Dart++
ladicek
0
150
Oh my Dart!
ladicek
1
170
Dart: Preview
ladicek
0
89
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
380
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Marketing to machines
jonoalderson
1
5.3k
Become a Pro
speakerdeck
PRO
31
6k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Scaling GitHub
holman
464
140k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
470
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.6k
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
Come to the Dart side! We have cookies!
Dart: The Dawn of Web Apps ladicek.github.com
500 000 lines of JS
500 000 lines of JS Say hello to Dart!
main() { print("Hello, Dart!"); }
class Person { var name, age; Person(this.name, this.age); toString() =>
"$name ($age years)"; } main() { var me = new Person("Ladislav Thon", 30); print(me); }
Optional typing void main() { Person me = new Person("Ladislav
Thon", 30); List<Person> people = [me, ...]; people.forEach((Person person) => print(person)); people.forEach((person) { // iterable print(person); }); people.forEach(print); // closurization }
Innocent until proven guilty
Client-side code import 'dart:html'; main() { query('#button').onClick.listen((event) { // stream
... }); }
Server-side code import 'dart:io'; main() { HttpServer.bind('127.0.0.1', 1337).then((server) { //
future server.listen((request) { // stream … }); }); }
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) { ... }); }
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 }
And a lot more
Implicit interfaces & properties abstract class Person { get name;
get age; set age(value); } class Monster implements Person { final name = 'Cthulhu'; var age = '?!?!?!'; }
Inheritance & mixins class Entity { int id; } //
or whatever abstract class Named { get name; toString() => '$name'; } class Person extends Entity with Named { get name => 'Cthulhu'; }
Optional parameters class Person { var name, age; Person({this.name: '<unknown>',
this.age: 0}); growOlder([years = 1]) { age += years; } } main() { var me = new Person(name: 'Ladislav Thon'); me.growOlder(30); }
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; } }
Cascades class Person { var name, age; } main() {
var me = new Person() ..name = 'Ladislav Thon' ..age = 30; }
Privacy class Person { var _isEnemy; var name, age; }
main() { // in another library var me = ...; print(me._isEnemy); // NO! }
class Proxy { var target; Proxy(this.target); noSuchMethod(invocation) { print('Calling ${invocation.memberName}');
return invocation.invokeOn(target); } }
Web UI
Web UI Web Components
Web UI MDV Templates
Web UI Polyfill for current browsers
HTML part <element name="x-counter" constructor="Counter" extends="div"> <template> <span>{{value}}</span> <button on-click="increment()">+1</button>
</template> <script type="application/dart">...</script> </element>
Dart part import 'package:web_ui/web_ui.dart'; class Counter extends WebComponent { int
value = 0; increment() { value++; } }
Usage <html> <head> <link rel="components" href="counter.html"> </head> <body> <x-counter></x-counter> <script
type="application/dart">main() {}</script> </body> </html>
Conditions & iteration <table template if="rows != null && !rows.isEmpty">
<tr template iterate="headerItem in header"> <th>{{headerItem}}</th> </tr> <tbody template iterate="row in rows"> <tr template iterate="item in row"> <td>{{item}}</td> </tr> </tbody> </table>
Passing values <html> <head> <link rel="components" href="grid.html"> </head> <body> <x-grid
header="{{header}}" rows="{{rows}}"> </x-grid> <script type="application/dart">...</script> </body> </html>
Performance Fast startup
Performance Fast runtime (beats V8 already)
Tooling Eclipse, IntelliJ IDEA vim, Sublime Text
So what is it all about?
So what is it all about? Structure!
www.dartlang.org
ladicek.github.com ?