2011-05-27 53 views
32

在Rails的3.1,我試圖找出如何移動的幾個班的CoffeeScript從我的控制器默認的CoffeeScript文件(home.js.coffee)到另一個文件了,以結構整個一點點。構造咖啡代碼?

有誰知道如何「包括」一個CoffeeScript的文件到另一個?

回答

62

你想要做什麼是出口功能。舉例來說,如果你開始與

class Foo 
    ... 

class Bar extends Foo 
    ... 

,你決定你移動Foo到自己的文件,該文件應該像

class Foo 
    ... 

window.Foo = Foo 

(其中window.Foo = Foo使得Foo一個全球性的),和Bar的文件應該以Sprockets指令開始

#= require Foo 

(假設您已經命名爲Foo的文件Foo.js.coffee)。每個文件獨立編譯爲JS,但鏈輪將確保Bar之前包含Foo

需要注意的是,作爲一種快捷方式,你可以擺脫window.Foo = Foo線,而是寫

class window.Foo 
    ... 

或者乾脆

class @Foo 
    ... 

定義一個名爲Foo類附加到的window目的。

+1

偉大的答案Trevor,非常感謝。 – plang 2011-05-30 05:56:18

+6

嘿特雷弗,你寫了咖啡書PragProg書!這是一種榮譽... – plang 2011-05-30 12:14:39

+0

沒有概率,這是我的所爲。 :) – 2011-05-30 17:05:43

0

我不知道這是直接可能(但有人隨時糾正我)。

我的理解是,CoffeeScript的解釋程序運行鏈輪合併您的所有資產之前。由於.coffee文件中的註釋不會出現在輸出中,並且由於Sprockets使用//=代碼註釋指令來構建所有內容,所以我認爲目前還沒有辦法在CoffeeScript中創建Sprockets指令。

你仍然可以將你的工作分解成多個.coffee文件,並利用一個父指令的javascript文件來組合這些部分(它可能只包含Sprockets指令,就像股票application.js在Rails 3.1中發佈的一樣) 。使用Sprockets //= require_tree指令,你可以拆分你的CoffeeScript,並且仍然保持你的應用程序的組織性,但是你仍然會在管理Sprockets的時候留下純樸的Javascript文件。

This問題可能更好一點解釋資產的管道。在這裏的邊緣文檔中還有一些Sprockets幫助器:http://edgeapi.rubyonrails.org/classes/ActionView/Helpers/SprocketsHelper.html#method-i-sprockets_javascript_include_tag,但是這會將工作推到可能變得很難看的視圖中。

希望有幫助!

+0

不知道鏈輪是如何工作的,但是'/ * * /'的評論保持在CoffeeScript的輸出。 '/ * // = ... * /'會起作用嗎? – 2011-05-28 04:40:56

+1

在CoffeeScript代碼中,您可以簡單地使用'#= ...' – 2011-05-28 13:38:24

6

當使用window對象共享你的代碼的不同部分之間的功能可以工作得很好的地方,它可以當你在一個大/複雜的代碼庫工作得有點醜陋。此外,你必須手動加載所有的依賴關係,這也會讓人有些沮喪。許多人只是最終在每個請求中加載所有內容,而不管該特定頁面實際需要什麼。

有很多庫試圖解決這些問題,並使文件之間的導出和導入功能更易於管理。今天比較常見的一個是RequireJS,它是CommonJS AMD specs的執行。您可以找到其他庫和它們之間的比較here,並且有一篇關於如何使用這些庫在Addy Osmani blog上編寫模塊化JavaScript的精彩教程 - 其中還討論了ES.next中即將推出的新模塊系統,這也很有趣。

我個人很喜歡NodeJS's modules system(與exports對象和require功能),所以我用node-browserify將它打包了對客戶端的工作壓力太大。雖然這不允許像AMD規範那樣以異步方式動態加載依賴項,但它確實允許在客戶端和服務器端很好地共享相同的JavaScript代碼,這對我來說是一個巨大的好處(主要是因爲我與服務器端的NodeJS一起工作,所以我不確定這對你有多重要),並且通過解析你的代碼,它可以很好地將所有的依賴關係打包在一起(因此它們可以同步到require() d) JavaScript代碼並尋找簡單的require()調用來確定給定腳本運行所需的內容。

+0

感謝您的回答! – plang 2011-11-29 07:18:55

6

你也可以做這樣的:

@app = window.app ? {} 

app.Foo = Foo 

這將使app包含所有全局類和window.app ? {}可以確保您只會造成一個app