TLDR:
RoR で複数の CoffeeScript ファイルを 1 つの JS ファイルに結合するにはどうすればよいでしょうか?すべて同じ匿名関数ブロックの下にあります。
長いバージョン:
RoR Web アプリの一部として読み込まれる CS ファイルがいくつかあります。私が疑問に思っているのは、CoffeeScripts と Ruby on Rail 3.1 のアセット パイプラインの問題を分離する良い方法は何でしょうか?
以下をサンプルコードとして使用しましょう。
main.js.コーヒー
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.コーヒー
MyApp.sayHello = sayHello () ->
doComplicatedStuff()
alert("Hello #{ MY_GLOBAL_SETTING }")
複雑な.js.コーヒー
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
セカンダリ.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 には使用できません。
それで...どうすればいいですか?独自のカスタム コンパイル手順を再度導入せずに、良い方法は考えられません。