Rails中的共享JS(Coffee)

Shared JS (Coffee) in Rails

本文关键字:Coffee JS 共享 Rails      更新时间:2023-09-26

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

假设我有共享的.js.coffee

sharedFunction = ->
  'Hello '

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

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

如何使shared.js.cofee始终首先加载

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

我是这样做的:

  • 确保您需要application.js中的文件,尤其是在require_tree之前
  • 导出函数(在我的例子中是一个类,所以它是按名称命名的)

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

application.js

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

共享.js.coffee

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

现在,您可以通过以下方式引用MyNamespace.mySharedFunc() ,在其他coffeescript文件中轻松访问该函数

p.S.

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

application.js中,首先加载共享:

//= require shared
//rest of code

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

@sharedFunction = ->
  'Hello '

请注意,拥有这样的全局变量也是一种糟糕的做法,至少要尝试将它们保留在名称空间中。

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

只需更换

sharedFunction + name

sharedFunction() + name

它完成了。

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