Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Changement de paradigme: de l'app HTML à l'app ...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Jimmy Bourassa
March 18, 2015
Technology
0
21
Changement de paradigme: de l'app HTML à l'app JavaScript
Jimmy Bourassa
March 18, 2015
Tweet
Share
Other Decks in Technology
See All in Technology
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
510
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
120
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.2k
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
150
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
800
マネージャー視点で考えるプロダクトエンジニアの評価 / Evaluating Product Engineers from a Manager's Perspective
hiro_torii
0
210
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.6k
AWS Network Firewall Proxyを触ってみた
nagisa53
1
250
SRE Enabling戦記 - 急成長する組織にSREを浸透させる戦いの歴史
markie1009
0
180
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
650
(技術的には)社内システムもOKなブラウザエージェントを作ってみた!
har1101
0
380
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
840
A Soul's Torment
seathinner
5
2.3k
The SEO identity crisis: Don't let AI make you average
varn
0
330
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
110
エンジニアに許された特別な時間の終わり
watany
106
230k
ラッコキーワード サービス紹介資料
rakko
1
2.3M
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
The Limits of Empathy - UXLibs8
cassininazir
1
220
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.6k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
430
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.