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