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。