Я хочу реализовать RequireJS в очень большом одностраничном приложении, использующем CoffeeScript и Grunt. У нас есть отдельные файлы для разных модулей (сервисы, Backbone и т.д.).
Реализовать RequireJS очень просто — моя главная проблема связана с размером приложения и чувствительностью CoffeeScript к пробелам. Нам нужно иметь возможность постоянно разрабатывать новые функции при внедрении RJS. Причина, по которой мы не можем этого сделать, заключается в том, что нам пришлось бы оборачивать все файлы в вызовы определения и переустанавливать файлы. Когда вы пытаетесь перебазировать этот код, возникают массовые конфликты слияния из-за табуляции. Ни у кого нет времени решать все эти проблемы, поскольку новые функции и исправления могли быть введены до RJS.
Я исследовал несколько возможных решений:
Остановите разработку и перетащите все. Это отстой, потому что разработка останавливается до тех пор, пока файлы не будут добавлены во вкладки и код действительно не заработает с RJS.
Используйте шаблон CommonJS и используйте преобразователь RJS CommonJS до оптимизации RJS. Кажется хакерским.
- Используйте функциональность CoffeeScript
backtick
, чтобы обернуть классы CoffeeScript в стандартный шаблон модуля JavaScript. Затем передайте зависимости оболочке «модуль» для класса CoffeeScript, затем инициализируйте «модуль» в вызове RJS в файле.
Изменить: спасибо за подсказку о вертикальной структуре и знакомство с передачей аргументов функции таким образом (без запятых). Наши проекты очень похожи по структуре (за исключением того, что grunt-contrib-coffeee, к сожалению, в данный момент занимается линтингом), и я также создаю пользовательскую задачу наблюдения для компиляции отдельных файлов (по сравнению с шаблонами glob).
Рассмотрим этот очень простой пример:
view.coffee
:
class View
template: Helper.template
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
Обычным процессом было бы сделать что-то вроде следующего с RJS:
define [
'jQuery'
'Helper'
], (
$
Helper
) ->
class View
template: Helper.template 'base_view'
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
Обратите внимание, как весь класс был переназначен. Git возненавидел бы это, если бы кто-нибудь из наших разработчиков изменил класс View
, пока я пытался реализовать require параллельно.
Идея с обратной кавычкой не сработает, я не могу обойти глобальную проблему:
`var exports = function($, Helper) {
class View
template: Helper.template
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
return View }(jQuery, Helper)`
define [
'jQuery'
'Helper'
], (
$
Helper
) ->
return exports($, Helper)
Я думаю, что лучше всего объединить все функции приложения вместе, а затем сделать паузу на мгновение, чтобы переместить каждый файл на два необходимых пробела, и все это в одном коммите. CoffeeScript, кажется, не заботит, где начинается отступ (столбец 0 против столбца 2), пока остальная часть файла следует этому шаблону. Мы должны иметь возможность постепенно внедрять RJS и таким образом предотвращать неразрешимые конфликты слияния.