javascript - from - Comunicazione di file multipli con coffeescript



(2)

Quando creo un nuovo file coffeescript, non riesco ad accedere al codice nel codice compilato da un altro file perché viene incluso in alcune funzioni. Per esempio:

CoffeeScript:

class ChatService
  constructor: (@io) ->

Javascript generato:

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

Quando si tenta di chiamare ChatService in un altro file, non è definito. Come gestisco più file con coffeescript?


Answer #1

A seconda che si tratti di codice client o lato server, esistono due approcci leggermente diversi.

Lato client: qui vengono allegate le cose che dovrebbero essere disponibili tra i file nello spazio dei nomi globale ( window ) come segue:

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

Quindi, in un altro file sia ChatService che ChatService consentiranno l'accesso alla classe.

Lato server: qui dobbiamo utilizzare le exports e require . Nel file ChatService.coffee , avresti il ​​seguente:

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

Quindi, per ottenerlo da un altro file puoi usare:

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

Nota: se ci sono più classi che stai ricevendo da ChatService.coffee, questo è uno dei punti in cui la decodifica di CoffeeScript declina davvero, come ad esempio:

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

Entrambi: Fondamentalmente, scegliamo se eseguire il codice lato server o lato client in base all'ambiente in cui ci troviamo. Un modo comune per farlo:

class ChatService
  constructor: (@io) ->

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

Capirlo:

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

La clausola else del secondo blocco può essere saltata, poiché ChatService fa già riferimento al riferimento allegato alla window .

Se definirai molte classi in questo file, potrebbe essere più semplice definirle come:

self = {}

class self.ChatService

Quindi allegarli come module.exports = self sul server e _.extend(window, self) sul client (sostituire _.extend con un'altra funzione di extend appropriata).


Answer #2

L'approccio abituale è definire un namespace globale nella window :

window.App = { }

Ciò andrebbe da qualche parte nel codice di inizializzazione dell'applicazione prima che accada qualcos'altro. E poi, per la tua classe:

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

Ciò ti consente di fare riferimento alla tua classe tramite l' App ovunque tu voglia e non devi preoccuparti di inquinare lo spazio dei nomi globale:

chatter = new App.ChatService

Se si desidera rendere veramente globale il proprio servizio ChatService è possibile utilizzare la class window.ChatService ma si consiglia di farlo, tranne che nelle applicazioni più banali.

AFAIK, node.js ha qualcosa di simile alla window ma non sono abbastanza familiare con node.js per dirti di cosa si tratta.





coffeescript