Rails 3.1にスプロケットを備えたドライのモジュラーコフィースクリプトをどのように書き込みますか?

StackOverflow https://stackoverflow.com/questions/6815957

質問

私は賢明なJavaScriptを書こうとする初期段階にいます。グローバルをできるだけ避けるために、基本的にすべてをアプリケーションの名前で名前を付けたいと思っていますが、それでもその場所で宣言された機能にアクセスする方法を教えてください。ただし、関数定義では非常に冗長になりたくありません。

私の理想的なコーヒースクリプトは次のようなものです:

class @MyApp
  @myClassMethod = ->
    console.log 'This is MyApp.myClassMethod()'

  class @Module1
    @moduleMethod = ->
      console.log 'This is MyApp.Module1.moduleMethod()'

あなたは写真を手に入れます。このようにして、私は書く必要を避けます MyApp.Module.submoduleMethod = -> ネームペースされた関数を適切に定義するたびに - @ そして物事を定義します 内部 私のクラスの定義は、物事を素晴らしく、短くしています。

これは、機能性を複数のCoffeeScriptファイルに分割したいまで、すべて順調に進んでいます。それから私が本当に欲しいのはこのようなものです:

// application.js
class @MyApp
  //= require 'module1'
  //= require 'module2'

// module1.js
class @Module1
  @moduleMethod = ->
    console.log 'This is STILL MyApp.Module1.moduleMethod()'

Sprocketsがこれを行うことができるようには見えません。

コンテナファイルの適切な場所にcoffeescriptファイルを要求する賢明な方法はありますか?または、コーヒースクリプト、スプロケット、レール3.1を使用して個別のファイルに分割されたモジュラーコードの書き込みにアプローチする別の方法?

役に立ちましたか?

解決

コードで使用するモジュールソリューションがあります。

以下のようなモジュールを定義します

@module "foo", ->
    @module "bar", ->
        class @Amazing
            toString: "ain't it"

Amazingが利用可能です

foo.bar.Amazing

@moduleヘルパーの実装はです

window.module = (name, fn)->
  if not @[name]?
    this[name] = {}
  if not @[name].module?
    @[name].module = window.module
  fn.apply(this[name], [])

CoffeescriptのWebサイトはこちらに書かれています。

https://github.com/jashkenas/coffee-script/wiki/easy-modules-with-coffeescript

他のヒント

Module1.jsをAS-ISに保ち、Application.jsを次のようにします。

//= require 'module1'

class @MyApp
  ...

  @Module1 = Module1

あなたが作ったのでこれは機能します Module1 グローバル(宣言 class @Module1 執筆と同等です @Module1 = class Module1, 、 と @ に指差す window その文脈で)、および内部 class @MyApp 体、 @ クラス自体を指します。

お望みならば Module1それだけ グローバルの財産になります MyApp クラスが添付された後、ラインを追加できます

delete window.Module1

これは、私がSprocketsを使用してCoffeescriptを管理するために使用するモジュラーパターンです(Rails 4も使用しています):

  # utils.js.coffee

  class Utils
    constructor: ->

    foo: ->
      alert('bar!!!')

    # private methods should be prefixed with an underscore
    _privateFoo: ->
      alert('private methods should not be exposed')

  instance = new Utils()

  # only expose the methods you need to.
  # because this is outside of the class,
  # you can use coffee's sugar to define on window

  @utils = foo: instance.foo

  # otherscript.js.coffee 

  //= require utils
  class OtherScript
    constructor: ->
      @utils.foo()         # alerts bar!!!
      @utils._privateFoo() # undefined method error

このアプローチの不利な点の1つは、ウィンドウでオブジェクトを公開していることです。モジュールローダーを追加するか、モジュールの周りに新しいES構文の一部を採用することは、ニーズに応じて優れた代替手段になる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top