mlocjs buzdin
Post on 18-Oct-2014
2.903 views
DESCRIPTION
TRANSCRIPT
![Page 1: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/1.jpg)
Polyglot Programming in the Browser
or ‘Building Hybrid Web Apps’
![Page 2: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/2.jpg)
Dmitry Buzdin
@buzdin
www.buzdin.lv
![Page 3: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/3.jpg)
The Story Begins...
![Page 4: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/4.jpg)
This story begins long time ago...
![Page 5: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/5.jpg)
When Browsers Were Brutal
![Page 6: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/6.jpg)
Back in School I learned JavaScript
![Page 7: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/7.jpg)
JavaScript seemed simplistic, fragile anduseless...
![Page 8: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/8.jpg)
I skipped that andwent for Windows-based
client-server apps
![Page 9: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/9.jpg)
Some time passed...
![Page 10: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/10.jpg)
I joined my first serious Java-based Web project
![Page 11: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/11.jpg)
It had quite standard architecture:JSP, Struts, Servlets, XML
![Page 12: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/12.jpg)
> Ajax> Drag and drop> Custom components> Auto-completion> XSLT transformations> Lots of CSS
![Page 13: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/13.jpg)
Running in IE6
![Page 14: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/14.jpg)
Written in plain JavaScript,without jQuery!
![Page 15: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/15.jpg)
JavaScript seemed simplistic, fragile andkinda useful ...
![Page 16: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/16.jpg)
People liked the system !
And they asked for morelike that ...
![Page 17: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/17.jpg)
After a lot of thinking we picked Google Web Toolkit
![Page 18: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/18.jpg)
GWT Primer
Write in Java - compile to JavaScriptRecompilation on browser refreshTransparent RPC protocol via Ajax
![Page 19: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/19.jpg)
> Everything is dynamic> Everything is Ajax> OOP and Modularity> Refactoring Support
![Page 20: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/20.jpg)
> Multi-browser support> Obfuscation and compression> Browser-specific optimization> No vendor lock-in
Some More Features
![Page 21: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/21.jpg)
Shipped 10+ applicationsown custom widget set
and few reusable libraries
![Page 22: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/22.jpg)
Some more time passed...
![Page 23: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/23.jpg)
JavaScript became cool !
![Page 24: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/24.jpg)
Two more thingsappeared
![Page 25: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/25.jpg)
Customers started demanding > Excel-like grids> Data Visualization> Mobile Support
![Page 26: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/26.jpg)
We started considering JavaScript seriously
![Page 27: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/27.jpg)
console.log("2" / "2"); // 1
console.log("2" * "2"); // 4
console.log("1" + "2"); // 12
![Page 28: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/28.jpg)
console.log([1, 2, 3] + 1); // 1,2,31
console.log(1 + true + false); // 2
console.log(true + "a"); // truea
![Page 29: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/29.jpg)
> Weak typing> No scopes, no modules> Awkward class syntax> No refactoring> DIY builds
![Page 30: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/30.jpg)
JavaScript...
![Page 31: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/31.jpg)
JavaScript is still simplistic, fragile,but extremely useful !
![Page 32: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/32.jpg)
So what to do?
![Page 33: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/33.jpg)
We decided to stick with Google Web Toolkit
![Page 34: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/34.jpg)
GWT had few problems:> No high-end widgets> No HTML5 support> No eval()
![Page 35: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/35.jpg)
How to integrate with JavaScript libraries?
![Page 36: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/36.jpg)
GWT JavaScript Native Interfaceprivate static void java(String param) {}
private native void javaScript() /*-{
$wnd.alert(‘Hello, JavaScript!’);
$wnd.callback = @com.a.b.Type.java(Ljava.lang.String;);
}-*/;
![Page 37: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/37.jpg)
Java <> JSONclass JSOAttributes extends JavaScriptObject {
public native void set(String k, String v) /*-{ this[k]=v; }-*/;
public native String get(String k) /*-{ return this[k]; }-*/;
}
![Page 38: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/38.jpg)
Hybrid Web App
More than 1 language in your app
JavaScript as host platform
![Page 39: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/39.jpg)
JSON Model
Controllers
UI Components
Views
View Libs
Support Libs
Ajax REST Storage
![Page 40: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/40.jpg)
Frequency of changes
Code complexity
Infrastructure
Application Logic
UI Components
Views
![Page 41: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/41.jpg)
Infrastructure code is more manageable in static language
UI plumbing could be done in dynamic language
![Page 42: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/42.jpg)
JavaScript Part
GWTPart
![Page 43: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/43.jpg)
JSNI Method for Every Call ?private native void drawThings(...) /*-{ $jsLib.drawThings(...);}-*/;
private native void drawStuff(...) /*-{ $jsLib.drawStuff(...);}-*/;
private native void paintBlue() /*-{ $jsLib.paint(‘blue’);}-*/;
![Page 44: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/44.jpg)
Code like that?...Really?
![Page 45: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/45.jpg)
JavaScript Part
Dart/GWTPart
Too complex and unmanageable
![Page 46: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/46.jpg)
JavaScript Part
Dart/GWTPart
?
What if we do it like this?
![Page 47: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/47.jpg)
Event Bus in the browser?!
![Page 48: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/48.jpg)
Event Bus Pattern
EventBridge Callback
subscribe(Topic, Callback)unsubscribe(Callback)publish(Topic, Data)
onEvent(Data, Callback)
![Page 49: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/49.jpg)
This resulted in event ping-pong
![Page 50: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/50.jpg)
Introducing ‘Event Bridge’
EventBridge Callback
subscribe(Topic, Callback)unsubscribe(Callback)publish(Topic, Data, Callback)
onEvent(Data, Callback)
![Page 51: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/51.jpg)
public void onEvent(ModelAttributes attributes, ModelEventCallback callback) { ModelAttributes result = Responses.attributes(); result.set("result", "Response for JS"); callback.resolve(result);}
ModelAttributes data = Responses.attributes();data.set("value", "Hello from GWT");bridge.publish("broadcast", data);
Javabridge.subscribe("broadcast", this);
![Page 52: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/52.jpg)
$bridge.subscribe('broadcast', function (attrs, fn) { // JavaScript code fn(); });
$bridge.publish('broadcast', { value: ‘Hello from JavaScript‘ }, onResult );
JavaScript
![Page 53: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/53.jpg)
Not using JavaScript interoperability API
Transparent JSON based exchange
Single point of communication
Sync/async possible
Profit!
![Page 54: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/54.jpg)
Some Real-World Stuff
![Page 55: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/55.jpg)
Introducing Livesheets
www.livesheets.com
Visual Graph-based spreadsheets in the cloud
![Page 56: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/56.jpg)
![Page 57: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/57.jpg)
Complex Domain Model
Expression language
Offline calculations
Sharing and embedding
Main Challenges
![Page 58: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/58.jpg)
Twitter Bootstrap
Underscore.js
Require.js
jsPlumb
jQuery
GWT SDK
Guava
ANTLR
Domain Model
Guice
Client TechStack JavaJavaScript
B
![Page 59: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/59.jpg)
Click
jsPlumb
jQuery Controller
REST
Domain Model
B
Event Flow
Draw
![Page 60: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/60.jpg)
JSON Model
Controllers
UI Components
Views
View Libs
Support Libs
Ajax REST Storage
Java
JavaScript
![Page 61: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/61.jpg)
Clean View and Logic separation
Reusing cool JavaScript libraries
ANTLR in the browser!
Evaluation on client and server
![Page 62: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/62.jpg)
But what if ?...
![Page 63: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/63.jpg)
Event Bridge is coded in JavaScript.
Can we use otherlanguages?
![Page 64: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/64.jpg)
• New language by Google
• Compiles to JavaScript and runs in VM
• Both server and client modes
Dart Primer
![Page 65: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/65.jpg)
• Created by people with GWT, V8, JVM and Java background
• Sweet spot between Java and JavaScript
• Optional type safety
Dart Highlights
![Page 66: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/66.jpg)
Dart <> JavaScript#import('package:js/js.dart', prefix: 'js');
void main() {
dart() { }
js.scoped() { js.context.alert(‘Hello, JavaScript!’); js.context.x = new js.Callback.once(dart); }}
![Page 67: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/67.jpg)
onResult(data) { // Dart code}
eventBridge.publish('broadcast', {'value': 'Hello from Dart'}, onResult);
DartonEvent(data, callback) { // Dart code}
eventBridge.subscribe(‘broadcast’, onEvent);
![Page 68: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/68.jpg)
Event Bridge was much simpler to implement in
Dart
![Page 69: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/69.jpg)
JS
One B!d" to rule #em all
Dart
Type ScriptGWT
Clojure
Fantom
CoffeeScript
KotlinCeylon
![Page 70: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/70.jpg)
JavaScript is a platform, not only a language
JavaScript libraries should be pluggable
JavaScript is challenging to scale
For ambitious projects pick GWT, Dart or other
![Page 71: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/71.jpg)
Next Web Lang Checklist
JavaScript bi-directional integration
No recompilation while developing
Source maps for in-browser debugging
Consider using Event Bridge
![Page 72: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/72.jpg)
Pick the right tools!
![Page 73: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/73.jpg)
Dmitry Buzdin
@buzdin
www.buzdin.lv
![Page 74: Mlocjs buzdin](https://reader031.vdocuments.net/reader031/viewer/2022020306/544255c3b1af9f130d8b4610/html5/thumbnails/74.jpg)
Additional Info
https://github.com/buzdin/hybrid-web-apps
https://developers.google.com/web-toolkit/
http://www.dartlang.org
FlickrAttributionsrobert.molinariustheirhistoryal unisonoesther**Maccio Capatonda