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

Структурирование кода coffeescript?

В Rails 3.1 я пытаюсь выяснить, как переместить несколько классов coffeescript из моего файла файла coffeescript по умолчанию (home.js.coffee) в другой файл, чтобы немного структурировать целое.

Кто-нибудь знает, как "включить" файл coffeescript в другой?

4b9b3361

Ответ 1

Что вы хотите сделать, это функции экспорта. Например, если вы начинаете с

class Foo
  ...

class Bar extends Foo
  ...

и вы решите переместить Foo в свой собственный файл, этот файл должен выглядеть как

class Foo
  ...

window.Foo = Foo

(где window.Foo = Foo делает Foo глобальным), а файл Bar должен начинаться с директивы Sprockets

#= require Foo

(предположим, что вы назвали Foo file Foo.js.coffee). Каждый файл скомпилирован в JS независимо, но Sprockets гарантирует, что Foo будет включен до Bar.

Обратите внимание, что в качестве ярлыка вы можете избавиться от строки window.Foo = Foo и вместо этого написать

class window.Foo
  ...

или просто

class @Foo
  ...

чтобы определить класс с именем Foo, который привязан к объекту window.

Ответ 2

При использовании объекта window в качестве места для обмена функциями между различными частями вашего кода может работать довольно хорошо, он может стать несколько уродливым, когда вы работаете над большой/сложной базой кода. Кроме того, вам приходится вручную загружать все зависимости вручную, что тоже может расстраивать. Многие люди просто загружают все в каждом запросе, независимо от того, что действительно необходимо для этой конкретной страницы.

Существует множество библиотек, созданных в попытке решить эти проблемы, и сделать экспорт и импорт функциональности среди файлов более управляемыми. Один из наиболее распространенных сегодня - RequireJS, который является реализацией Спецификации CommonJS AMD. Вы можете найти другие библиотеки и сравнить их здесь, и там есть большой учебник о том, как писать модульный JavaScript, используя эти библиотеки на блог Addy Osmani - в котором также говорится о новой системе предстоящих модулей в ES.next, что тоже довольно интересно.

Мне лично очень нравится система модулей NodeJS (с объектом exports и функцией require), поэтому я использую node-browserify, чтобы упаковать его для работы на стороне клиента. Хотя это не позволяет динамически загружать зависимости асинхронным способом, как это делают спецификации AMD, это позволяет хорошо использовать один и тот же код JavaScript как на стороне клиента, так и на стороне сервера, что является огромным бонусом для меня (в основном потому, что Я тоже работаю с NodeJS на стороне сервера, поэтому я не уверен, насколько это важно для вас), и он отлично подходит для упаковки всех зависимостей (так что они могут быть синхронно require() d) на разбор кода JavaScript и поиск простых вызовов require() для определения того, что требуется для данного script.

Ответ 3

Вы также можете сделать это следующим образом:

@app = window.app ? {}

app.Foo = Foo

Это сделает app содержать все ваши глобальные классы, а window.app ? {} гарантирует, что вы создадите только один app.

Ответ 4

Я не уверен, что это возможно (но кто-то может меня исправить).

Я понимаю, что интерпретатор CoffeeScript работает до того, как Sprockets объединяет все ваши активы. Поскольку комментарии в файлах. Coffee не отображаются в выходном файле, и поскольку Sprockets использует директивы code t20 > code comment для создания всего, я не думаю, что на данный момент существует способ создания директив Sprockets в CoffeeScript.

Вы могли бы разделить свою работу на несколько файлов .coffee и использовать родительский "директивный" javascript файл, чтобы объединить фрагменты (он может состоять только из директив Sprockets, например, как запасы application.js отправляются в Rails 3.1). Используя директиву Sprockets //= require_tree, вы можете разделить свой CoffeeScript и по-прежнему держать свое приложение достаточно организованным, но у вас все еще есть простые файлы Javascript, задерживающиеся при управлении звездочками.

Этот вопрос может объяснить ситуацию с конвейером немного лучше. Там также есть помощники Sprockets в документации Edge: http://edgeapi.rubyonrails.org/classes/ActionView/Helpers/SprocketsHelper.html#method-i-sprockets_javascript_include_tag, но затем толкает работу в ваши взгляды, которые могут стать уродливыми.

Надеюсь, что это поможет!