在实现RequireJS的同时继续开发CoffeeScript

在实现RequireJS的同时继续开发CoffeeScript,coffeescript,gruntjs,grunt-contrib-requirejs,Coffeescript,Gruntjs,Grunt Contrib Requirejs,我想在一个使用CoffeeScript和Grunt的非常大的单页应用程序中实现RequireJS。我们为不同的模块(服务、主干网等)提供了单独的文件 实现RequireJS非常简单——我的主要问题是应用程序的大小和CoffeeScript对空格的敏感性。我们需要能够在实现RJS的同时不断开发新功能。我们不能这样做的原因是,我们必须在define调用中包装所有文件,然后重新标记文件。当您尝试重定此代码的基址时,由于制表符,会出现大量合并冲突。没有人有时间解决所有这些问题,因为RJS之前可能已经引入

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

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

我研究了几种可能的解决方案:

  • 停止开发并重新标记所有内容。这很糟糕,因为开发会一直停止,直到文件被打上标签并且代码可以与RJ一起工作

  • 使用CommonJS模式,并使用RJS CommonJS转换器预RJS优化。看起来有点黑

  • 使用CoffeeScript
    backtick
    功能以标准JavaScript模块模式包装CoffeeScript类。接下来,将依赖项传递给CoffeeScript类的“module”包装器,然后在文件中的RJS调用中初始化“module”
  • 编辑: 感谢您提供关于垂直结构的提示&向我介绍如何以这种方式传递函数参数(无逗号)。我们的项目在结构上非常相似(遗憾的是,目前grunt contrib Coffee做了linting),我还构建了一个定制的监视任务来编译单个文件(与glob模式相比)

    考虑这个非常基本的例子:

    view.coffee

    class View
      template: Helper.template
      constructor: (@options) ->
      render: (meters) ->
        $('body').html @template @options
    
    正常过程是使用RJ执行以下操作:

    define [
      'jQuery'
      'Helper'
    ], (
      $
      Helper
    ) ->
      class View
        template: Helper.template 'base_view'
        constructor: (@options) ->
        render: (meters) ->
          $('body').html @template @options
    
    注意整个类是如何被重新标记的。当我试图并行实现require时,如果我们的任何一个开发人员出现并修改了
    View
    类,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并以这种方式逐步实施,以防止无法解决的合并冲突。

    我们在项目中所做的:

    • 我们使用和来编译和验证coffee文件。使用此插件,您可以在开发时验证coffeescript代码。您可以使用包含验证设置的json文件。这确保所有开发人员使用相同的设置
    e、 g:

    • 通过在单独的行中定义每个依赖项,将requirejs依赖项中合并冲突的可能性降至最低
    e、 g

    而不是

    define ['dep1', 'dep2','dep3'], (dep1, dep2, dep3) -> 
      console.log "Hello"
    
    • 仅将coffeescript文件提交到源代码管理。生成的javascript文件(通过缩小)我们不提交(仅在创建生产版本时提交)
    • 我们使用自定义的监视任务来监视已更改的coffeescript文件(以及其他文件)。当编译或验证失败时,会通知开发人员
    define [
     'dep1'
     'dep2'
     'dep3'
    ], (
      dep1
      dep2
      dep3
    ) -> 
      console.log "Hello"
    
    define ['dep1', 'dep2','dep3'], (dep1, dep2, dep3) -> 
      console.log "Hello"