0

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 には使用できません。

それで...どうすればいいですか?独自のカスタム コンパイル手順を再度導入せずに、良い方法は考えられません。

4

2 に答える 2

2

これは、CoffeeScript を使い始めた Rails 開発者にとってよくある質問です。たとえば、次を参照してください。

解決策はたくさんあります。最も簡単な方法は、特定のファイルの外側に表示したい変数宣言の前に を付けることです@。これは、が各ファイルの最も外側のコンテキストをthis指し、ローカルが定義されていない場合に指すためです。windowxwindow.xx

于 2011-07-04T19:13:43.830 に答える
0

おそらくこれを行う最善の方法は、それらを独自の匿名スコープのままにし、アクセスする必要がある個々の関数を他のモジュールからエクスポートすることです。Trevor Burnham のCoffeescript bookから、彼はこれを行うことをお勧めします (これはノードとブラウザーで動作します)。

root = global ? window
root.exportableFunction = exportableFunction
root.MY_GLOBAL_SETTING = some: 'Setting'
于 2011-07-03T17:46:20.387 に答える