scala - li haoyi · scala.js safety & sanity in the wild west of the web li haoyi, dropbox, 20...
TRANSCRIPT
![Page 1: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/1.jpg)
Scala.jsSafety & Sanity in the wild west of the web
Li Haoyi, Dropbox, 20 July 2015
![Page 2: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/2.jpg)
1.1 Who am I and what is Scala.js?
- Haoyi works on devtools @ Dropbox- Previously web-infra
- Previously-previously DfB web
- Scala.js isn’t a Dropbox thing- Originally PhD project from some guy in Switzerland- Reasonably active open-source community- Not used @ Dropbox at all
![Page 3: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/3.jpg)
1.2 What is Scala.js?
Write Scala, Run Javascript, Make Website!
Compiler takes care of in between
100s of kb of code, ~0.9-4x slower as “raw” JS
Supports entire Scala language, many libraries
![Page 4: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/4.jpg)
1.3 Javascriptvar xhr = new XMLHttpRequest()
xhr.open("GET",
"http://api.openweathermap.org/" +
"data/2.5/weather?q=Singapore"
)
xhr.onload = function(e){
if (xhr.status === 200)
document.body.textContent = xhr.responseText
}
xhr.send()
![Page 5: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/5.jpg)
1.4 Javascript ES6 let xhr = new XMLHttpRequest()
xhr.open("GET",
"http://api.openweathermap.org/" +
"data/2.5/weather?q=Singapore"
)
xhr.onload = (e) => {
if (xhr.status === 200)
document.body.textContent = xhr.responseText
}
xhr.send()
![Page 6: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/6.jpg)
1.4 Javascript ES6 let xhr = new XMLHttpRequest()
xhr.open("GET",
"http://api.openweathermap.org/" +
"data/2.5/weather?q=Singapore"
)
xhr.onload = (e) => {
if (xhr.status === 200)
document.body.textContent = xhr.responseText
}
xhr.send()
![Page 7: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/7.jpg)
1.5 Scala.jsval xhr = new XMLHttpRequest()
xhr.open("GET",
"http://api.openweathermap.org/" +
"data/2.5/weather?q=Singapore"
)
xhr.onload = (e: Event) => {
if (xhr.status == 200)
document.body.textContent = xhr.responseText
}
xhr.send()
![Page 8: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/8.jpg)
1.6 Scala.jsval xhr = new XMLHttpRequest()
xhr.open("GET",
"http://api.openweathermap.org/" +
"data/2.5/weather?q=Singapore"
)
xhr.onload = (e: Event) => {
if (xhr.status == 200)
document.body.textContent = xhr.responseText
}
xhr.send()
![Page 9: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/9.jpg)
1.7 Scala.js to Javascriptval (obj, misc) = objects(i)
val t = obj.intersectionTime(ray)
if (t > Epsilon &&
t < length - Epsilon){
visible = false
}
var tup = self.Ve.objects[i]
if (null !== tup)
obj = tup._1, misc = tup._2
else
throw (new MatchError).init(tup)
var t = obj.intersectionTime(ray)
t > Example$().Epsilon &&
t < length - Example$().Epsilon &&
(visible = !1)
![Page 10: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/10.jpg)
1.7 Scala.js to Javascriptval (obj, misc) = objects(i)
val t = obj.intersectionTime(ray)
if (t > Epsilon &&
t < length - Epsilon){
visible = false
}
var tup = self.Ve.objects[i]
if (null !== tup)
obj = tup._1, misc = tup._2
else
throw (new MatchError).init(tup)
var t = obj.intersectionTime(ray)
t > Example$().Epsilon &&
t < length - Example$().Epsilon &&
(visible = !1)
![Page 11: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/11.jpg)
1.7 Scala.js to Javascriptval (obj, misc) = objects(i)
val t = obj.intersectionTime(ray)
if (t > Epsilon &&
t < length - Epsilon){
visible = false
}
var tup = self.Ve.objects[i]
if (null !== tup)
obj = tup._1, misc = tup._2
else
throw (new MatchError).init(tup)
var t = obj.intersectionTime(ray)
t > Example$().Epsilon &&
t < length - Example$().Epsilon &&
(visible = !1)
![Page 12: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/12.jpg)
1.7 What is Scala.jsval (obj, misc) = objects(i)
val t = obj.intersectionTime(ray)
if (t > Epsilon &&
t < length - Epsilon){
visible = false
}
var tup = self.Ve.objects[i]
if (null !== tup)
obj = tup._1, misc = tup._2
else
throw (new MatchError).init(tup)
var t = obj.intersectionTime(ray)
t > Example$().Epsilon &&
t < length - Example$().Epsilon &&
(visible = !1)
![Page 13: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/13.jpg)
Live DemoStarting Out
![Page 14: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/14.jpg)
1.8 Notes from the Demo
Fast turn-around time
Compile errors when you make a mistake
Accurate in-editor autocomplete
![Page 15: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/15.jpg)
Opal
WebSharper
2.1 How does Scala.js compare to...
![Page 16: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/16.jpg)
2.2 Everyone wants a better web SaferMore modular, expressive, reusable codeOne language across client/serverAsync supportMore tool-able & better toolingFewer warts
![Page 17: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/17.jpg)
2.3 SafetyUncaught TypeError: undefined is not a function
o.extend.trim
b
d.fx.step.(anonymous function)
o.fx.update
o.fx.step
F
o.fx.custom
![Page 18: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/18.jpg)
2.4 More Expressiverace = (winner, runners...) ->
print winner, runners
race = function() {
var winner = arguments[0]
var runners =
2 <= arguments.length ?
slice.call(arguments, 1) : [];
print(winner, runners);
};
![Page 19: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/19.jpg)
2.5 One language for client/server# This has been ported to our Python Emstring class
# Please keep them both in sync if you need to change something!
class Emstring
@em_snippet: (s, maxchars=50, location=0.75) ->
new Emstring(s.toString()).snippet(
maxchars, location
).toString()
![Page 20: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/20.jpg)
2.6 AsyncajaxFoo((a) =>
bar(a, (b) =>
baz(a, (c) =>
b + c
)
)
)
async{
var a = wait(ajaxFoo())
wait(bar(a)) + wait(baz(a))
}
![Page 21: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/21.jpg)
2.7 More Toolable/Better Tooling
![Page 22: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/22.jpg)
2.8 Fewer Warts
javascript> ["10", "10", "10", "10"].map(parseInt)[10, NaN, 2, 3] // WTF
![Page 23: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/23.jpg)
4.1 What is a web application?
ServerBrowser
Browser
Database
Server
![Page 24: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/24.jpg)
4.1 What is a web application?
ServerBrowser
Browser
Database
Server
![Page 25: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/25.jpg)
4.1 What is a web application?
ServerBrowser
Browser
Database
Server
DANGER
DANGERDANGER
Safety
Maybe
Saftety
?DANGER
![Page 26: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/26.jpg)
4.1 What is a web application?
ServerBrowser
Browser
Database
Server
DANGER
DANGERDANGER
Safety
Maybe
Saftety
?Safe
ty
![Page 27: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/27.jpg)
4.2 Typed HTML!div(
float.left,
p("I am cow"),
p("Hear me moo")
)
<div
style="float: left">
<p>I am cow</p>
<p>Hear me moo</p>
</div>
![Page 28: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/28.jpg)
4.2 Typed HTML!div(
float.elft,
p("I am cow"),
p("Hear me moo")
)
value elft is not a member of object float
float.elft,
^
Compilation failed
![Page 29: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/29.jpg)
4.2 Typed HTML!dvi(
float.left,
p("I am cow"),
p("Hear me moo")
)
Not found: value dvi
dvi(
^
Compilation failed
![Page 30: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/30.jpg)
4.3 What is a web application?
ServerBrowser
Browser
Database
Server
DANGERDANGER
Safety
Maybe
Saftety
?Safe
tySafety
![Page 31: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/31.jpg)
4.4 Hygienic, Typed CSS!trait Simple{
def btn = cls(
color := "red",
height := 125
)
def fade = cls.hover(
opacity := 0.5
)
}
.$pkg-Simple-btn{
color: red;
height: 125px;
}
.$pkg-Simple-fade:hover{
opacity: 0.5;
}
![Page 32: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/32.jpg)
4.4 Hygienic, Typed CSS!trait Simple{
def btn = cls(
color := "red",
height := 125
)
def fade = cls.hover(
opacity := 0.5
)
}
.$pkg-Simple-btn{
color: red;
height: 125px;
}
.$pkg-Simple-fade:hover{
opacity: 0.5;
}
![Page 33: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/33.jpg)
4.4 Hygienic, Typed CSS!trait Simple{
def btn = cls(
colro := "red",
height := 125
)
def fade = cls.hover(
opacity := 0.5
)
}
Not found: value colro
colro := "red"
^
Compilation failed
![Page 34: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/34.jpg)
4.4 Hygienic, Typed CSS!trait Simple{
def btn = cls(
color := "red",
height := 125
)
def fade = cls.hovre(
opacity := 0.5
)
}
value hovre is not a member of object cls
def fade = cls.hovre(
^
Compilation failed
![Page 35: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/35.jpg)
4.5 Hygienic, Typed CSS!
val x = div(
cls := """
$pkg-Simple-btn
$pkg-Simple-fade
""",
h1(...),
p(...)
)
<div class="
$pkg-Simple-btn
$pkg-Simple-fade">
<h1>...</h1>
<p>...</p>
</div>
![Page 36: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/36.jpg)
4.5 Hygienic, Typed CSS!import Simple._
val x = div(
btn,
fade,
h1(...),
p(...)
)
<div class="
$pkg-Simple-btn
$pkg-Simple-fade">
<h1>...</h1>
<p>...</p>
</div>
![Page 37: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/37.jpg)
4.5 Hygienic, Typed CSS!import Simple._
val x = div(
btn,
fadee,
h1(...),
p(...)
)
Not found: value fadee
fadee,
^
Compilation failed
![Page 38: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/38.jpg)
4.6 What is a web application?
ServerBrowser
Browser
Database
ServerDANGERSafe
tyMay
be
Saftety
?Safe
tySafety
Safety
![Page 39: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/39.jpg)
4.7 Ajax!
var xhr = new XMLHttpRequest()
xhr.open("http://www.bit.ly")
xhr.onload = (x) => {
...
}
xhr.send()
import dom._
var xhr = new XMLHttpRequest()
xhr.open("http://www.bit.ly")
xhr.onload = (x: Event) => {
...
}
xhr.send()
![Page 40: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/40.jpg)
4.7 Ajax!// Javascript
$j.ajax("/api/list", {
data: inputBox.value,
onComplete: function(res){ ... }
})
![Page 41: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/41.jpg)
4.7 Ajax!// Javascript
$j.ajax("/api/list", {
data: inputBox.value,
onComplete: function(res){ ... }
})
How do we know this correct?
![Page 42: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/42.jpg)
4.7 Ajax!// Javascript
$j.ajax("/api/list", {
data: inputBox.value,
onComplete: function(res){ ... }
})
How do we know this correct?
And this value?
![Page 43: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/43.jpg)
4.7 Ajax!// Javascript
$j.ajax("/api/list", {
data: inputBox.value,
onComplete: function(res){ ... }
})
How do we know this correct?
And this value?
And that we’re using this res the right way?
![Page 44: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/44.jpg)
4.7 Typed Ajax!// Javascript
$j.ajax("/api/list", {
data: inputBox.value,
onComplete: function(res){ ... }
})
// Scala.js
val res = Ajax[Api].list(inputBox.value).call()
![Page 45: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/45.jpg)
Live DemoTyped Ajax
![Page 46: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/46.jpg)
5.1 What is a web application?
ServerBrowser
Browser
Database
ServerSafe
tyMay
be
Saftety
?Safe
tySafety
Safety Safe
ty
![Page 47: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/47.jpg)
5.2 Scala.js gives you...
- Shared client-server code
- Shared client-server libraries
- A reasonable language to write the client in
![Page 48: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/48.jpg)
5.3 Scala.js gives you...
Everything that - ES6 gives (string-interp, const, class, =>, …)- Typescript gives (types, generics, …)
- Persistent collections, - Monads, macros, mixins, ...- Higher kinded types, virtual classes, ...
![Page 49: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/49.jpg)
5.3 Scala.js does not give you
undefined is not a functionMal-formed HTMLUn-used CSS classesUsing un-defined CSS classesCSS class-name collisionsMal-formed Ajax requests
![Page 50: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/50.jpg)
Fun uses of Scala.js
Ray Tracing
Platform Games
TodoMVC
Djinni.js
![Page 51: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/51.jpg)
5.4 Safety & Sanity on the Web
Shared code between Client & Server
Enforce safety throughout the entire application, not just the Javascript
Not 12 months from now, but today!
![Page 52: Scala - Li Haoyi · Scala.js Safety & Sanity in the wild west of the web Li Haoyi, Dropbox, 20 July 2015](https://reader034.vdocument.in/reader034/viewer/2022050111/5f48941fed795b42a260baff/html5/thumbnails/52.jpg)
Questions?