rnb-js : changements structurels

La librairie javascript rnb-js a subit quelques modifications importantes ces dernières semaines, notamment dans le support des anciens navigateurs...

Jusqu'à présent, la librairie définissait des objets dédiés implémentants de nouvelles méthodes ou fournissant l'accés à celles qui ne sont pas présentes dans tous les navigateurs ; il y a rnb.obj pour les méthodes objets, rnb.str pour les méthodes de manipulation de chaîne de caractères, etc. Ainsi pour exécuter une fonction dans un contexte particulier, je n'utilisais pas la méthode bind présente dans le prototype des objets Function mais plutôt rnb.fn.bind, car cette API, apparue avec l'EcmaScript 5, n'est pas implémentée dans tous les navigateurs.

Cependant, pour rendre les développements moins dépendants de la librairie, pour permettre une portabilité plus aisée dans d'autres contextes d'exécution (avec d'autres librairies javascript par exemple), j'ai souhaité réduire l'utilisation des objets dédiés décrits ci-dessus. Cela passe nécessairement par la modification du prototype des objets javascript natifs comme String, Array ou Function uniquement si les méthodes ne sont pas présentes. Ce travail est dorénavant effectué par un module spécifique, les objets étant toujours utilisés pour tous les traitements qui ne sont pas (encore) présents dans les spécifications.

C'est un choix loin d'être évident vu qu'il « casse » une partie de l'API de la librairie, ce qu'un projet comme underscore a refusé de faire. Mais une bonne partie de rnb-js a toujours été plus une nécessité (pour la correction de bugs de certains navigateurs) qu'un projet en tant que tel ; un développement subit en quelque sorte. Non pas inutile puisque, depuis 2004, cela m'a permi de découvrir toutes les subtilités du javascript ; subtilités que je dois encore souvent mettre en pratique au boulot pour supporter des navigateurs comme IE 6/7. Mais j'ai aujourd'hui envie de consacrer plus de temps à la partie composants et expérimentations de la librairie.

Enfin, un dernier point sur une évolution entamée depuis quelques mois : l'adoption de la notation AMD. Jusqu'à présent, je définissais des méthodes propres à la librairie, rnb.define et rnb.require, respectivement pour définir un module et pour charger des dépendances. Dorénavant, le gestionnaire de module de la librairie définit des méthodes globales define et require, et uniquement si elles ne sont pas déjà présentes ; je peux donc indiféremment utiliser la solution interne ou un gestionnaire extérieur de modules (tester uniquement avec RequireJS pour le moment).