在实现RequireJS时继续开发CoffeeScript

时间:2014-02-26 19:09:01

标签: coffeescript gruntjs grunt-contrib-requirejs

我想在一个使用CoffeeScript和Grunt的非常大的单页面应用程序中实现RequireJS。我们为不同的模块(服务,Backbone等)提供单独的文件。

实现RequireJS非常简单 - 我的主要问题是应用程序的大小和CoffeeScript的空白敏感性。我们需要能够在实施RJS的同时不断开发新功能。我们不能这样做的原因是因为我们必须在define调用中包装所有文件,并重新标记文件。当您尝试重新定义此代码时,由于Tab键导致出现大量合并冲突。没有人有时间解决所有这些问题,因为在RJS之前可能已经引入了新功能和错误修正。

我研究了一些可能的解决方案:

  1. 停止开发并重新标记所有内容。这很糟糕,因为开发一直停止,直到文件被标签化,代码实际上与RJS一起使用。

  2. 使用CommonJS模式,并使用RJS CommonJS转换器预先RJS优化。看似hacky。

  3. 使用CoffeeScript backtick功能将CoffeeScript类包装在标准JavaScript模块模式中。接下来将依赖项传递给CoffeeScript类的“module”包装器,然后在文件中的RJS调用中初始化“module”。
  4. 编辑: 感谢垂直结构上的尖端和向我介绍以这种方式传递函数参数(逗号)。我们的项目在结构上非常相似(不幸的是,grunt-contrib-coffeee除此之外还有linting),我还在构建一个自定义监视任务来编译单个文件(与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
    

    注意整个类是如何被重新标记的。如果我们的任何一个开发人员出现并修改了View类,而我试图并行实现require,那么Git会讨厌这个。

    反击的想法是行不通的,我无法解决那里的全球性问题:

    `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中滑动并以这种方式逐步实现它,防止无法解决的合并冲突。

1 个答案:

答案 0 :(得分:0)

我们在项目中做了什么:

  • 我们使用grunt-contrib-coffeegrunt-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,编译或验证失败时会通知开发人员。