【问题标题】:What is a good way to separate concerns with CoffeeScript and Ruby on Rail's asset pipeline?用 CoffeeScript 和 Ruby on Rails 资产管道分离关注点的好方法是什么?
【发布时间】:2011-09-27 11:55:59
【问题描述】:

TLDR:

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

长版:

我有一些 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?)

hello.js.coffee

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

complicated.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

secondary.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。

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

【问题讨论】:

    标签: ruby-on-rails coffeescript ruby-on-rails-3.1 asset-pipeline


    【解决方案1】:

    对于开始使用 CoffeeScript 的 Rails 开发人员来说,这是一个常见问题。参见,例如:

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

    【讨论】:

      【解决方案2】:

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

      root = global ? window
      root.exportableFunction = exportableFunction
      root.MY_GLOBAL_SETTING = some: 'Setting'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-10
        • 2018-12-26
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 1970-01-01
        相关资源
        最近更新 更多