4 votes

Pourquoi diable Rails 3.1 / Sprockets 2 / CoffeeScript ajoute-t-il du code supplémentaire?

Travailler avec Rails 3.1 (rc5), et je remarque que tout fichier coffeescript que j'inclus dans rails (ou sprockets) ajoute du code javascript d'initialisation en haut et en bas. En d'autres termes, un fichier .js.coffee vide est affiché comme ceci :

(function() {
}).call(this);

C'est irritant car cela perturbe la portée de mon javascript (à moins que je ne sache vraiment pas ce que je fais). Je sépare généralement toutes mes classes javascript dans des fichiers séparés et je crois que le fait d'avoir ce code de fonction enveloppant mes classes les met simplement hors de portée les unes des autres. Ou, du moins, je semble ne pas pouvoir y accéder car j'obtiens continuellement des erreurs indéfinies.

Y a-t-il un moyen de remplacer cela? Il semble que ce fichier dans sprockets ait à voir avec l'ajout de ce code : https://github.com/sstephenson/sprockets/blob/master/lib/sprockets/jst_processor.rb

Je comprends qu'envelopper tout dans une fonction pourrait sembler être une commodité supplémentaire car alors rien n'est exécuté tant que le DOM n'est pas chargé, mais autant que je puisse dire, cela perturbe simplement ma portée.

10voto

Justin Weiss Points 752

Prévoyez-vous de mettre vos objets dans la portée globale? Je pense que CoffeeScript enveloppe généralement le code dans des fonctions anonymes afin qu'il ne fuite pas accidentellement des variables dans la portée globale. S'il n'y a pas de moyen de le désactiver, votre meilleure option serait probablement d'ajouter spécifiquement tout ce que vous voulez être dans la portée globale à l'objet window:

window.myGlobal = myGlobal;

De nos jours, il semble être une bonne pratique en JavaScript de placer le code à l'intérieur d'une portée de fonction et d'être explicite sur l'ajout d'objets à la portée globale, et c'est quelque chose que je vois généralement CoffeeScript faire automatiquement.

2voto

bradgonesurfing Points 8600

Vous ne voulez pas mettre tout dans la portée globale. Vous voulez un système de module ou de module où vous pouvez mettre les choses sous un espace de noms afin de ne pas entrer en conflit avec d'autres bibliothèques. Jetez un coup d'œil sur

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X