0

TLDR:

在 RoR 中,如何将多个 CoffeeScript 文件合并为一个 JS 文件,所有这些文件都在同一个匿名函数块下?

长版:

我有一些 CS 文件将为 RoR Web 应用程序的一部分加载。我想知道:用 CoffeeScripts 和 Ruby on Rail 3.1 的资产管道分离关注点的好方法是什么?

让我们使用以下作为示例代码:

main.js.coffee

window.MyApp = {} # to escape the CoffeeScript anonymous function block
# (I like the anonymous function block because it protects my other

MY_GLOBAL_SETTING = "world!"
$.click "#my_button" myApp.sayHello
# (I could use something like goog.bind here instead of using myApp. Any suggestions? Fat arrow?)

你好.js.coffee

MyApp.sayHello = sayHello () ->
  doComplicatedStuff()
  alert("Hello #{ MY_GLOBAL_SETTING }")

复杂的.js.coffee

doComplicatedStuff = () ->
  # some really complicated algorithm, for example
  true

我的资产目录结构如下:

assets/
  application.js
  application/
    # javascript that gets used with the main application
  secondary_page.js
  secondary_page/
    complicated.js.coffee
    hello.js.coffee
    main.js.coffee

二级.js

//= require secondary_page/main.js.coffee
//= require secondary_page/complicated.js.coffee
//= require secondary_page/hello.js.coffee

作为构建过程的一部分,我曾经将文件与 CoffeeScript 一起编译,但现在我想改用资产管道。我正在喝 RoR 3.1 酷爱!哈哈,说真的,资产管道看起来很棒。

我遇到的问题是 secondary.js 如下所示:

(function() {
  // main.js
).call(this);
(function() {
  // complicated.js
).call(this);
(function() {
  // hello.js
).call(this);

这可以防止局部变量在整个代码之间共享。MY_GLOBAL_SETTING 和 doComplicatedStuff 不能用于 sayHello。

所以我该怎么做?如果不再次引入我自己的自定义编译步骤,我想不出一个好方法。

4

2 回答 2

2

这是开始使用 CoffeeScript 的 Rails 开发人员的常见问题。参见,例如:

解决方案比比皆是。最简单的方法是在您希望在特定文件之外可见的变量声明前加上@,因为this将指向window每个文件的最外层上下文,并x指向未定义window.x本地x的时间。

于 2011-07-04T19:13:43.830 回答
0

可能最好的方法是将它们留在自己的匿名范围内,但导出您需要从其他模块访问的各个功能。从 Trevor Burnham 的Coffeescript book中,他建议您这样做(适用于节点和浏览器):

root = global ? window
root.exportableFunction = exportableFunction
root.MY_GLOBAL_SETTING = some: 'Setting'
于 2011-07-03T17:46:20.387 回答