Подтвердить что ты не робот

Связывание нескольких файлов с coffeescript

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

CoffeeScript:

class ChatService
  constructor: (@io) ->

Созданный Javascript:

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

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

4b9b3361

Ответ 1

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

Клиентская сторона: здесь мы добавляем вещи, которые должны быть доступны для файлов в глобальное пространство имен (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 dict, например:

{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, если это необходимо).

Ответ 2

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

window.App = { }

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

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

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

chatter = new App.ChatService

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

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

Ответ 3

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

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

:!cake build

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

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