pla*_*ang 32 coffeescript ruby-on-rails-3
在Rails 3.1下,我试图找出如何将一些coffeescript类从我的控制器默认coffeescript文件(home.js.coffee
)移到另一个文件中,以便整体构建一下.
有谁知道如何将coffeescript文件"包含"到另一个?
Tre*_*ham 63
你想要做的是导出功能.例如,如果你开始
class Foo
...
class Bar extends Foo
...
Run Code Online (Sandbox Code Playgroud)
并且您决定移动Foo
到自己的文件,该文件应该是这样的
class Foo
...
window.Foo = Foo
Run Code Online (Sandbox Code Playgroud)
(在哪里window.Foo = Foo
创建Foo
一个全局),并且Bar
文件应该以Sprockets指令开头
#= require Foo
Run Code Online (Sandbox Code Playgroud)
(假设你已经命名了Foo
's文件Foo.js.coffee
).每个文件都独立编译成JS,但Sprockets将确保Foo
包含在之前Bar
.
请注意,作为快捷方式,您可以删除该window.Foo = Foo
行,而是写入
class window.Foo
...
Run Code Online (Sandbox Code Playgroud)
或者干脆
class @Foo
...
Run Code Online (Sandbox Code Playgroud)
定义一个名为Foo
附加到window
对象的类.
虽然使用window
对象作为在代码的不同部分之间共享功能的地方可以很好地工作,但是当您处理大型/复杂的代码库时,它会变得有些难看.此外,您必须手动加载所有依赖项,这也会有点令人沮丧.许多人最终只是在每个请求中加载所有内容,无论该特定页面实际需要什么.
有许多库可以解决这些问题,并使文件之间的导出和导入功能更易于管理.今天比较常见的一个是RequireJS,它是CommonJS AMD规范的一个实现.你可以在这里找到其他库和它们之间的比较,并且有一个很棒的教程,介绍如何使用这些库在Addy Osmani博客上编写模块化JavaScript - 这也讨论了ES.next中即将推出的新模块系统,这非常有趣太.
我个人非常喜欢NodeJS的模块系统(带有exports
对象和require
功能),所以我使用node-browserify打包它以便在客户端工作.虽然这不允许像AMD规范那样以异步方式动态加载依赖项,但它确实允许在客户端和服务器端很好地共享相同的JavaScript代码,这对我来说是一个巨大的好处(主要是因为我也在服务器端使用NodeJS,所以我不确定对你来说有多重要)并且它require()
通过解析你的JavaScript 来处理好所有依赖关系(所以它们可以同步d)代码并查找普通require()
调用以确定给定脚本运行所需的内容.
你也可以这样做:
@app = window.app ? {}
app.Foo = Foo
Run Code Online (Sandbox Code Playgroud)
这将app
包含所有全局类,并window.app ? {}
确保您只创建一个app
.