Связывание нескольких файлов с 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?
Ответы
Ответ 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.