Rails中的共享JS(咖啡)

如果我想在app / assets / javascript下的不同文件之间共享一些JavaScript函数,那么组织目录结构的最佳方法是什么?

假设我有shared.js.coffee

sharedFunction = -> 'Hello ' 

现在,我如何在其他地方使用它? 就像这里一样,在welcome.js.coffee中

 welcome = (name) -> sharedFunction() + name 

如何才能首先加载 shared.js.cofee

我试着把它放在application.js的最开头,但它没有改变任何东西。 似乎共享文件加载时间太长, 欢迎管理开始执行并注意到未定义sharedFunction。

application.js ,首先加载共享:

 //= require shared //rest of code 

并且在共享中,如果必要的话,使您的变量可以全局访问:

 @sharedFunction = -> 'Hello ' 

注意它的一个坏习惯也有这样的全局变量,至少试着将它们保存在命名空间中。

我是这样做的:

  • 确保在其他任何事情之前需要application.js中的文件,特别是在require_tree之前
  • 导出函数(在我的例子中是一个类,所以它是命名空间)

示例:(假设我们在同一级别有application.js和shared.js.coffee)

的application.js

 //= require ./shared //= require_tree . 

shared.js.coffee

 class MyNamespace @mySharedFunc: () -> doSomething() root = exports ? this root.MyNamespace = MyNamespace 

您现在可以通过以这种方式引用它来轻松访问其他coffeescript文件中的函数MyNamespace.mySharedFunc()

PS

关于导出的神秘之处在这个stackoverflow问题中得到了很好的解释: 如何在CoffeeScript中定义全局变量?

基本上以前加载的函数可以在以后使用。 但在这种情况下,你的function不起作用的原因很简单:你忘了执行它。

只需更换

 sharedFunction + name 

 sharedFunction() + name 

它已经完成了。

最好的只是包含一个JS文件。 如果您的资产管道知道如何将它们粘贴在一起,您可以在不同的资产之间拆分它,但不如将不同的JavaScript发送到不同的页面。 发送一个更大的文件似乎违反直觉,特别是对于每个页面,但是缓存会使这个问题发生变化:你的JS文件应该只加载一次。 这也意味着您可以从任何页面访问所有function。