Связь нескольких файлов с coffeescript - PullRequest
32 голосов
/ 15 февраля 2012

Когда я создаю новый файл coffeescript, я не могу получить доступ к коду в скомпилированном коде из другого файла, потому что он обернут в некоторую область действия функции. Например:

CoffeeScript:

class ChatService
  constructor: (@io) ->

Сгенерированный Javascript:

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

При попытке вызвать ChatService в другом файле он не определяется. Как мне обработать несколько файлов с помощью coffeescript?

Ответы [ 3 ]

56 голосов
/ 15 февраля 2012

В зависимости от того, является ли это кодом на стороне клиента или на стороне сервера, существует два слегка отличающихся подхода.

На стороне клиента: здесь мы прикрепляем вещи, которые должны быть доступны через файлы, к глобальному пространству имен (window) следующим образом:

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

Затем в другом файле и ChatService, и window.ChatService разрешат доступ к классу.


На стороне сервера: Здесь мы должныиспользуйте exports и require.В файле ChatService.coffee у вас будет следующее:

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

Затем, чтобы получить его из другого файла, вы можете использовать:

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

Примечание: если есть несколькоклассы, которые вы получаете от ChatService.coffee, это одно из мест, где действительно распадается распаковка CoffeeScript, например:

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

Оба: в основном, мы выбираем, запускать ли на стороне сервера или клиентакод, основанный на том, в какой среде мы находимся. Обычный способ сделать это:

class ChatService
  constructor: (@io) ->

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

Чтобы получить его:

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

Условие else второго блока может быть следующим:пропущено, поскольку ChatService уже ссылается на ссылку, прикрепленную к window.

Если вы собираетесь определить множество классов в этом файле, может быть проще определить их как:

self = {}

class self.ChatService

И затем присоедините их как module.exports = self на сервере и _.extend(window, self) на клиенте (замените _.extend другой функцией extend в зависимости от ситуации).

23 голосов
/ 15 февраля 2012

Обычный подход состоит в том, чтобы определить глобальное пространство имен в window:

window.App = { }

, которое будет где-то в коде инициализации вашего приложения, прежде чем что-либо еще произойдет.И затем, для вашего класса:

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

Это позволяет вам ссылаться на ваш класс через App где угодно, и вам не нужно беспокоиться о загрязнении глобального пространства имен:

chatter = new App.ChatService

Если вы хотите, чтобы ваш ChatService был действительно глобальным, вы могли бы использовать class window.ChatService, но я бы рекомендовал против этого, за исключением самых простых приложений.

AFAIK, в node.js есть нечто подобноена window, но я не достаточно знаком с node.js, чтобы сказать вам, что это такое.

0 голосов
/ 29 июля 2012

Разделите ваши классы с пространствами имен и используйте торт , чтобы скомпилировать их все в один (или более) результирующий файл .js. Cakefile используется в качестве конфигурации, которая контролирует, в каком порядке компилируются ваши кофейные сценарии, что очень удобно для больших проектов.

Cake довольно прост в установке и настройке, вызывая торт из vim, пока вы редактируете свой проект, просто

:!cake build

и вы можете обновить свой браузер и увидеть результаты.

Поскольку я также занят изучением лучшего способа структурирования файлов и использования coffeescript в сочетании с магистралью и тортом, я создал небольшой проект на github , чтобы сохранить его в качестве справки для себя, может быть, это поможет вам слишком вокруг торта и некоторые основные вещи. Все скомпилированные файлы находятся в папке www , так что вы можете открыть их в своем браузере, а все исходные файлы (кроме конфигурации тортов) находятся в папке src . В этом примере все файлы .coffee компилируются и объединяются в один выходной файл .js, который затем включается в html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...