Bonnes pratiques de développement JavaScript

Transcription

Bonnes pratiques de développement JavaScript
Bonnes pratiques de développement JavaScript
Titre présentation | Conférencier
François Béliveau
Romain Dorgueil
A propos de nous ...
François Béliveau
Romain Dorgueil
• Développeur web depuis 8
ans
• Utilisateur symfony depuis 0.4
• Utilise symfony depuis 2 ans
• Membre de l’équipe
SensioLabs
• SensioLabs depuis Décembre
2007
• Développeur Core-Team
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques ?
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Rapidement, on passe en revue le côté serveur.
Romain
Bonnes pratiques
• Découplage
– Moins de code par classe / par fichier
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Romain (speed)
Bonnes pratiques
• Découplage
– Moins de code par classe / par fichier
– Lisible
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques
• Découplage
– Moins de code par classe / par fichier
– Lisible
– Aéré
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques
• Organisation
– Arborescence
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
François (speed)
Profiter de la structure du système de fichiers (arbo)
Bonnes pratiques
• Organisation
– Arborescence
– Tri par fonctionnalité
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Utiliser les répertoires pour classer le code
Bonnes pratiques
• Organisation
– Arborescence
– Tri par fonctionnalité
– Problèmes de couplages apparents
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques
• Commentaires & documentation
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Romain (speed)
Bonnes pratiques
• Commentaires & documentation
– Outil personnel
• Comprendre d’un coup d’œil son code
• PHPDoc: typage, valeur de retours…
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques
• Commentaires & documentation
– Outil personnel
• Comprendre d’un coup d’œil son code
• PHPDoc: typage, valeur de retours…
– Outil d’équipe
• Comprendre d’un coup d’oeil du code inconnu
• Comportement attendu ≠ lire le code
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques
• Don’t Repeat Yourself
– Code à deux endroits = Erreur à deux endroits
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
François (speed)
Bonnes pratiques
• Don’t Repeat Yourself
– Code à deux endroits = Erreur à deux endroits
– Réutilisation facilitée
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
François
Bonnes pratiques
• Don’t Repeat Yourself
– Code à deux endroits = Erreur à deux endroits
– Réutilisation facilitée
– Simplifie la maintenance
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
François
Bonnes pratiques, pourquoi ?
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Romain
Bonnes pratiques, pourquoi?
• Ne pas créer une boîte noire!
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques, pourquoi?
Ne pas créer une boîte noire!
= contrôle du projet
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques, pourquoi?
• Ne pas créer une boîte noire!
= contrôle du projet
= maîtrise des temps
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bonnes pratiques, pourquoi?
• Ne pas créer une boîte noire!
= contrôle du projet
= maîtrise des temps
= maîtrise des coûts
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Et en JavaScript ?
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
François
Organisation des développements JavaScript
sfDynamicsPlugin
Titre présentation | Conférencier
Romain Dorgueil
On va commencer par une première problématique: lʼorganisation des dev js dans un projet
Organisation d’un projet
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Qu’a t on aujourd’hui?
On regarde côté serveur, et on voit ce que ca donne sur les
comportements dynamiques clients.
Organisation d’un projet
• Deux approches
– Organisation par application
– Organisation par fonctionnalité
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Différentes approches d’organisation des projets.
Principalement, deux, bien sur ce n’est pas exhaustif.
Organisation par application
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
C’est l’approche la plus simple, aucun travail organisationnel préalable est nécessaire.
Si on organise le projet par application, le code javascript/css va se retrouvé mélangé dans
web/js.
Organisation par application
• Avantages
– Démarrage rapide
– L’application est organisée comme le site
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Organisation par application
• Inconvénients
– Plus l’application grossis, plus le niveau de
désorganisation augmente
– Couplage: effets de bord entre modules
– Modèle monobloc
– web/js deviens vite ingérable
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Difficile de visualiser le projet sous forme d’un ensemble de fonctionnalités, toutes les
sous fonctionnalités sont mélangées (dans app/.../modules, dans lib, lib/model, etc...)
Ce couplage deviens vite apparent côté javascript également.
Organisation par fonctionnalité
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Du coup, on peut penser à une autre organisation, par fonctionnalité avec un plugin = une
fonctionnalité.
Organistaion par fonctionnalité
• Avantages:
– Nombreuses fonctions simples plutôt qu’une grosse
fonction complexe
– Tests isolés
– Découplage, moins d’effets de bord
– Maintenance facile
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Beaucoups d’avantages côté serveur.
Mais ça ne résoud pas pour autant les problématiques d’inclusion JS.
A l’heure actuelle:
- liens symboliques à tout va
- signature symfony, et plus grave, signature des plugins utilisés
- faille potentielle
Organisation par fonctionnalité
• Inconvénients
– Pas organisé comme le site
– Moins évident pour un intégrateur
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
L’intégrateur a besoin de notions symfony pour travailler efficacement sur un projet.
Etat des lieux
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Qu’a t on aujourd’hui?
JavaScript - Etat des lieux
• Dans une application…
– Moins de requêtes? Moins de fichiers…
– Plus léger? Obfuscation de code…
‣
Mauvaise pratique
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Si on décide d’inclure un comportement dynamique client dans une application....
En fait aujourd’hui on approche ça comme ca:
* slide *
On prends des solutions simples qui n’en sont pas.
JavaScript - Etat des lieux
• Dans les plugins symfony…
– Dépendances communes…
•
•
•
•
Ingérables ou difficiles
Duplication de code
Problème de versions concurrentes
Eviter les double inclusions
‣
Mauvaise pratique
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript - Etat des lieux
Le problème est pris à l’envers.
On a besoin de performances, ce qui est
souvent fait au détriment du bon sens.
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
On ne veux pas sacrifier la qualité du code pour les performances.
Une solution…
sfDynamicsPlugin
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Rôle et contraintes
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Quels étaient les prérequis pour dynamics?
Le plugin - Rôle
• Eviter les redondances
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: ORGANISATION )))
Le plugin - Rôle
• Eviter les redondances
• Gestion des dépendances et conflits
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: ORGANISATION )))
Le plugin - Rôle
• Eviter les redondances
• Gestion des dépendances et conflits
• Ajout de fonctions dynamiques client par plugin
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: ORGANISATION )))
Le plugin - Rôle
• Eviter les redondances
• Gestion des dépendances et conflits
• Ajout de fonctions dynamiques client par plugin
‣
Organisation
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Rôle principal: ORGANISER les développements de comportements
dynamiques client.
Le plugin - Contraintes
• Nombre de requêtes
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: PERFORMANCES )))
Le plugin - Contraintes
• Nombre de requêtes
• Taille des fichiers finaux
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: PERFORMANCES )))
Le plugin - Contraintes
• Nombre de requêtes
• Taille des fichiers finaux
• Lisibilité du code «dev»
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
((( *hint conclusion* Contrainte majeure: PERFORMANCES )))
Le plugin - Contraintes
• Nombre de requêtes
• Taille des fichiers finaux
• Lisibilité du code «dev»
‣
Performances
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Contrainte majeure: PERFORMANCES
Configuration
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
A partir d’ici, on regarde chacun des composants principaux de dynamics
1 par 1.
sfDynamicsPlugin
• Gestionnaire de dépendances JavaScript
– Système de configuration XML flexible
– Surcharge «destructive»
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Flexible: chaque morceau de projet a son mot a dire.
Surcharge: Le projet est maître, sauf si l’application veux prendre le dessus
Par défaut, sfDynamics a la main. Le projet peux surcharger, les applications peuvent
surcharger.
Configuration
• Par défaut, on ne charge rien
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Ce n’est pas le rôle du plugin que de présupposer quoique ce soit sur un
projet.
Configuration
• La configuration des principaux framework
JavaScript est fournie.
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
PrototypeJS
Mais propose des ensembles de librairies, qu’on peut inclure facilement.
Configuration
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
jQuery
(tronqué)
Configuration
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
ExtJS
(tronqué, le fichier fait environ 600 lignes)
Mais encore: scriptaculous, et peut etre un jour yahooUI
Configuration
• Script spécifique à un plugin?
– dynamics-plugin.xml
– dynamics-*.xml
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
But du plugin: permettre l’extensibilité.
Configuration
• Pourquoi XML?
– validation
– lisibilité
– facile à étendre
– facile à tester
– universel
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
validation: schema
lisibilité: n’importe qui peut lire et comprendre la structure d’un xml
extensibilité: un tag = une classe
test: Possible de tester unitairement chacune des classes parser de la
config
Utilisation
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Configuration, en action
Utilisation
• On définit un package
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Pour s’en servir...
Utilisation
• On charge ce package
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
il suffit de charger les paquets nécessaires.
sfDynamics gère les dépendances, et inclus dans l’ordre chacun des
paquets requis.
Utilisation
• Si on est méfiant, on vérifie...
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Ce qu’on peut voir ici.
Utilisation
• Reste à tester...
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Autre exemple
• Arianespace, outil de planification
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Préprocesseur
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfDynamicsPlugin
• Préprocesseur Javascript
– Packer
– Minifier
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
chaque préprocesseur est activable/désactivable en configuration
sfDynamicsPlugin
• Préprocesseur CSS
– Résolution des chemins des images
– Résolution des @import
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
chaque préprocesseur est activable/désactivable en configuration
Cache
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfDynamicsPlugin
• Ces fonctionnalités ont un coût
– 3 niveaux de cache
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bien sur le préprocesseur (entre autres) est coûteux. C’est pourquoi le cache rentre en jeu.
sfDynamicsPlugin
• Cache de la configuration
– sérialisation
– __set_state()
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
A l’instar des fichiers de configuration de symfony, toute la configuration XML est cachée
après être parsée, en prenant en compte l’héritage.
sfDynamicsPlugin
• Cache du code sortant du préprocesseur
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
à l’instar du cache des partial, on cache les parties précalculées.
sfDynamicsPlugin
• SuperCache
– On place le rendu des fichiers dans web/dynamics
– On génère une fois, le serveur web se charge du reste
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Le plugin a sa propre implémentation, inspirée su sfSuperCachePlugin. On écrit des fichiers
statiques sous l’arborescence web publique accessible.
Debug
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Bien sur grouper des assets (entre autres) peut être génant pour debugger ces derniers.
sfDynamicsPlugin
• Web debug (à partir de symfony 1.2)
– Visualiser les dépendances
– Visualiser les fichiers groupés
– Résolution rapide des problèmes
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Une barre de debug est disponible pour visualiser les différents groupes, et pour ouvrir
directement les fichiers correspondants.
sfDynamicsPlugin
• Exceptions explicites
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfDynamicsPlugin
• Ajout de commentaires (en mode debug)
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Documentation
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfDynamicsPlugin
• Documentation complète
– http://dynamics.dakrazy.net/
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Markdown, site, exemples... LAST TODO
Et après...
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Et après?
• Support des «scope d’inclusion»
– Inclusion conditionelle
– Medias
– Head vs body
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
merci pascal :)
Et après?
• Gestion des thèmes et de l’I18n nativement
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Et après?
• Support des «Content Delivery Network» (CDN)
– FTP, rsync, scp, S3, ...
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Et après?
• <insérez votre idée géniale ici>
• <insérez votre ticket génial ici>
• <insérez votre patch génial ici>
http://dynamics.dakrazy.net/
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
idée: mail, irc
ticket: lighthouseapp
patch: lighthouse, git, github
Enrichir l’expérience utilisateur
sfUnobstrusiveWidgetPlugin
Titre présentation | Conférencier
page internet riche mais dégradable
François Béliveau
Bonnes pratiques JavaScript
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
complément de la présentation de Romain sur un axe plus fonctionnel
qu’organisationnel
Bonnes pratiques JavaScript
• bien placer son code
• éviter les effets de bord
• dégradation élégante (unobstrusive)
• accessibilité
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
bonnes pratiques JavaScript
• bien placer son code
– head
• inclusion de fichiers
• définition de fonctions
– body
• appel de fonction
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
dans le body pour des questions de performance
bonnes pratiques JavaScript
• éviter les effets de bord
– contrôler la portée des
variables
– éviter les variables globales
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
«var» crée une variable dans la fonction dans laquelle il se trouve, sinon,
globale
bonnes pratiques JavaScript
• éviter les effets de bord
– utiliser un gestionnaire d'événements (mauvaise méthode)
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
gestionnaire d’événement : window.onload ...
bonnes pratiques JavaScript
• éviter les effets de bord
– utiliser un gestionnaire d'événements (bonne méthode)
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
gestionnaire d’événement : window.onload ...
bonnes pratiques JavaScript
• Dégradation élégante (unobstrusive)
– vérifier qu'un objet est disponible avant de le manipuler
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
le JavaScript n'est pas une fonctionnalité fiable à 100%
bonnes pratiques JavaScript
• Dégradation élégante (unobstrusive)
– séparer la structure du comportement
» pas de style inline
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
le JavaScript permet d'améliorer l'expérience de l'utilisateur, ce n'est cependant pas une
fonctionnalité fiable à 100%
écrivez du JavaScript, et non un dialecte particulier à un navigateur
bonnes pratiques JavaScript
• Accessibilité
– ne soyez pas dépendant de la souris
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
focus ne fonctionne qu’avec les inputs et les liens ...
JavaScript & symfony
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony
Etat des lieux
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
3 façon de faire du JS en symfony
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à la main
– directement dans un template
– fichier externe
• view.yml
• dans une action
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à la main
– multiplication des sources possibles
» maintenance plus difficile sur de gros projets
– plus de code à écrire
» augmente les risques d’erreurs
‣
Mauvaise pratique
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à l’aide de helper
– avec la compatibilité symfony 1.0 activée
• résultat
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à l’aide de helper
✓ regroupement de fonctionnalités
✓ moins de code à écrire
– JavaScript intégré directement dans le (x)html
– peu de souplesse quant à l’utilisation de différent framework
– pratique obsolète
‣
Mauvaise pratique
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à l’aide d’un widget
– méthodes getJavascripts
• résultat
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
existe aussi pour les CSS
JavaScript & symfony : état des lieux
• Intégrer son JavaScript à l’aide d’un widget
✓ regroupement de fonctionnalités
✓ moins de code à écrire
✓ développement objet
– helper pour charger le JavaScript
– structure et comportement mélangés
– peu de souplesse quant à l’utilisation de différent framework
‣Incomplet
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony
Qu’est ce qui manque ?
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JavaScript & symfony : ce qui manque
• Chargement automatique des fichiers JavaScript
» de même que les CSS
• Indépendance quant aux solutions javascript choisies
» framework JavaScript
» librairie «maison»
• Structure html hermétique à tout type de JavaScript
• Réflexion sur l’accessibilité
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Une solution ...
sfUnobstrusiveWidget plugin
➡ http://www.symfony-project.org/plugins/sfUnobstrusiveWidgetPlugin
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
approche widget
- form
- mais pas que ...
sfUnobstrusiveWidget
le découplage
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
structure
présentation
comportement
sfUnobstrusiveWidget, le découplage
• commencer avec un contenu brut
• lui donner une structure sémantique
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, le découplage
• lui appliquer une couche graphique
• ajouter des fichiers dans la réponse
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
ajout des fichiers automatiques
sfUnobstrusiveWidget, le découplage
• créer des comportements dynamiques
» transformation du DOM
• ajouter des fichiers dans la réponse
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
ajout des fichiers automatiques
sfUnobstrusiveWidget, le découplage
Découplage ...
» structure
» présentation
» comportement
... pour obtenir un seul rendu (x)html et une multitude de
transformations possibles
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, le découplage
une structure ..
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUoWidgetFormSelectMany > double liste
PURE HTML
sfUnobstrusiveWidget, le découplage
... des transformations
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUoWidgetFormSelectMany > double liste
TRANSFORMATION DU DOM 100% JS
sfUnobstrusiveWidget, le découplage
... des transformations
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUoWidgetFormSelectMany > asm (alternative select many)
TRANSFORMATION DU DOM 100% JS
sfUnobstrusiveWidget, le découplage
... des transformations
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUoWidgetFormSelectMany > drop down check list
TRANSFORMATION DU DOM 100% JS
sfUnobstrusiveWidget
Options JavaScript des widgets
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
une structure, des transformaion -> possible grâce à des options
primordiale
sfUnobstrusiveWidget, options
• js_adapter
» le framework ou la librairie JavaScript utilisé
• js_transformer
» le comportement à appliquer sur un rendu HTML
• js_selector
» le sélecteur utilisé pour cibler le HTML avec les CSS et les JS
• js_config
» configuration JSON passée au constructeur JavaScript
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
la classe d’un widget est selector.’_’.transformer
js_config, exemple :
url à utiliser pour un script ajax
sfUnobstrusiveWidget
Configuration
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
tout est dans un fichier yaml
«sfUoWidget.yml»
sfUnobstrusiveWidget, configuration
• pourquoi un fichier spécifique ?
– centraliser la définition des fichiers javaScript et CSS
» faciliter la maintenance
» faciliter l’intégration dans un projet (extensible)
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, configuration
• le choix du YAML
– natif en symfony
– habitude
– permettre la modification (merge des fichiers)
» pour le projet
» pour une application
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, configuration
• composition du fichier
– valeur par défaut
– adapters
» définition de tous les adapters disponibles
– thèmes
» définition de tous les thèmes disponibles
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
default_adapter: adapter par défaut utilisé dans les widgets
lazy_mode: ajouté automatiquement l’initialisation des scripts dans le html
(valeur par défaut)
sfUnobstrusiveWidget, configuration
• définition des adapters
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
un thème par défaut
plusieurs templates possible
plusieurs packages
sfUnobstrusiveWidget, configuration
• définition des thèmes
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget
JavaScript
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, JavaScript
• chaque JavaScript intégré au plugin propose ...
✓ une dégradation élégante (unobstrusive)
✓ un modèle objet
✓ une utilisation clavier ou souris
✓ les bonnes pratiques de base
» commentaires, découplage, DRY ...
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
la classe d’un widget est selector.’_’.transformer
évidemment, les JS sont développer en respectant (le plus souvent) les bonnes pratiques énuméré tout à l’heure
sfUnobstrusiveWidget
En action
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget en action
Créer un menu
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget en action
• contenu d’un menu type backend
– libellé
– route ou url
– multi-niveau
– droits
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUoWidgetAdminMenu -> yaml
sfUoWidgetMenu -> normal
sfUnobstrusiveWidget en action
• menu sans javascript
» dans l’action
» rendu
» dans le template
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
‘main’ dans le render correspond à «main» dans le YAML
sfUnobstrusiveWidget en action
• menu treeview
» dans l’action
» rendu
» dans le template
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
‘main’ dans le render correspond à «main» dans le YAML
sfUnobstrusiveWidget en action
• menu liste déroulante
» dans l’action
» dans le template
» rendu
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
‘main’ dans le render correspond à «main» dans le YAML
sfUnobstrusiveWidget en action
Créer un sélecteur de date
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget en action
• sans javascript
» dans le formulaire
» dans le template
» rendu
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget en action
• date picker
» dans le formulaire
» dans le template
» rendu
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget en action
• plage de date avec date picker
» dans le formulaire
» dans le template
» rendu
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
JS prend en charge la date min et max de manière auto
sfUnobstrusiveWidget
Et dans l’avenir ?
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, et dans l’avenir ?
• améliorer
– la compatibilité avec les styles de jquery UI
– l’accessibilité
• utilisation du clavier
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfUnobstrusiveWidget, et dans l’avenir ?
• ajouter des widgets
– éditeur de template (textarea)
– ajout à la volée de sous formulaires
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
sfDynamics & sfUnobstrusiveWidget
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
solution complémentaire
sfUnobstrusiveWidget & sfDynamics
• détection automatique de la présence de sfDynamics
• tous les packages sont prêts à l’emploi
• même résultat avec sfDynamics ou sans
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Questions?
François Béliveau - Sensio Labs
[email protected]
Romain Dorgueil - Sensio Labs
[email protected] - twitter: hartym
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Engagez vous!
Bonnes pratiques de développement JavaScript dans symfony
François Béliveau & Romain Dorgueil
Open Source, pourquoi?
faire profiter et profiter des expériences de chacuns