32 votes

Structurer le code coffeescript ?

Sous Rails 3.1, j'essaie de trouver comment déplacer quelques classes coffeescript hors du fichier coffeescript par défaut de mon contrôleur ( home.js.coffee ) dans un autre fichier, afin de structurer un peu l'ensemble.

Quelqu'un sait-il comment "inclure" un fichier coffeescript dans un autre ?

63voto

Trevor Burnham Points 43199

Ce que vous voulez faire, c'est exporter fonctionnalité. Par exemple, si vous commencez par

class Foo
  ...

class Bar extends Foo
  ...

et vous décidez de déménager Foo dans son propre fichier, ce fichier devrait ressembler à ceci

class Foo
  ...

window.Foo = Foo

(où window.Foo = Foo fait Foo un global), et Bar Le fichier de l'utilisateur doit commencer par la directive Sprockets

#= require Foo

(en supposant que vous avez nommé Foo Le dossier de l'entreprise Foo.js.coffee ). Chaque fichier est compilé en JS indépendamment, mais Sprockets s'assure que Foo est inclus avant Bar .

Notez que, en guise de raccourci, vous pouvez vous débarrasser de l'option window.Foo = Foo et écrivez plutôt

class window.Foo
  ...

ou simplement

class @Foo
  ...

pour définir une classe nommée Foo qui est attaché à la window objet.

6voto

shesek Points 2726

Pendant l'utilisation du window L'utilisation d'un objet comme lieu de partage de fonctionnalités entre différentes parties de votre code peut fonctionner assez bien, mais elle peut devenir quelque peu désagréable lorsque vous travaillez sur une base de code importante/complexe. De plus, vous devez gérer le chargement de toutes les dépendances manuellement, ce qui peut aussi devenir quelque peu frustrant. De nombreuses personnes finissent par tout charger à chaque requête, sans tenir compte de ce qui est réellement nécessaire pour cette page particulière.

De nombreuses bibliothèques ont été créées pour tenter de résoudre ces problèmes et rendre l'exportation et l'importation de fonctionnalités entre fichiers plus faciles à gérer. L'une des plus courantes aujourd'hui est RequireJS qui est une mise en œuvre de la Spécifications AMD de CommonJS . Vous pouvez trouver d'autres bibliothèques et une comparaison entre elles ici Il existe un excellent tutoriel sur la façon d'écrire du JavaScript modulaire à l'aide de ces bibliothèques à l'adresse suivante Blog d'Addy Osmani - qui parle aussi du nouveau système de modules à venir dans ES.next, ce qui est aussi très intéressant.

Personnellement, j'aime beaucoup Le système de modules de NodeJS (avec le exports et l'objet require ), j'utilise donc node-browserify pour l'emballer afin qu'il fonctionne aussi du côté client. Bien que cela ne permette pas de charger dynamiquement les dépendances de manière asynchrone comme le font les spécifications AMD, cela permet de partager le même code JavaScript à la fois du côté client et du côté serveur, ce qui est un énorme bonus pour moi (principalement parce que je travaille avec NodeJS du côté serveur aussi, donc je ne suis pas sûr de l'importance que cela peut avoir pour vous) et cela gère l'empaquetage de toutes les dépendances ensemble de manière agréable pour vous (de sorte qu'elles puissent être synchronisées avec le serveur). require() d) en analysant votre code JavaScript et en recherchant des informations simples. require() pour déterminer ce dont un script donné a besoin pour s'exécuter.

6voto

Kimtho6 Points 3897

Vous pouvez aussi le faire comme ceci :

@app = window.app ? {}

app.Foo = Foo

ceci fera que l'application contiendra toutes vos classes globales

et window.app ? {} s'assure que vous ne créerez qu'une seule app

0voto

Matt Garrison Points 452

Je ne suis pas sûr que ce soit directement possible (mais n'hésitez pas à me corriger).

Si j'ai bien compris, l'interpréteur CoffeeScript s'exécute avant que Sprockets ne fusionne toutes vos ressources. Étant donné que les commentaires dans les fichiers .coffee n'apparaissent pas dans la sortie, et que Sprockets utilise le langage //= Je ne pense pas qu'il existe pour l'instant un moyen de créer des directives Sprockets dans CoffeeScript.

Vous pouvez toujours diviser votre travail en plusieurs fichiers .coffee et utiliser un fichier javascript "directive" parent pour combiner les pièces (il pourrait être constitué uniquement de directives Sprockets, comme le fichier application.js de Rails 3.1). Utilisation des Sprockets //= require_tree vous pouvez diviser votre CoffeeScript et garder votre application assez organisée, mais vous aurez toujours des fichiers Javascript qui traînent dans la gestion de Sprockets.

Ce site Cette question pourrait expliquer un peu mieux le pipeline des actifs. Il y a également quelques aides Sprockets dans la documentation Edge ici : http://edgeapi.rubyonrails.org/classes/ActionView/Helpers/SprocketsHelper.html#method-i-sprockets_javascript_include_tag mais cela fait passer le travail dans vos vues, ce qui peut devenir désagréable.

J'espère que cela vous aidera !

0voto

Perica Zivkovic Points 1808

Avec cake, vous pouvez définir l'ordre des fichiers et aussi d'autres étapes personnalisées comme minifier, etc.

Assurez-vous de spécifier que tous les fichiers de café sont combinés en un seul fichier de sortie .js.

https://github.com/jashkenas/coffee-script/wiki/[HowTo]-Compilation-and-Setting-Up-Build-Tools

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