2

サーバー側にPHP、クライアント側にEmber.jsを使用してプロジェクトを構築しています。

すべてのスクリプトを CoffeScript で、テンプレートを .hbs ファイルに、スタイル用に .scss ファイルを作成しました。今のところ、すべてをコンパイルするために rake-pipeline を使用していますが、いくつか問題があります。

  • 依存関係を整理する方法
  • 他のファイルにスクリプトを含める方法
  • スクリプトの順序を決定する方法

今のところ、最終的な .js ファイルでスクリプトを並べ替えるためのハードコード AssetFile がありますが、アプリがより複雑になり、一部のファイルは成長してより多くのファイルに分割する必要がありますが、言及する前に問題があります。

AssetFile

output BUILD_DIR
input SRC_DIR do
  match '**/*.handlebars' do
    handlebars :precompile => true
    concat '0.js'
  end

  match '**/lib/*.coffee' do
    coffee_script
    concat '1.js'
  end
  match '**/app.coffee' do
    coffee_script
    concat '2.js'
  end
  match '**/controller/*.coffee' do
    coffee_script
    concat '3.js'
  end
end

私のプロジェクトのレイアウトは

Resources/
   assets/
      js/         # Are like my vendors (jquery, ember, etc...)
      images/     # i copy this without process
      styles/     # Here are .scss and .sass files
   scripts/
      templates/  # It's a directory tree with files .hbs 
      controller/ # Dirs with arbitrary names
      lib/
      ...
      main.coffee # main point, ej: App = Rkmax.App.create();App.initialize();

主な問題は、concat .js ファイルが coffee コンパイラによって生成されたときに正しい順序を与えることであることがわかります。レールでいくつかのプロジェクトを見て、require.coffe ファイル内の文を使用していますが、rake-pipeline にこの文を理解させる方法がわかりません。 .

4

2 に答える 2

0

しばらく探した後。rakepipeline の代わりに使用することにしました。Sprockets に、必要なものすべてをコンパイルする同様のシステムがあります。

Gemfile

gem 'sprockets'
gem 'sprockets-sass'
gem 'sass'
gem 'coffe-script'

レーキファイル

require 'sprockets'
require 'logger'
require 'fileutils'
require 'pathname'

task :compile => :clean do
    sprockets = Sprockets::Environment.new(ROOT)

    sprockets.append_path SOURCE_DIR.to_s

    %w( app.js vendor.s template.js ).each do |bundle|
        assets = sprockets.find_asset(bundle)
        ext = bundle.split(".")[1]
        name = assets.pathname.basename(assets.pathname.extname)
        FileUtils.mkpath BUILD_DIR.join(ext)
        assets.write_to BUILD_DIR.join(ext, "#{name}.#{ext}")    
    end
end

スプロケットには、次のような「ディレクティブ プロセッサ」があります。

  • 必要とする
  • 含む
  • require_self

依存関係を簡単に整理できます。唯一のことは、デフォルトを処理しなかったこと.handlebarsですが、簡単に書きましたhandlebars_template.rb

handlebars_template.rb

require 'tilt'
require 'json'

module Sprockets
  class HandlebarsTemplate < Tilt::Template
    self.default_mime_type = 'application/javascript'    

    def prepare
    end

    # Compile template data
    def evaluate(scope, locals, &block)
      "Ember.TEMPLATES['#{scope.logical_path.split("/")[1..-1].join("/")}']=Ember.Handlebars.compile(#{data.to_json});\n"
    end
  end
end

適切な場所に登録すれば出来上がり!テンプレートを処理する

register_engine 'handlebars', ::Sprockets::HandlebarsTemplate
register_engine 'hbs',        ::Sprockets::HandlebarsTemplate
于 2012-10-21T00:20:50.130 に答える