在实现RequireJS的同时继续开发CoffeeScript
我想在一个使用CoffeeScript和Grunt的非常大的单页应用程序中实现RequireJS。我们为不同的模块(服务、主干网等)提供了单独的文件 实现RequireJS非常简单——我的主要问题是应用程序的大小和CoffeeScript对空格的敏感性。我们需要能够在实现RJS的同时不断开发新功能。我们不能这样做的原因是,我们必须在define调用中包装所有文件,然后重新标记文件。当您尝试重定此代码的基址时,由于制表符,会出现大量合并冲突。没有人有时间解决所有这些问题,因为RJS之前可能已经引入了新功能和错误修复 我研究了几种可能的解决方案:在实现RequireJS的同时继续开发CoffeeScript,coffeescript,gruntjs,grunt-contrib-requirejs,Coffeescript,Gruntjs,Grunt Contrib Requirejs,我想在一个使用CoffeeScript和Grunt的非常大的单页应用程序中实现RequireJS。我们为不同的模块(服务、主干网等)提供了单独的文件 实现RequireJS非常简单——我的主要问题是应用程序的大小和CoffeeScript对空格的敏感性。我们需要能够在实现RJS的同时不断开发新功能。我们不能这样做的原因是,我们必须在define调用中包装所有文件,然后重新标记文件。当您尝试重定此代码的基址时,由于制表符,会出现大量合并冲突。没有人有时间解决所有这些问题,因为RJS之前可能已经引入
backtick
功能以标准JavaScript模块模式包装CoffeeScript类。接下来,将依赖项传递给CoffeeScript类的“module”包装器,然后在文件中的RJS调用中初始化“module”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文件。这确保所有开发人员使用相同的设置
- 通过在单独的行中定义每个依赖项,将requirejs依赖项中合并冲突的可能性降至最低
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"