Comme les frameworks JavaScript comme jQuery rendent les applications Web côté client plus riches et plus fonctionnelles, j'ai commencé à remarquer un problème ...
Comment diable gardez-vous cela organisé?
- Mettez tous vos gestionnaires au même endroit et écrivez des fonctions pour tous les événements?
- Créer des fonctions / classes pour envelopper toutes vos fonctionnalités?
- Écrivez comme un fou et espérez juste que ça marche pour le mieux?
- Abandonner et entreprendre une nouvelle carrière?
Je mentionne jQuery, mais c'est vraiment n'importe quel code JavaScript en général. Je constate que lorsque les lignes sur les lignes commencent à s'accumuler, il devient plus difficile de gérer les fichiers de script ou de trouver ce que vous recherchez. Il est possible que le plus gros problème que j'ai trouvé est qu'il existe de nombreuses façons de faire la même chose, il est difficile de savoir laquelle est la meilleure pratique actuellement acceptée.
Existe-t-il des recommandations générales sur la meilleure façon de conserver vos fichiers .js aussi agréables et soignés que le reste de votre application? Ou est-ce juste une question d'IDE? Y a-t-il une meilleure option là-bas?
ÉDITER
Cette question visait davantage l'organisation du code et non l'organisation des fichiers. Il y a eu de très bons exemples de fusion de fichiers ou de partage de contenu.
Ma question est: quelle est la meilleure méthode actuellement acceptée pour organiser votre code actuel? Quelle est votre façon, ou même une manière recommandée d'interagir avec les éléments de la page et de créer du code réutilisable qui n'entre pas en conflit les uns avec les autres?
Certaines personnes ont répertorié les espaces de noms, ce qui est une bonne idée. Quelles sont les autres façons de traiter plus spécifiquement les éléments de la page et de garder le code organisé et soigné?
Réponses:
Ce serait beaucoup plus agréable si javascript avait des espaces de noms intégrés, mais je trouve que l'organisation de choses comme Dustin Diaz décrit ici m'aide beaucoup.
J'ai mis différents "espaces de noms" et parfois des classes individuelles dans des fichiers séparés. Habituellement, je commence avec un fichier et comme une classe ou un espace de noms devient suffisamment grand pour le justifier, je le sépare dans son propre fichier. L'utilisation d'un outil pour combiner tous vos fichiers pour la production est également une excellente idée.
la source
module pattern
et il est basé sur leIIFE pattern
.createNewSomething()
dans l'objet de retour, afin que la création d'objet se fasse uniquement dans le module? Hm ... Je m'attendrais à ce que les classes (constructeurs) soient visibles de l'extérieur.J'essaie d'éviter d'inclure tout javascript avec le HTML. Tout le code est encapsulé dans des classes et chaque classe est dans son propre fichier. Pour le développement, j'ai des balises <script> distinctes pour inclure chaque fichier js, mais elles sont fusionnées dans un seul package plus grand pour la production afin de réduire la surcharge des requêtes HTTP.
En règle générale, j'ai un seul fichier js «principal» pour chaque application. Donc, si j'écrivais une application "survey", j'aurais un fichier js appelé "survey.js". Cela contiendrait le point d'entrée dans le code jQuery. Je crée des références jQuery lors de l'instanciation puis les passe dans mes objets en tant que paramètres. Cela signifie que les classes javascript sont «pures» et ne contiennent aucune référence aux identifiants CSS ou aux noms de classe.
Je trouve également que la convention de dénomination est importante pour la lisibilité. Par exemple: je ajoute «j» à toutes les instances de jQuery.
Dans l'exemple ci-dessus, il existe une classe appelée DimScreen. (Supposons que cela assombrit l'écran et affiche une boîte d'alerte.) Il a besoin d'un élément div qu'il peut agrandir pour couvrir l'écran, puis ajouter une boîte d'alerte, donc je passe un objet jQuery. jQuery a un concept de plug-in, mais il semblait limité (par exemple, les instances ne sont pas persistantes et ne sont pas accessibles) sans réel avantage. Ainsi, la classe DimScreen serait une classe javascript standard qui se trouve simplement utiliser jQuery.
J'ai construit des applications assez complexes en utilisant cette approche.
la source
$
comme préfixe de nom de variable est une pratique plus courante, mais je peux me tromper. Donc,$s = $('...')
au lieu dejS = $('...')
, juste une question de préférence, je suppose. Intéressant cependant, car la notation hongroise est considérée comme une odeur de code. C'est bizarre à quel point certaines de mes conventions / préférences de code JavaScript sont différentes de mes conventions de codage C # / Java.Systems Hungarian
une odeur de code etApps Hungarian
à une pratique à partir de maintenant :)var
, maintenant que j'y pense. La plupart des arguments contre l'utilisationvar
sont ceux où vous ne serez pas sûr du «type» de ce qui est retourné, mais je suppose que l'argument devrait plutôt être contre ne pas connaître la «classe» de ce qui est retourné. Si vous utilisez des applications hongroises, vous ne devriez pas avoir ce souci alors ... intéressant.Vous pouvez diviser vos scripts en fichiers séparés pour le développement, puis créer une version "release" où vous les regroupez tous et exécutez YUI Compressor ou quelque chose de similaire.
la source
Inspiré par les articles précédents, j'ai fait une copie de Rakefile et des répertoires des fournisseurs distribués avec WysiHat (un RTE mentionné par le changelog) et j'ai apporté quelques modifications pour inclure la vérification de code avec JSLint et la minification avec YUI Compressor .
L'idée est d'utiliser Sprockets (de WysiHat) pour fusionner plusieurs JavaScripts en un seul fichier, vérifier la syntaxe du fichier fusionné avec JSLint et le minimiser avec YUI Compressor avant la distribution.
Conditions préalables
Maintenant
Créez maintenant un fichier nommé "Rakefile" dans le répertoire racine du projet JavaScript et ajoutez-y le contenu suivant:
Si vous avez tout fait correctement, vous devriez pouvoir utiliser les commandes suivantes dans votre console:
rake merge
- pour fusionner différents fichiers JavaScript en un seulrake check
- pour vérifier la syntaxe de votre code (c'est la tâche par défaut , vous pouvez donc simplement taperrake
)rake minify
- pour préparer une version minifiée de votre code JSFusion à la source
À l'aide de Sprockets, le pré-processeur JavaScript, vous pouvez inclure (ou
require
) d'autres fichiers JavaScript. Utilisez la syntaxe suivante pour inclure d'autres scripts du fichier initial (nommé "main.js", mais vous pouvez changer cela dans le Rakefile):Et alors...
Jetez un œil à Rakefile fourni avec WysiHat pour configurer les tests unitaires automatisés. Jolies choses :)
Et maintenant pour la réponse
Cela ne répond pas très bien à la question d'origine. Je le sais et je suis désolé, mais je l'ai posté ici parce que j'espère que cela pourrait être utile à quelqu'un d'autre pour organiser son désordre.
Mon approche du problème consiste à faire autant de modélisation orientée objet que possible et à séparer les implémentations dans différents fichiers. Ensuite, les gestionnaires doivent être aussi courts que possible. L'exemple avec
List
singleton est également sympa.Et les espaces de noms ... eh bien ils peuvent être imités par une structure d'objet plus profonde.
Je ne suis pas un grand fan d'imitations, mais cela peut être utile si vous avez de nombreux objets que vous souhaitez déplacer hors de la portée mondiale.
la source
L'organisation du code nécessite l'adoption de conventions et de normes de documentation:
1. Code d'espace de noms pour un fichier physique;
2. Grouper les classes dans ces espaces de noms javascript;
3. Définir des prototypes ou des fonctions ou classes connexes pour représenter des objets du monde réel;
4. Définissez des conventions pour améliorer le code. Par exemple, regroupez toutes ses fonctions ou méthodes internes dans son attribut de classe d'un type d'objet.
5. Faites la documentation des espaces de noms, des classes, des méthodes et des variables. Le cas échéant, discutez également d'une partie du code (certains FI et Fors, ils implémentent généralement une logique importante du code).
Ce ne sont que quelques conseils, mais cela a grandement aidé à organiser le code. N'oubliez pas que vous devez avoir de la discipline pour réussir!
la source
Suivre de bons principes et modèles de conception OO contribue grandement à rendre votre code facile à maintenir et à comprendre. Mais l'une des meilleures choses que j'ai découvertes récemment sont les signaux et les machines à sous, c'est-à-dire publier / s'abonner. Jetez un œil à http://markdotmeyer.blogspot.com/2008/09/jquery-publish-subscribe.html pour une implémentation jQuery simple.
L'idée est bien utilisée dans d'autres langues pour le développement de GUI. Lorsque quelque chose d'important se produit quelque part dans votre code, vous publiez un événement synthétique global auquel d'autres méthodes dans d'autres objets peuvent souscrire. Cela donne une excellente séparation des objets.
Je pense que Dojo (et Prototype?) Ont une version intégrée de cette technique.
voir aussi Que sont les signaux et les slots?
la source
J'ai pu appliquer avec succès le modèle de module Javascript à une application Ext JS lors de mon travail précédent. Il a fourni un moyen simple de créer du code bien encapsulé.
la source
Dojo avait le système de modules depuis le premier jour. En fait, il est considéré comme une pierre angulaire du Dojo, la colle qui tient tout cela ensemble:
L'utilisation des modules Dojo atteint les objectifs suivants:
dojo.declare()
) - ne polluent pas l'espace global, ne coexistent pas avec d'autres bibliothèques et le code non compatible Dojo de l'utilisateur.dojo.require()
).la source
Découvrez JavasciptMVC .
Vous pouvez :
divisez votre code en couches de modèle, de vue et de contrôleur.
compresser tout le code dans un seul fichier de production
code auto-généré
créer et exécuter des tests unitaires
et beaucoup plus...
Mieux encore, il utilise jQuery, vous pouvez donc également profiter d'autres plugins jQuery.
la source
Mon patron parle toujours de l'époque où ils ont écrit du code modulaire (langage C), et se plaint de la merde du code de nos jours! On dit que les programmeurs peuvent écrire des assemblys dans n'importe quel framework. Il existe toujours une stratégie pour surmonter l'organisation du code. Le problème de base est avec les gars qui traitent le script java comme un jouet et n'essaient jamais de l'apprendre.
Dans mon cas, j'écris des fichiers js sur un thème d'interface utilisateur ou sur un écran d'application, avec un init_screen () approprié. En utilisant la convention de dénomination id appropriée, je m'assure qu'il n'y a pas de conflits d'espace de nom au niveau de l'élément racine. Dans le window.load () discret, j'attache les choses en fonction de l'ID de niveau supérieur.
J'utilise strictement les fermetures et les modèles de scripts Java pour masquer toutes les méthodes privées. Après cela, je n'ai jamais été confronté à un problème de propriétés / définitions de fonction / définitions de variables conflictuelles. Cependant, lorsque vous travaillez avec une équipe, il est souvent difficile d'appliquer la même rigueur.
la source
Je suis surpris que personne n'ait mentionné les frameworks MVC. J'ai utilisé Backbone.js pour modulariser et découpler mon code, et cela a été inestimable.
Il existe un certain nombre de ces types de cadres, et la plupart d'entre eux sont également minuscules. Mon opinion personnelle est que si vous allez écrire plus que quelques lignes de jQuery pour des choses d'interface utilisateur flashy, ou si vous voulez une application Ajax riche, un framework MVC vous facilitera la vie.
la source
"Ecrire comme un fou et espérer que ça marche pour le mieux?", J'ai vu un projet comme celui-ci qui a été développé et maintenu par seulement 2 développeurs, une énorme application avec beaucoup de code javascript. En plus de cela, il y avait différents raccourcis pour chaque fonction jquery possible à laquelle vous pouvez penser. J'ai suggéré qu'ils organisent le code en plugins, car c'est l'équivalent jquery de la classe, du module, de l'espace de noms ... et de l'univers entier. Mais les choses ont empiré, maintenant ils ont commencé à écrire des plugins remplaçant chaque combinaison de 3 lignes de code utilisées dans le projet. Personnellement, je pense que jQuery est le diable et qu'il ne devrait pas être utilisé sur des projets avec beaucoup de javascript car il vous encourage à être paresseux et à ne pas penser à organiser le code en aucune façon. Je préfère lire 100 lignes de javascript plutôt qu'une ligne avec 40 fonctions jQuery chaînées (je ' je ne plaisante pas). Contrairement à la croyance populaire, il est très facile d'organiser le code javascript en équivalents aux espaces de noms et aux classes. C'est ce que font YUI et Dojo. Vous pouvez facilement rouler le vôtre si vous le souhaitez. Je trouve l'approche de YUI bien meilleure et efficace. Mais vous avez généralement besoin d'un bel éditeur avec prise en charge des extraits pour compenser les conventions de dénomination YUI si vous souhaitez écrire quelque chose d'utile.
la source
Je crée des singletons pour tout ce que je n'ai vraiment pas besoin d'instancier plusieurs fois à l'écran, des cours pour tout le reste. Et tous sont placés dans le même espace de noms dans le même fichier. Tout est commenté et conçu avec des diagrammes d'état UML. Le code javascript est clair de html donc pas de javascript en ligne et j'ai tendance à utiliser jquery pour minimiser les problèmes entre navigateurs.
la source
Dans mon dernier projet -Viajeros.com-, j'ai utilisé une combinaison de plusieurs techniques. Je ne saurais pas comment organiser une application Web - Viajeros est un site de réseautage social pour les voyageurs avec des sections bien définies, il est donc assez facile de séparer le code pour chaque zone.
J'utilise la simulation d'espace de noms et le chargement paresseux des modules selon la section du site. Sur chaque chargement de page, je déclare un objet "vjr" et lui charge toujours un ensemble de fonctions communes (vjr.base.js). Ensuite, chaque page HTML décide quels modules ont besoin avec un simple:
Vjr.base.js obtient chacun gzippé du serveur et les exécute.
Chaque "module" a cette structure:
Compte tenu de ma connaissance limitée de Javascript, je sais qu'il doit y avoir de meilleures façons de gérer cela, mais jusqu'à présent, cela fonctionne très bien pour nous.
la source
L'organisation de votre code d'une manière NameSpace centrée sur Jquery peut ressembler à ceci ... et ne sera pas en conflit avec d'autres API Javascript comme Prototype, Ext non plus.
J'espère que cela t'aides.
la source
jQuery.fn
est un pointeur versjQuery.prototype
, car$()
renvoie en fait une nouvelle instance de la fonction constructeur jQuery. Ajouter un «plugin» à jQuery signifie simplement étendre son prototype. Mais ce que vous faites n'est pas cela, et il existe des moyens plus propres d'accomplir la même chose.Un bon principe de OO + MVC contribuerait certainement à la gestion d'une application javascript complexe.
Fondamentalement, j'organise mon application et javascript selon la conception familière suivante (qui existe depuis mes jours de programmation de bureau jusqu'au Web 2.0)
Description des valeurs numériques sur l'image:
Dans le passé, je séparais les fichiers en ses propres js et j'utilisais une pratique courante pour créer des principes OO en Javascript. Le problème que j'ai vite constaté, c'est qu'il y a plusieurs façons d'écrire JS OO et ce n'est pas forcément que tous les membres de l'équipe ont la même approche. Au fur et à mesure que l'équipe s'est agrandie (dans mon cas, plus de 15 personnes), cela se complique car il n'y a pas d'approche standard pour Javascript orienté objet. En même temps, je ne veux pas écrire mon propre cadre et répéter une partie du travail que je suis sûr que les gens sont plus intelligents que j'ai résolu.
jQuery est incroyablement agréable en tant que framework Javascript et je l'adore, mais à mesure que le projet s'agrandit, j'ai clairement besoin d'une structure supplémentaire pour mon application Web, en particulier pour faciliter la normalisation de la pratique OO. Pour moi, après plusieurs expériences, je trouve que l'infrastructure YUI3 Base and Widget ( http://yuilibrary.com/yui/docs/widget/ et http://yuilibrary.com/yui/docs/base/index.html ) fournit exactement ce dont j'ai besoin. Peu de raisons pour lesquelles je les utilise.
Contrairement à de nombreuses vues, je n'ai pas forcément à choisir entre jQuery et YUI3. Ces deux peuvent coexister pacifiquement. Alors que YUI3 fournit le modèle OO nécessaire pour mon application Web complexe, jQuery fournit toujours à mon équipe une abstraction JS facile à utiliser que nous aimons tous et que nous connaissons tous.
À l'aide de YUI3, j'ai réussi à créer un modèle MVC en séparant les classes qui étendent la base en tant que modèle, les classes qui étendent le widget en tant que vue et, bien sûr, vous avez des classes Controller qui effectuent les appels logiques et côté serveur nécessaires.
Le widget peut communiquer entre eux en utilisant un modèle basé sur les événements et en écoutant l'événement et en effectuant la tâche nécessaire en fonction d'une interface prédéfinie. En termes simples, mettre la structure OO + MVC sur JS est une joie pour moi.
Juste un avertissement, je ne travaille pas pour Yahoo! et simplement un architecte qui essaie de faire face au même problème que celui posé par la question d'origine. Je pense que si quelqu'un trouve un cadre OO équivalent, cela fonctionnerait aussi. Principalement, cette question s'applique également à d'autres technologies. Merci à Dieu pour toutes les personnes qui ont conçu OO Principles + MVC pour rendre nos journées de programmation plus faciles à gérer.
la source
J'utilise la gestion des packages (
dojo.require
etdojo.provide
) et le système de classes de Dojo (dojo.declare
qui permet également un héritage multiple simple) pour modulariser toutes mes classes / widgets dans des fichiers séparés. Non seulement cela permet de garder votre code organisé, mais cela vous permet également de charger paresseusement / juste à temps des classes / widgets.la source
Il y a quelques jours, les gars de 37Signals ont sorti un contrôle RTE , avec une torsion. Ils ont créé une bibliothèque qui regroupe les fichiers javascript à l'aide d'une sorte de commandes de pré-processeur.
Je l'utilise depuis pour séparer mes fichiers JS et finalement les fusionner en un seul. De cette façon, je peux séparer les préoccupations et, à la fin, avoir un seul fichier qui passe par le canal (gzippé, pas moins).
Dans vos modèles, vérifiez si vous êtes en mode développement, et incluez les fichiers séparés, et si en production, incluez le dernier (que vous devrez "construire" vous-même).
la source
Créez de fausses classes et assurez-vous que tout ce qui peut être jeté dans une fonction distincte qui a du sens est fait. Assurez-vous également de commenter beaucoup, et de ne pas écrire de code spagghetti, plutôt de tout garder dans les sections. Par exemple, un code absurde décrivant mes idéaux. Évidemment, dans la vie réelle, j'écris également de nombreuses bibliothèques qui englobent essentiellement leurs fonctionnalités.
la source
Utilisez des modèles d'héritage pour organiser de grandes applications jQuery.
la source
Je pense que cela est lié, peut-être, au DDD (Domain-Driven Design). L'application sur laquelle je travaille, bien qu'elle ne dispose pas d'une API formelle, donne des indices à ce sujet par le biais du code côté serveur (noms de classe / fichier, etc.). Armé de cela, j'ai créé un objet de niveau supérieur en tant que conteneur pour l'ensemble du domaine problématique; puis, j'ai ajouté des espaces de noms là où c'était nécessaire:
la source
Pour l'organisation JavaScript, utilisez les éléments suivants
la source
J'utilise cette petite chose. Il vous donne la directive «include» pour les modèles JS et HTML. Il élimine complètement le gâchis.
https://github.com/gaperton/include.js/
la source
Vous pouvez utiliser jquery mx (utilisé dans javascriptMVC) qui est un ensemble de scripts qui vous permet d'utiliser des modèles, des vues et des contrôleurs. Je l'ai utilisé dans un projet et m'a aidé à créer du javascript structuré, avec des tailles de script minimales en raison de la compression. Ceci est un exemple de contrôleur:
Vous pouvez également utiliser uniquement le côté contrôleur de jquerymx si vous n'êtes pas intéressé par les parties vue et modèle.
la source
Votre question est celle qui m'a tourmenté à la fin de l'année dernière. La différence - remettre le code à de nouveaux développeurs qui n'avaient jamais entendu parler des méthodes privées et publiques. J'ai dû construire quelque chose de simple.
Le résultat final a été un petit framework (environ 1 Ko) qui traduit les littéraux d'objet en jQuery. La syntaxe est visuellement plus facile à analyser, et si votre js grandit vraiment, vous pouvez écrire des requêtes réutilisables pour trouver des choses comme les sélecteurs utilisés, les fichiers chargés, les fonctions dépendantes, etc.
Poster un petit framework ici n'est pas pratique, j'ai donc écrit un blog avec des exemples (Mon premier. C'était une aventure!). Vous êtes invités à jeter un œil.
Pour tous les autres ici avec quelques minutes pour le vérifier, j'apprécierais grandement les commentaires!
FireFox est recommandé car il prend en charge toSource () pour l'exemple de requête d'objet.
À votre santé!
Adam
la source
J'utilise un script personnalisé inspiré du comportement de Ben Nolan (je ne trouve malheureusement plus de lien actuel vers cela) pour stocker la plupart de mes gestionnaires d'événements. Ces gestionnaires d'événements sont déclenchés par les éléments className ou Id, par exemple. Exemple:
J'aime inclure la plupart de mes bibliothèques Javascript à la volée, sauf celles qui contiennent un comportement global. J'utilise pour cela l' aide de l'espace réservé headScript () de Zend Framework , mais vous pouvez également utiliser javascript pour charger d'autres scripts à la volée avec Ajile par exemple.
la source
Vous ne mentionnez pas votre langue côté serveur. Ou, plus pertinemment, quel framework vous utilisez - le cas échéant - côté serveur.
IME, j'organise les choses côté serveur et je laisse tout bouger sur la page Web. Le framework est chargé d'organiser non seulement JS que chaque page doit charger, mais aussi des fragments JS qui fonctionnent avec le balisage généré. De tels fragments que vous ne voulez généralement pas émettre plus d'une fois - c'est pourquoi ils sont extraits dans le cadre de ce code pour résoudre ce problème. :-)
Pour les pages de fin qui doivent émettre leur propre JS, je trouve généralement qu'il existe une structure logique dans le balisage généré. De tels JS localisés peuvent souvent être assemblés au début et / ou à la fin d'une telle structure.
Notez que rien de tout cela ne vous dispense d'écrire du JavaScript efficace! :-)
la source
Lazy Chargez le code dont vous avez besoin sur demande. Google fait quelque chose comme ça avec leur google.loader
la source