构建coffeescript代码?

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对象的类.

  • 嘿Trevor,你写了coffeescript PragProg书!很荣幸...... (6认同)
  • 您也可以使用较短的符号`class @ Foo`. (4认同)

she*_*sek 6

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

有许多库可以解决这些问题,并使文件之间的导出和导入功能更易于管理.今天比较常见的一个是RequireJS,它是CommonJS AMD规范的一个实现.你可以在这里找到其他库和它们之间的比较,并且有一个很棒的教程,介绍如何使用这些库在Addy Osmani博客上编写模块化JavaScript - 这也讨论了ES.next中即将推出的新模块系统,这非常有趣太.

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


Kim*_*ho6 6

你也可以这样做:

@app = window.app ? {}

app.Foo = Foo
Run Code Online (Sandbox Code Playgroud)

这将app包含所有全局类,并window.app ? {}确保您只创建一个app.