我认为 Bob 的链接项目是相关的(有一条评论与权衡性能与加载的文件数量有关),但我认为问题更多的是关于名称间距、范围和结构。
要具体回答这个问题(假设您使用的是 jQuery),请考虑以下 CoffeeScript:
$ ->
doSomething()
doSomethingElse("#some-element")
doSomething = ->
alert("I'm doing something")
doSomethingElse = (selector) ->
alert("I'm hiding something")
$(selector).hide()
CoffeeScript 编译器会将所有这些包装在一个匿名函数中,因此只能在加载页面的上下文中可用(脚本标签,或特定于控制器的文件,或用于全局的 application.js能见度)。
有几个模型需要考虑。一个简单的方法是遵循具有特定于模型的“事物”以及通常有用(全局)的“事物”的模式。因此,如果我想要一个特定于 User 的 javascript 函数,则它位于 app/assets/javascripts/users.js.coffee 中,否则它需要是全局的(在 application.js.coffee 中)。
rails-backbone gem 建议了一个更完整和复杂的解决方案,它具有创建 CoffeeScript 模型、视图、模板和路由器的生成器,这些生成器替换了我们使用常规 rails generate scaffold foo 获得的很多东西——同样各种 CRUD 操作以完全不同的方式完成,特别是模板(嵌入式 javascript)与 ERB 模板非常相似。对我来说,这更像是一种信仰的飞跃。
无论是在应用程序范围的文件中,还是在特定于控制器的文件中,在任何一种情况下,资产管道都会将所有代码混合在一起并将其全部发送给用户(假设您保留默认配置),但这是一个单独的主题。
不确定这是否回答了您的问题,但我认为区分资产的交付(资产管道所做的)和执行很重要javascript,这是一个范围界定的问题,CoffeeScript 在这方面做得非常好,而backbone.js 更进一步。