mlocjs buzdin

74
Polyglot Programming in the Browser or ‘Building Hybrid Web Apps’

Post on 18-Oct-2014

2.903 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Mlocjs buzdin

Polyglot Programming in the Browser

or ‘Building Hybrid Web Apps’

Page 3: Mlocjs buzdin

The Story Begins...

Page 4: Mlocjs buzdin

This story begins long time ago...

Page 5: Mlocjs buzdin

When Browsers Were Brutal

Page 6: Mlocjs buzdin

Back in School I learned JavaScript

Page 7: Mlocjs buzdin

JavaScript seemed simplistic, fragile anduseless...

Page 8: Mlocjs buzdin

I skipped that andwent for Windows-based

client-server apps

Page 9: Mlocjs buzdin

Some time passed...

Page 10: Mlocjs buzdin

I joined my first serious Java-based Web project

Page 11: Mlocjs buzdin

It had quite standard architecture:JSP, Struts, Servlets, XML

Page 12: Mlocjs buzdin

> Ajax> Drag and drop> Custom components> Auto-completion> XSLT transformations> Lots of CSS

Page 13: Mlocjs buzdin

Running in IE6

Page 14: Mlocjs buzdin

Written in plain JavaScript,without jQuery!

Page 15: Mlocjs buzdin

JavaScript seemed simplistic, fragile andkinda useful ...

Page 16: Mlocjs buzdin

People liked the system !

And they asked for morelike that ...

Page 17: Mlocjs buzdin

After a lot of thinking we picked Google Web Toolkit

Page 18: Mlocjs buzdin

GWT Primer

Write in Java - compile to JavaScriptRecompilation on browser refreshTransparent RPC protocol via Ajax

Page 19: Mlocjs buzdin

> Everything is dynamic> Everything is Ajax> OOP and Modularity> Refactoring Support

Page 20: Mlocjs buzdin

> Multi-browser support> Obfuscation and compression> Browser-specific optimization> No vendor lock-in

Some More Features

Page 21: Mlocjs buzdin

Shipped 10+ applicationsown custom widget set

and few reusable libraries

Page 22: Mlocjs buzdin

Some more time passed...

Page 23: Mlocjs buzdin

JavaScript became cool !

Page 24: Mlocjs buzdin

Two more thingsappeared

Page 25: Mlocjs buzdin

Customers started demanding > Excel-like grids> Data Visualization> Mobile Support

Page 26: Mlocjs buzdin

We started considering JavaScript seriously

Page 27: Mlocjs buzdin

console.log("2" / "2"); // 1

console.log("2" * "2"); // 4

console.log("1" + "2"); // 12

Page 28: Mlocjs buzdin

console.log([1, 2, 3] + 1); // 1,2,31

console.log(1 + true + false); // 2

console.log(true + "a"); // truea

Page 29: Mlocjs buzdin

> Weak typing> No scopes, no modules> Awkward class syntax> No refactoring> DIY builds

Page 30: Mlocjs buzdin

JavaScript...

Page 31: Mlocjs buzdin

JavaScript is still simplistic, fragile,but extremely useful !

Page 32: Mlocjs buzdin

So what to do?

Page 33: Mlocjs buzdin

We decided to stick with Google Web Toolkit

Page 34: Mlocjs buzdin

GWT had few problems:> No high-end widgets> No HTML5 support> No eval()

Page 35: Mlocjs buzdin

How to integrate with JavaScript libraries?

Page 36: Mlocjs buzdin

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

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

Hybrid Web App

More than 1 language in your app

JavaScript as host platform

Page 39: Mlocjs buzdin

JSON Model

Controllers

UI Components

Views

View Libs

Support Libs

Ajax REST Storage

Page 40: Mlocjs buzdin

Frequency of changes

Code complexity

Infrastructure

Application Logic

UI Components

Views

Page 41: Mlocjs buzdin

Infrastructure code is more manageable in static language

UI plumbing could be done in dynamic language

Page 42: Mlocjs buzdin

JavaScript Part

GWTPart

Page 43: Mlocjs buzdin

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

Code like that?...Really?

Page 45: Mlocjs buzdin

JavaScript Part

Dart/GWTPart

Too complex and unmanageable

Page 46: Mlocjs buzdin

JavaScript Part

Dart/GWTPart

?

What if we do it like this?

Page 47: Mlocjs buzdin

Event Bus in the browser?!

Page 48: Mlocjs buzdin

Event Bus Pattern

EventBridge Callback

subscribe(Topic, Callback)unsubscribe(Callback)publish(Topic, Data)

onEvent(Data, Callback)

Page 49: Mlocjs buzdin

This resulted in event ping-pong

Page 50: Mlocjs buzdin

Introducing ‘Event Bridge’

EventBridge Callback

subscribe(Topic, Callback)unsubscribe(Callback)publish(Topic, Data, Callback)

onEvent(Data, Callback)

Page 51: Mlocjs buzdin

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

$bridge.subscribe('broadcast', function (attrs, fn) { // JavaScript code fn(); });

$bridge.publish('broadcast', { value: ‘Hello from JavaScript‘ }, onResult );

JavaScript

Page 53: Mlocjs buzdin

Not using JavaScript interoperability API

Transparent JSON based exchange

Single point of communication

Sync/async possible

Profit!

Page 54: Mlocjs buzdin

Some Real-World Stuff

Page 55: Mlocjs buzdin

Introducing Livesheets

www.livesheets.com

Visual Graph-based spreadsheets in the cloud

Page 56: Mlocjs buzdin
Page 57: Mlocjs buzdin

Complex Domain Model

Expression language

Offline calculations

Sharing and embedding

Main Challenges

Page 58: Mlocjs buzdin

Twitter Bootstrap

Underscore.js

Require.js

jsPlumb

jQuery

GWT SDK

Guava

ANTLR

Domain Model

Guice

Client TechStack JavaJavaScript

B

Page 59: Mlocjs buzdin

Click

jsPlumb

jQuery Controller

REST

Domain Model

B

Event Flow

Draw

Page 60: Mlocjs buzdin

JSON Model

Controllers

UI Components

Views

View Libs

Support Libs

Ajax REST Storage

Java

JavaScript

Page 61: Mlocjs buzdin

Clean View and Logic separation

Reusing cool JavaScript libraries

ANTLR in the browser!

Evaluation on client and server

Page 62: Mlocjs buzdin

But what if ?...

Page 63: Mlocjs buzdin

Event Bridge is coded in JavaScript.

Can we use otherlanguages?

Page 64: Mlocjs buzdin

• New language by Google

• Compiles to JavaScript and runs in VM

• Both server and client modes

Dart Primer

Page 65: Mlocjs buzdin

• 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

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

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

Event Bridge was much simpler to implement in

Dart

Page 69: Mlocjs buzdin

JS

One B!d" to rule #em all

Dart

Type ScriptGWT

Clojure

Fantom

CoffeeScript

KotlinCeylon

Page 70: Mlocjs buzdin

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

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

Pick the right tools!

Page 74: Mlocjs buzdin

Additional Info

https://github.com/buzdin/hybrid-web-apps

https://developers.google.com/web-toolkit/

http://www.dartlang.org

FlickrAttributionsrobert.molinariustheirhistoryal unisonoesther**Maccio Capatonda