Структурирование кода coffeescript?
В Rails 3.1 я пытаюсь выяснить, как переместить несколько классов coffeescript из моего файла файла coffeescript по умолчанию (home.js.coffee
) в другой файл, чтобы немного структурировать целое.
Кто-нибудь знает, как "включить" файл coffeescript в другой?
Ответы
Ответ 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, но затем толкает работу в ваши взгляды, которые могут стать уродливыми.
Надеюсь, что это поможет!
Ответ 5
Используйте торт, вы можете определить порядок файлов, а также другие настраиваемые шаги, такие как minify и т.д.
Убедитесь, что вы указали, что все файлы кофе объединены в один выходной файл .js.
https://github.com/jashkenas/coffee- script/wiki/[HowTo] -Compiling-and-Setting-Up-Build- Инструменты