Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Changement de paradigme: de l'app HTML à l'app ...
Search
Jimmy Bourassa
March 18, 2015
Technology
21
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Changement de paradigme: de l'app HTML à l'app JavaScript
Jimmy Bourassa
March 18, 2015
Other Decks in Technology
See All in Technology
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
190
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
150
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
150
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
200
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
130
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
190
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
8
3.1k
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
4
1.1k
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
The agentic SEO stack - context over prompts
schlessera
0
970
Writing Fast Ruby
sferik
630
63k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Evolving SEO for Evolving Search Engines
ryanjones
0
330
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Transcript
WAQ <3
Marketing Social dans un univers cloud-mobile à l’aube du Web
3.0 #waq-social-cloud-web3
SPA vrai…
CHANGEMENT DE PARADIGME de l’app HTML à l’app JavaScript
None
None
&
None
None
Comment faire des apps JavaScript sans se faire mal
ATTENTION Peut contenir des traces d’opinions
ATTENTION Peut contenir des traces d’opinions
SPA == App JavaScript Client == Browser == Navigateur Terminologie
== App Frontend API == Backend
Plan de match ‣ C’est quoi une SPA? ‣ Frameworks
& outils ‣ Structure d’applications ‣ Design d’API ‣ Tests
SPA C’est quoi?
C’est quoi une app JavaScript (SPA)? App web où le
client est en charge de gérer les différents états sans recharger la page.
SPA vs app HTML ‣ Aucun chargement après le chargement
initial ‣ Conserve l’état entre les différentes parties de l’application ‣ Le UI (HTML?) est généré par le client ‣ Beaucoup de JavaScript
Simuler une application Desktop
Les SPA, awesome pour ‣ Gérer plusieurs états en simultanément
‣ Apps offline ‣ Des UI très interactifs & complexes ‣ Packager pour mobile / desktop
None
None
Les SPAs ne remplacent pas les documents hypertextes
Une SPA c’est aussi deux applications
bien plus beau mais bien plus difficile
Les prérequis
l’ami, tu connais?
$(document).ready(function() { $('.bxslider').bxSlider(); $('.tooltip').tooltipster(); }); X
$(document).ready(function() { $('.bxslider').bxSlider(); $('.tooltip').tooltipster(); }); X
var a, b; (function () { var a = b
= 'TEST'; })() console.log(a, b); // => ?
Le web, l’ami, tu connais?
SPA Quel Framework choisir?
None
(page blanche)
MVC browser != MVC serveur Macération de Viande de Cerf
MVC browser != MVC serveur Macération de Viande de Cerf
Build tool prenez en un. Broccoli Gulp Grunt
SPA Structurer 2 applications
App JavaScript index.html API Serveur JSON via HTTP
App JavaScript index.html API Serveur JSON via HTTP App iOS
App Android
Un .git? Deux .git? Quarante-deux .git?
Un repo tant que ça fonctionne
Un repo tant que ça fonctionne ‣ Simplicité pour :
‣ Synchroniser les versions API <-> web app ‣ Déploiement atomiques
app/ adminjs/ -> app/assets/javascripts/admin jsapp/ -> app/assets/javascripts/discourse bin/ config/ db/
docs/ lib/ log/ public/ script/ spec/ test/ vendor/
client/ # SPA server/ # API Procfile README.md Structure alternative
Servir 2 apps
Servir 2 apps en dev 1) Builder la SPA dans
public/ de l’app serveur
Servir 2 apps en dev 2) Build tool + proxy
vers l’API + Foreman var Proxy = require('http-proxy'); app.use('/', function(req, res, next){ proxy.web(req, res, { target: BACKEND_URL }); });
None
Servir 2 apps en prod
SPA Design d’API
API expérience utilisateur →
Écrivez d’abord la Documentation
None
None
Utopique en réflexion Pragmatique en implémentation
REST REpresentational State Transfer
REST PUT /users/1 POST /users GET /users GET /users/1 DELETE
/users/1
RPC Remote Procedure Call
RPC PUT /users/1/ban
REST ou RPC ? LES DEUX
Considérez les conventions de vos outils
Ressources « flat »
Ressources « flat » /threads/1/posts /users/1/posts
Ressources « flat » /threads/1/posts /users/1/posts ↳ /posts ?thread_id={id} ?user_id={id}
Agnostique de la session* * En restant pragmatique
Agnostique de la session* * En restant pragmatique PUT /user
* En restant pragmatique PUT /user PUT /users/1 → Agnostique
de la session*
* En restant pragmatique POST /messages { thread_id: 33, message:
"Jamón" } Agnostique de la session*
* En restant pragmatique POST /messages { thread_id: 33, message:
"Jamón" } { user_id: 1337 thread_id: 33, message: "Jamón" } → Agnostique de la session*
Relations — it’s complicated
Relations Inclure ou référencer?
Relations - Inclure { post: { message: "APIs, pffft.", created_at:
"2015-03-18T19:15:09Z", user: { id: 1337 name: "Bilbo" } } }
Relations - Référencer { post: { message: "APIs, pffft.", created_at:
"2015-03-18T19:15:09Z", user_id: 1337 } }
Relations - Référencer { post: { message: "APIs, pffft.", created_at:
"2015-03-18T19:15:09Z", links: { user: "https://ton.app/api/users/1337" } } }
Inclure ou référencer?
LES DEUX Inclure ou référencer?
représentation
jsonapi.org
Soyez smath
None
None
None
Soyez smath def publish(post_id) post = Post.find(post_id) if post.published raise
AlreadyPublishedError end post.publish render(post) end
Soyez smath def publish(post_id) post = Post.find(post_id) if !post.published post.publish
end render(post) end def publish(post_id) post = Post.find(post_id) if post.published raise AlreadyPublishedError end post.publish render(post) end
Clients deviennent désynchronisés
API, recap ‣ Documentation ‣ Pragmatisme avant tout ‣ Une
représentation par ressource ‣ URL flats ‣ Soyez smath
SPA Tests automatisés
Tests automatisés
Quels sont les objectifs ?
Faciliter le développement Assurer la pérennité de l’application
Test unitaires Backend Frontend
Test API
Payload documenté
Payload documenté → /api/endpoint
Payload documenté → /api/endpoint → → Effets de bord documentés
Réponse documentée
None
Tester l’interaction utilisateur
// Test Publish message
// Test Publish message mockEndpoints();
// Test Publish message mockEndpoints(); visit('messages/new')
// Test Publish message mockEndpoints(); visit('messages/new') fillIn('#message', 'Hello WAQ')
// Test Publish message mockEndpoints(); visit('messages/new') fillIn('#message', 'Hello WAQ') submit('#save-message')
// Test Publish message mockEndpoints(); visit('messages/new') fillIn('#message', 'Hello WAQ') submit('#save-message')
equal(App.posts.length, 1) equal(App.posts[0], 'Hello WAQ')
None
Rouler plusieurs suites de tests ./client/tests && ./server/tests
SPA TLDR;
Le résultat d’une SPA peut être incroyable
Y’en aura pas de facile
Restez critique
Restez pragmatique
Merci.