introducing elm to a js app€¦ · 2 billion questions answered 100,000 lines of elm code 0...

Post on 19-Jul-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Introducing Elm to a JS App

@rtfeldman

2014 201620152013

2 billion questions answered

100,000 lines of elm code

0 runtime exceptions

IN PRODUCTION

compiles to JavaScript

functional programming language

DIFFERENT SEMANTICS

no null or undefinedall values are immutablefunctions have no side effects

GUARANTEES

elm in productionGOAL

lots of JS in production

STATUS QUO

lots of JS in production

elm in production

INTEROP

MAINTAIN GUARANTEES

while interoperating with JS?

how can Elm

Ellie

elm forRENDERING

Page

Elm App JS App

elm

elm

lots of JS in production

elm in production

PLANTA SEED

WATCH ITGROW

the elm architecture

INTERACTIVITY

VIEW FUNCTION

ARGUMENTS → VIRTUAL DOM

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

Interoperating with JavaScript

Elm code talks to JavaScriptthe way it talks to servers...by sending and receiving data!

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.js

app.js

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.ports.dataFromElm.subscribe(

app.js

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.ports.dataFromElm.subscribe((data) =>

app.js

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.ports.dataFromElm.subscribe((data) => { console.log("Elm says: " + data);});

viewupdate Model

Msg VDOM

Elm App

Cmd

JS App

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

JS App

"hi!"

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

JS App

"hi!"

"hi!"

app.js

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.ports.dataFromElm.subscribe((data) => { console.log("Elm says: " + data);}); "hi!"

app.js

var elem = document.getElementById("elm-app");var app = Elm.MyApp.embed(elem);

app.ports.dataFromElm.subscribe((data) => { // we can do whatever we want here!});

Page

Elm App JS App

elm

JS

elm app

JS App

Sending datafrom JS to Elm

app.js

Initialization Flags

var elem = document.getElementById("elm-app");var app = Elm.Main.embed(elem, "yo!");

viewupdate Model

Back-and-forthcommunication

app.js

var elem = document.getElementById("elm-app");var app = Elm.Main.embed(elem);

app.ports.dataToElm.send("hey!");

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

subscriptions

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

JS App

subscriptions

"hey!"

Elm App JS Appdata

Page

Elm App JS App

elm app

JS App

var menu = Elm.Menu.embed(menuElem);var sidebar = Elm.Sidebar.embed(sbElem);

var footer = Elm.Footer.embed(footerElem);

MULTIPLE EMBEDSapp.js

Page

Elm App

JS App

Elm App Elm App

lazy-loaded elm app

elm

elm

elm

elm forBUSINESS LOGIC

// app.ports.foo.send( … )// app.ports.bar.subscribe( … )

app.js

var app = Elm.MyApp.worker();

DOM

Elm App JS App

elm forDROP-IN COMPONENTS

import Elm from 'react-elm-components';import {Chat} from '../dist/elm/chatroom.js';function render() { return <Elm src={Chat} />;}

app.jsx

var React = require('react');module.exports = React.createClass({ initialize: function(node) { if (node === null) return;

var app = this.props.src.embed(node, this.props.flags);

if (typeof this.props.ports !== 'undefined') { this.props.ports(app.ports); }

}, shouldComponentUpdate: function(prevProps) { return false; }, render: function () { return React.createElement('div', { ref: this.initialize }); }});

react-elm-components

JS Wrapper Component

Elm App

the mostPOWERFUL IDEA

how far can weRUN WITH THIS?

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

data

viewupdate Model

Msg VDOM

Elm Runtime

Cmd

Elm App JS Appdata

here's what I want you to do

here's what I want you to know

Elm App JS Appdata

{ "type": "FOLLOW_USER", "payload": "rtfeldman"}

GUARANTEES INTACT

guide.elm-lang.org

RESOURCES

How to Use Elm at Workelm-lang.org/blog

pragmaticstudio.com

frontendmasters.com

humblespark.comElm Training

Luke Westbycreator of Ellie

lots of JS in production

elm in production

PLANTA SEED

WATCH IT GROW

@rtfeldman

top related