构建coffeescript代码?

时间:2011-05-27 09:42:39

标签: ruby-on-rails-3 coffeescript

在Rails 3.1下,我试图找出如何将一些coffeescript类从我的控制器默认coffeescript文件(home.js.coffee)移到另一个文件中,以便整理一下。< / p>

有谁知道如何将coffeescript文件“包含”到另一个文件中?

5 个答案:

答案 0 :(得分:63)

您要做的是导出功能。例如,如果你从

开始
class Foo
  ...

class Bar extends Foo
  ...

并且您决定将Foo移动到它自己的文件,该文件应该看起来像

class Foo
  ...

window.Foo = Foo

window.Foo = Foo使Foo成为全局),Bar的文件应以Sprockets指令开头

#= require Foo

(假设您已将Foo的文件命名为Foo.js.coffee)。每个文件都独立编译为JS,但Sprockets将确保在Foo之前包含Bar

请注意,作为快捷方式,您可以删除window.Foo = Foo行,而不是写

class window.Foo
  ...

或只是

class @Foo
  ...

定义附加到Foo对象的名为window的类。

答案 1 :(得分:6)

虽然使用window对象作为在代码的不同部分之间共享功能的地方可以很好地工作,但是当您处理大型/复杂的代码库时,它会变得有些难看。此外,您必须手动加载所有依赖项,这也会有点令人沮丧。许多人最终只是在每个请求中加载所有内容,无论该特定页面实际需要什么。

有许多库可以解决这些问题,并使文件之间的导出和导入功能更易于管理。今天比较常见的一个是RequireJS,它是CommonJS AMD specs的一个实现。您可以找到其他库以及它们之间的比较here,并且有一个很好的教程,介绍如何使用Addy Osmani blog上的这些库编写模块化JavaScript - 这也讨论了ES中即将推出的新模块系统。接下来,这也很有趣。

我个人非常喜欢NodeJS's modules system(使用exports对象和require函数),所以我使用node-browserify打包它以便在客户端工作。虽然这不允许像AMD规范那样以异步方式动态加载依赖项,但它允许在客户端和服务器端很好地共享相同的JavaScript代码,这对我来说是一个巨大的奖励(主要是因为我也在服务器端使用NodeJS,所以我不确定对你来说有多重要)并且它可以很好地处理所有依赖关系(因此它们可以同步require() d通过解析JavaScript代码并查找普通require()调用来确定给定脚本运行所需的内容。

答案 2 :(得分:6)

你也可以这样做:

@app = window.app ? {}

app.Foo = Foo

这会使app包含您的所有全局类,而window.app ? {}会确保您只创建一个app

答案 3 :(得分:0)

我不确定这是否直接可行(但有人可以随意纠正我)。

我的理解是在Sprockets合并所有资产之前运行CoffeeScript解释器。由于.coffee文件中的注释没有出现在输出中,并且由于Sprockets使用//=代码注释指令来构建所有内容,因此我认为目前还没有办法在CoffeeScript中创建Sprockets指令。

您仍然可以将您的工作拆分为多个.coffee文件,并利用父“指令”javascript文件来组合各个部分(它可能只包含Sprockets指令,例如库存application.js如何在Rails 3.1中发布)。使用Sprockets //= require_tree指令,您可以拆分您的CoffeeScript并仍然保持您的应用程序相当有条理,但您仍然可以使用简单的“Javascript文件”来管理Sprockets。

This问题可能会更好地解释资产管道。这里的Edge文档中还有一些Sprockets帮助程序:http://edgeapi.rubyonrails.org/classes/ActionView/Helpers/SprocketsHelper.html#method-i-sprockets_javascript_include_tag,但这会将工作推送到您可能变得丑陋的视图中。

希望有所帮助!

答案 4 :(得分:0)

使用cake,您可以定义文件的顺序以及minify等其他自定义步骤

确保指定将所有咖啡文件合并为单个.js输出文件。

https://github.com/jashkenas/coffee-script/wiki/[HowTo]-Compiling-and-Setting-Up-Build-Tools