Prelegere din cadrul materiei "Dezvoltarea aplicaţiilor Web cu JavaScript" (Full-Stack Web Development) predată de Dr. Sabin Buraga (oct.2019–feb.2020).
Resurse suplimentare la https://profs.info.uaic.ro/~busaco/teach/courses/staw/web-film.html
5. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Editoare + medii integrate (IDE):
Ace (Ajax.org Cloud9 Editor), Atom Editor, Brackets,
CodeLite, Komodo, JS Development Tools (Eclipse),
Sublime Text, Visual Studio (Code), WebStorm etc.
a se considera și
github.com/sorrycc/awesome-javascript#editors
instrumente: editare
13. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Verificarea corectitudinii codului JavaScript
construcția "use strict"; indică interpretorului
că se va utiliza varianta strictă a limbajului
disponibilă începând cu ECMAScript versiunea 5
developer.mozilla.org/Web/JavaScript/Reference/Strict_mode
instrumente: testare
16. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Modul de procesare strict:
modifică semantica programelor
este implicit folosit pentru modulele de cod ES6
module code is always strict mode code
nu este impus de mediul de execuție
instrumente: testare
20. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Suport pentru testare, inclusiv unit testing
exemplificări:
AVA, Cypress, dom-testing-library, Flow, Jasmine, Jest,
Mocha, PhantomJS, Qunit, Sinon.js, Tape, TestCafe etc.
github.com/sorrycc/awesome-javascript#testing-frameworks
de studiat și Let’s Code: Test-Driven JavaScript
www.letscodejavascript.com
instrumente: testare
31. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Sisteme de management al machetelor de redare
a conținutului (templating engines)
exemplificări:
Dust.js, EJS, Handlebars, Mustache.js,…
github.com/sorrycc/awesome-javascript#templating-engines
instrumente: machete de redare
35. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Suport pentru creșterea performanței
asm.js (Mozilla, 2012—2014)
subset JavaScript ce poate fi utilizat ca limbaj de nivel
scăzut, eficient – în spiritul limbajului de asamblare
rulează nativ în Chrome, Edge și Firefox
asmjs.org
instrumente
36. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Suport pentru creșterea performanței
WebAssembly – wasm (în lucru, 29 octombrie 2019)
limbaj de programare proiectat pentru execuție eficientă
la nivel de (browser) Web
safe, portable, low-level code format
webassembly.org developer.mozilla.org/WebAssembly
instrumente
37. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Suport pentru creșterea performanței
WebAssembly – wasm
include un set restrâns de tipuri de date și operații
permite optimizări la momentul compilării
axat pe realizarea de calcule numerice complexe
uzual, programele wasm sunt organizate în module
instrumente
38. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
instrumente
studii de caz reale:
P. Jha, S. Padmanabhan, WebAssembly at eBay:
A Real-World Use Case (2019)
tech.ebayinc.com/engineering/webassembly-at-ebay-a-real-world-use-case/
R. Aboukhalilich, How We Used WebAssembly
To Speed Up Our Web App By 20X (2019)
www.smashingmagazine.com/2019/04/webassembly-speed-web-app/
G. Cuvillier, D3WASM: A Port of Doom 3 Engine to
WebAssembly and WebGL (2019)
www.continuation-labs.com/projects/d3wasm/
39. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
C/C++ alte limbaje
cod binar
compilator
JIT (Just-In-Time) / AOT (Ahead-Of-Time)
JS/ES
alte limbaje
wasmasm.js
platformă de execuție (run-time)
navigator Web, server Web, soluție cloud
emscripten
binaryen
aplicație scrisă în limbajul de programare preferat
modul wasmpublicare pe Web a modulului wasm
încărcare asincronă a modulului wasminstanțierea
modulului wasmapelarea funcțiilor furnizate
41. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Utilizarea unui modul wasm via API-ul JS disponibil
obiecte:
WebAssembly Global Module Instance Memory Table
metodă de instanțiere: instantiateStreaming()
tratarea erorilor: CompileError LinkError RuntimeError
developer.mozilla.org/WebAssembly#API_reference
instrumente
42. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
De regulă, un modul wasm nu are acces direct la DOM,
dar codul poate fi partajat de alte programe JS
neinteractive – „lucrători” (Web workers) –
și instanțiat de multiple ori
de evitat transferuri frecvente de date JS↔wasm
instrumente
44. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Serverless WebAssembly – exemplificări:
funcții serverless Node.js încărcând module wasm
exploatate pe IBM Cloud Functions ce recurge la
platforma deschisă Apache OpenWhisk
(James Thomas, august 2019)
jamesthom.as/blog/2019/08/06/serverless-and-webassembly-modules/
funcții serverless WebAssembly generate cu Rust și
executate pe platforma Cloudflare Workers
developers.cloudflare.com/workers/templates/boilerplates/rustwasm/
45. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Rularea neautorizată de cod wasm poate conduce la
probleme de securitate:
buffer overflow cauzând XSS (Cross-Site Scripting),
execuție pe server (Server-Side Remote Code Execution),
includere de malware (e.g., cryptocurrency mining) etc.
www.virusbulletin.com/virusbulletin/2018/10/dark-side-webassembly
instrumente
46. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Incidente reale vizând WebAssembly:
“over50 %of all sites using WebAssembly apply it for
malicious deeds, such as mining and obfuscation”
M. Musch et al., “New Kid on the Web:
A Study on the Prevalence of WebAssembly in the Wild”, DIMVA 2019
www.tu-braunschweig.de/Medien-DB/ias/pubs/2019-dimva.pdf
R. Neumann & A. Toro, In-browser mining:
Coinhive and WebAssembly (aprilie 2018)
www.forcepoint.com/blog/x-labs/browser-mining-coinhive-and-webassembly
WebKit: Info leak in WebAssembly Compilation (martie 2018)
bugs.chromium.org/p/project-zero/issues/detail?id=1545
50. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Alte limbaje – compilate în JS:
TypeScript
a se considera și inițiativa AssemblyScript
(TypeScriptWebAssembly via compilatorul Binaryen):
docs.assemblyscript.org
blog.logrocket.com/the-introductory-guide-to-assemblyscript/
instrumente
51. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Portarea altor aplicații în JavaScript
Emscripten – compilator LLVM generând cod JS/wasm
(e.g., programe C sau C++ care se compilează
în WebAssembly, plus cod OpenGL în WebGL)
kripken.github.io/emscripten-site/
instrumente
70. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului
în cazul JS clasic, specificarea modulelor se poate realiza
via limbajul AMD (Asynchronous Module Definition)
încărcare de cod folosind biblioteci specifice:
curl.js, PINF, RequireJS,…
71. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului
alternativ, se poate recurge la CommonJS
un format de declarare a modulelor și pachetelor
reutilizabile la nivel de server
wiki.commonjs.org/wiki/CommonJS
72. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
abordare fără module
(monolitică)
abordare modulară
(pachete + module ES/wasm)
fiecare fragment de cod
este implicit global
pachetele expun interfețe publice
ușor de înțeles
numele (clase, funcții,
constante,…) sunt globale
numele sunt locale pachetului
ce le definește
acces direct la
implementarea efectivă
detaliile de implementare
sunt ascunse
dependența de ordinea încărcării
fișierelor
ordinea încărcării fișierelor
nu are importanță
dependențele de cod
sunt implicite
dependențele de cod
sunt declarate explicit
relații nespecificate
între fișiere & module
fiecare fișier expune
un modul unic
dependențele depind de
contextul rulării
se permite rularea din linia de
comandă (headless browser)
73. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului
pentru alte resurse de interes, a se consulta
Nicolás Bevacqua, Module Design, 2018
ponyfoo.com/articles/module-design
Serg Hospodarets, Native JavaScript modules, 2018
slides.com/malyw/native-js-modules
ES6 modules for Web usage:
github.com/webmodules
76. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
structura de bază a unei SPA
de studiat Mikito Takada, Single Page Apps in Depth (2017)
singlepageappbook.com
ⵄ DOM
▣ view
▦ model
⧆ template
🛢 storage
☄ events
changes
observes
renders
queries &
writes to
emits
78. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
models are the single source of truth
modelele reprezintă toate datele/stările aplicației Web și
sunt păstrate în memorie
ⵄ DOM
▣ view
▦ model
⧆ template
🛢 storage
☄ events
changes
observes
renders
queries &
writes to
emits
79. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
views observe model changes
view-urile reflectă conținutul modelelor și
primesc notificări de actualizare din partea modelelor
ⵄ DOM
▣ view
▦ model
⧆ template
🛢 storage
☄ events
changes
observes
renders
queries &
writes to
emits
80. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
decoupled modules that expose small external surfaces
arhitectura aplicației este compusă din
sub-sisteme (module) independente, specializate
pachete expunând o interfață simplă publică
ⵄ DOM
▣ view
▦ model
⧆ template
🛢 storage
☄ events
changes
observes
renders
queries &
writes to
emits
82. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
la nivel de front-end, fiecare componentă interactivă
(e.g., buton, player, câmp de editare) poate să se afle
într-o anumită stare (isPressed, isPlaying, isTyping,…)
acestă stare nu este neapărat dependentă de back-end
model components
84. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
SPA (Single Page Applications)
problemă:
redarea/împrospătarea eficientă a conținutului
(toate componentele interactive să fie sincronizate)
operațiile de alterare (mutation) a DOM-ului
sunt costisitoare pentru aplicații Web complexe
86. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
SPA (Single Page Applications)
managementul stării aplicației la momentul rulării
URL↔stare
starea curentă a view-ului e dependentă de URL
uzual, de #fragment-identifier
tools.ietf.org/html/rfc3986#section-3.5
91. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
SPA (Single Page Applications)
definirea unor componente ce ulterior pot fi inițializate
suport pentru reutilizare
aceste componente pot fi încărcate asincron
(eventual, la cerere) via module
93. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
SPA (Single Page Applications)
uzual, se bazează pe paradigma de
programare (funcțională) reactivă
(FRP – functional reactive programming)
aspecte formale în C. Elliot & P. Hudak,
Functional Reactive Animation, ICFP 1997
conal.net/papers/icfp97/
github.com/conal/talk-2015-essence-and-origins-of-frp
94. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
SPA (Single Page Applications)
programare (funcțională) reactivă
paradigmă declarativă
vizând fluxuri de date prelucrate asincron
(event stream, observable)
a stream a sequence of ongoing events ordered in time
gist.github.com/staltz/868e7e9bc2a7b8c1f754
95. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
orice modificare a valorii unei structuri de date ce poate fi
observată (Observable) determină propagarea
unui eveniment ce poate fi tratat asincron (via Promise)
de entitățile ce depind de această structură
www.sitepoint.com/graphql-react-native-getting-started/
synchronous asynchronous
multiplesingle
Generator Observable
PromiseFunction
100. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
JavaScript pe platforme multiple
framework-uri și biblioteci JavaScript specializate
e.g., interacțiune prin gesturi:
Hammer.js – hammerjs.github.io
iScroll – github.com/cubiq/iscroll
Slideout.js – slideout.js.org
altele la www.javascripting.com/mobile-and-touch/
101. Dr.SabinBuragaprofs.info.uaic.ro/~busaco
JavaScript pe platforme multiple
recurgerea la API-uri JavaScript oferite de platformă
Amazon Fire
developer.amazon.com/apps-and-games/services-and-apis
Microsoft Windows Universal Applications
docs.microsoft.com/en-us/windows/uwp/
Tizen
developer.tizen.org/category/tags/javascript