Node.js, express.js et autres découvertes

J’ai « commis » un mini-projet de test, afin de découvrir node.js et plus spécifiquement express (ou express.js), un mico-framework qui s’appuie sur node.js.

J’en ai profité pour jeter un coup d’oeil à mongoDB, et un ORM node.js de mongoDB qui s’appelle mongoose.

Voici le lien github.

J’aime

  • tout est évènement, rien n’est bloquant. Le language Javascript v8 est ultra-rapide, donc si on ajoute le fait que rien n’est bloquant, alors wooooww!!
  • Un seul language client-side et server-side, et des librairies qui parfois fonctionnent des 2 côtés (le même fichier!!!).

J’aime un peu moins

  • un léger bémol sur la documentation de express: la doc est là, mais j’ai du googler de nombreuses chose, ou pire, aller voir le source (non, je sais il n’y a rien de grave, au contraire…)
  • C’est une technologie (encore trop?) récente: les numéros de versions (de node.js, expess, …) évoluent rapidement, et les différents packages ne sont pas forcément compatible.
  • (lié au point précédent) Il y a des milliers de packages « qui font la même chose »: impossible de compter combien de « template engines » existent, ou de client mySQL (taper « nodejs mysql » dans google pour voir…)
  • Ça m’a fait réalisé que je ne maitrise pas toutes les subtilités du Javascript. Mais là, je ne peux blamer que moi-même.

J’aime pas

Rien, j’aime tout.

Pour conclure

J’adore! J’aime! … mais j’attends un peu encore pour l’utiliser en production. Quoique, pour utiliser les webSockets et Socket.io: trop fort!

Il est temps de se mettre sérieusement, très sérieusement au Javscript.

Très prometteur…

Update (2010-03-05)

mongodb

Attention, dans mon code, si le serveur mongodb (c’est à dire « mongob ») n’est pas démarré avant de démarrer le serveur node, aucune requête ne sera servie (loade à l’infini)… Vous êtes prévenus maintenant…

Lesscss

Pour ajouter le support de lesscss, il suffit d’ajouter la ligne suivante dans app.configure():

app.configure(function(){
    //...
    //activate less compiler
    app.use(express.compiler({ src: pub, enable: ['less'] }));
    //...
});

Ensuite, il vous suffit de mettre dans public/ vos fichiers less (exemple: main.less). Dans vos templates, il faut continuer à mettre des fichiers css (exemple: main.css), express (ou node) va les compiler automatiquement et créer une version statique css dans public/.

Par contre, il faut 2 requêtes avant que le fichier less soit compilé en css: la première retourne un 404, la 2ème est ok. Donc attention lors du développement.

Merci Symfony

Il était une fois…

IL était une fois une équipe qui réalisa un site web pour un client. Tout se passa normalement au cours du développement.
Mais un jour, alors que nous devions mettre sur le serveur du client, nous apprîmes (oui, oui! apprîmes) que:

  • le serveur du client était en fait 2 serveurs,
  • ces 2 serveurs étaient « load-balancés » (pas de » sticky-tcpip » possible)
  • la gestion des sessions PHP était « basique » (file)
  • nous n’avions pas la possibilité de changer la configuration des 2 serveurs (pour utiliser memcached par exemple) ou du « load-balancer »

(je vous passe les détails de mauvaises communications entre les équipes techniques en jeu…)

Horreur!

Qu’allons-nous devenir?

Que faisons-nous?

OMG!

Heureusement…

…tel le petit poucet qui avait pris soin de mettre des pierres dans ses poches, nous avions développé notre site avec le framework Symfony (1.4).

Il est possible de changer très facilement la manière dont sont sauvegardées les sessions PHP avec Symfony, grâce au fichier factories.yml.

Il n’a donc pas fallu plus que 30 minutes pour changer la manière de gérer les sessions!

Merci à…

Notes

  1. Oui, je sais, j’ai mis un « S » majuscule à « Symfony », c’est pour m’habituer.
  2. « … et à la fin, ils firent pleins de projets Symfony. »

Symfony 2.0 – Notes

Some thoughts about Symfony 2. I didn’t play with the sandbox yet, I just read the doc and browse the code (a little bit). So more to come…

routing « inheritence »

One main routing file that can include to other routing files

# hello/config/routing.yml
homepage:
  pattern:  /
  defaults: { _bundle: WebBundle, _controller: Default, _action: index }

hello:
  resource: HelloBundle/Resources/config/routing.yml

Components are actions, yeah!!

Everything is an action, and you can include an action into a template. That’s great, no need to define an action that just include a component (when you need some ajax but the first load is not ajax)

Generating Links

The generate() method takes the route name and an array of values as arguments.

Mmm, I hope there is another way to generate a route, using the controller name and action name (like the old « url_for »…). I think it’s part of the « kill the magic » cleanup…

Assets and links to images, css, js…

<img src="<?php echo $view->assets->getUrl('images/logo.png') ?>" />

You will be able to change the URL root path of your web app without breaking any links. I love it, but HTML integrators will complain… But I like it… and they will (have to?) live with that.

« imports » directive in Configuration file: cleaner configuration files!

#in config_prod.yml
imports:
  - { resource: config.yml }

Google Analytics API – Enfin (too soon?)

Et oui, tu le voulais pour Noël, Google l’a fait: Google vient de lancer une API pour accéder en lecture seulement les données de Google Analytics: http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html

Pour l’instant, il y a une librairie Javascript, Java et « Raw » (HTTP et XML). Pour PHP, il va falloir attendre un peu, mais on peut espérer que Zend inclut sous peu à son component Zend_GData des classes spécifiques pour Google Analytics. Il est déjà possible de s’autentifier avec le framework et d’optenir le XML à peu de frais (voir ce lien par exemple tiré de analyseweb.fr, merci Julien Coquet)

Zend, the good, the bad and the ugly

Bon, le framework Zend c’est bien, très bien même. Ne me faites pas dire ce je n’ai pas dit, ok?

Mais quand même, une mini-liste de chose que je n’ai pas été capable de faire avec le Zend framework (1.7):

  • Zend_Feed: créer un feed atom custom, avec mes propres tag et namespaces. En fait, c’est faisable, mais qu’est ce que c’est compliqué…
  • Zend_SOAP:  ajouter un header du coté du client pour « consommer » un Web Service. Là, j’ai été obligé de me servir de SoapClient (inclus maintenant dans PHP). Je n’ai vraiment pas trouvé comment. Pas trop grave, car Zend_Soap n’est qu’un « wapper » de SoapClient et SoapServer (du propre aveu de Matthew Weier O’Phinney au la conférence PHP Québec).

Sinon, je me sers souvent de Zend_Mail, parfait, parfait, parfait. Zend_Amf, les tests ont été très concluant, la suite dans un prochain épisode.