在Rails 3.1下,我试图找出如何将一些coffeescript类从我的控制器默认coffeescript文件(home.js.coffee
)移到另一个文件中,以便整理一下。< / p>
有谁知道如何将coffeescript文件“包含”到另一个文件中?
答案 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