27 votes

Communication de fichiers multiples avec coffeescript

Lorsque je crée un nouveau fichier coffeescript, je ne peux pas accéder au code dans le code compilé à partir d'un autre fichier, car il est enveloppé dans la portée d'une fonction. Par exemple :

CoffeeScript :

class ChatService
  constructor: (@io) ->

Javascript généré :

(function() {
  var ChatService;    
  ChatService = (function() {    
    function ChatService(io) {
      this.io = io;
    }    
    return ChatService;    
  })();    
}).call(this);

En essayant d'appeler ChatService dans un autre fichier, il n'est pas défini. Comment puis-je gérer plusieurs fichiers avec coffeescript ?

49voto

Aaron Dufour Points 6912

Selon qu'il s'agit de code côté client ou côté serveur, il existe deux approches légèrement différentes.

Côté client : Ici, nous attachons les éléments qui doivent être disponibles dans tous les fichiers à l'espace de nom global ( window ) comme suit :

class window.ChatService
  constructor: (@io) ->

Ensuite, dans un autre fichier, les deux ChatService y window.ChatService permettra d'accéder à la classe.


Côté serveur : ici, nous devons utiliser exports y require . Dans le ChatService.coffee vous obtiendrez ce qui suit :

class exports.ChatService
  constructor: (@io) ->

Ensuite, pour l'obtenir à partir d'un autre fichier, vous pouvez utiliser :

ChatService = require('ChatService.coffee').ChatService

Remarque : Si vous obtenez plusieurs classes à partir de ChatService.coffee, c'est l'endroit où le déballage des dictées de CoffeeScript est le plus efficace, par exemple :

{ChatService, OtherService} = require('ChatService.coffee')

Les deux : En fait, nous choisissons d'exécuter le code côté serveur ou côté client en fonction de l'environnement dans lequel nous nous trouvons. Une façon courante de le faire :

class ChatService
  constructor: (@io) ->

if typeof module != "undefined" && module.exports
  #On a server
  exports.ChatService = ChatService
else
  #On a client
  window.ChatService = ChatService

Pour l'obtenir :

if typeof module != "undefined" && module.exports
  #On a server
  ChatService = require("ChatService.coffee").ChatService
else
  #On a client
  ChatService = window.ChatService

La clause else du deuxième bloc peut être ignorée, puisque ChatService fait déjà référence à la référence attachée à window .

Si vous devez définir un grand nombre de classes dans ce fichier, il peut être plus facile de les définir comme suit :

self = {}

class self.ChatService

Et ensuite les attacher comme module.exports = self sur le serveur et _.extend(window, self) sur le client (remplacer _.extend avec un autre extend le cas échéant).

19voto

mu is too short Points 205090

L'approche habituelle consiste à définir un espace de noms global dans le fichier window :

window.App = { }

Cela devrait être placé quelque part dans le code d'initialisation de votre application avant toute autre chose. Et ensuite, pour votre classe :

class App.ChatService
  constructor: (@io) ->

Cela vous permet de faire référence à votre classe par le biais de App où vous voulez et vous n'avez pas à vous soucier de polluer l'espace de noms global :

chatter = new App.ChatService

Si vous vouliez faire votre ChatService vraiment global, alors vous pourriez utiliser class window.ChatService mais je vous le déconseille, sauf dans les applications les plus triviales.

AFAIK, node.js a quelque chose de similaire à window mais je ne suis pas assez familier avec node.js pour te dire ce que c'est.

1voto

Perica Zivkovic Points 1808

Séparez vos classes avec des espaces de noms et utilisez gâteau pour les compiler tous dans un (ou plusieurs) fichier(s) .js résultant(s). Cakefile est utilisé comme configuration qui contrôle dans quel ordre vos scripts de café sont compilés - assez pratique avec des projets plus importants.

Cake est assez facile à installer et à configurer, l'invocation de cake à partir de vim pendant que vous éditez votre projet est alors simplement

:!cake build

et vous pouvez rafraîchir votre navigateur et voir les résultats.

Comme je suis également occupé à apprendre la meilleure façon de structurer les fichiers et d'utiliser coffeescript en combinaison avec backbone et cake, j'ai créé un fichier petit projet sur github pour le garder comme référence pour moi, peut-être qu'il vous aidera aussi autour du gâteau et de certaines choses de base. Tous les fichiers compilés sont dans www afin que vous puissiez les ouvrir dans votre navigateur et tous les fichiers sources (à l'exception de la configuration du gâteau) sont dans le dossier src dossier. Dans cet exemple, tous les fichiers .coffee sont compilés et combinés dans le dossier un fichier .js de sortie qui est ensuite inclus dans le html.

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