Продолжение разработки в CoffeeScript при реализации RequireJS

Я хочу реализовать RequireJS в очень большом одностраничном приложении, использующем CoffeeScript и Grunt. У нас есть отдельные файлы для разных модулей (сервисы, Backbone и т.д.).

Реализовать RequireJS очень просто — моя главная проблема связана с размером приложения и чувствительностью CoffeeScript к пробелам. Нам нужно иметь возможность постоянно разрабатывать новые функции при внедрении RJS. Причина, по которой мы не можем этого сделать, заключается в том, что нам пришлось бы оборачивать все файлы в вызовы определения и переустанавливать файлы. Когда вы пытаетесь перебазировать этот код, возникают массовые конфликты слияния из-за табуляции. Ни у кого нет времени решать все эти проблемы, поскольку новые функции и исправления могли быть введены до RJS.

Я исследовал несколько возможных решений:

  1. Остановите разработку и перетащите все. Это отстой, потому что разработка останавливается до тех пор, пока файлы не будут добавлены во вкладки и код действительно не заработает с RJS.

  2. Используйте шаблон CommonJS и используйте преобразователь RJS CommonJS до оптимизации RJS. Кажется хакерским.

  3. Используйте функциональность 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 и таким образом предотвращать неразрешимые конфликты слияния.


person rwoody    schedule 26.02.2014    source источник


Ответы (1)


Что мы делаем в наших проектах:

  • мы используем grunt-contrib-coffee и grunt-coffeelint для компиляции и проверки файлов кофе. С помощью этого плагина вы можете проверять код coffeescript во время разработки. Вы можете использовать файл json, который содержит настройки проверки. Это гарантирует, что все разработчики используют одни и те же настройки.

e.g:

{
  "no_tabs" : {
    "level" : "error"
  },

  "no_trailing_whitespace" : {
    "level" : "error"
  },

  "max_line_length" : {
    "value": 200,
    "level" : "error"
  },
  ...
  • минимизировать вероятность конфликтов слияния в зависимостях requirejs, определяя каждую зависимость в отдельной строке.

e.g.

define [
 'dep1'
 'dep2'
 'dep3'
], (
  dep1
  dep2
  dep3
) -> 
  console.log "Hello"

вместо

define ['dep1', 'dep2','dep3'], (dep1, dep2, dep3) -> 
  console.log "Hello"
  • Только передайте файлы coffeescript в систему управления версиями. Сгенерированные файлы javascript (минимизированные с помощью grunt-contrib-requirejs), которые мы не фиксируем (только при создании рабочей версии).
  • мы используем пользовательскую задачу просмотра для просмотра измененных файлов coffeescript (среди других файлов). Через growl разработчик уведомляется о сбое компиляции или проверки.
person asgoth    schedule 28.02.2014