4

次のようにSinatraで簡単に行うように、CoffeeScriptファイルからJavascriptを自動的に生成する方法を見つけようとしています:

require 'sinatra'
require 'coffee-script'
get '/*.js' do
  name = params[:splat][0]
  file_name = File.join("#{name}.coffee")
  pass unless File.exists?(file_name)
  content_type(:js, :charset => 'utf-8')
  coffee(IO.read(file_name))
end

このようにして、私のコードでは、ファイル.jsしか取得していない場合でも、ファイルが存在するように振る舞うことが.coffeeできました。クライアント側のCoffeeScriptコンパイラを使用するよりも、特定性が低く、バグが少ないです...

4

2 に答える 2

2

ありがとうレウコス!!!

私もRackミドルウェアについて考えましたが、もっと「ラマーズ」な解決策がなかったのではないかと思います(生来のように)。

とにかく、これはうまくいき、素晴らしいです!

コードの修正版は次のとおりです。

require 'coffee-script'

# An attempt to allow Ramaze to generate Js file from coffee files
module Rack
  class BrewedCoffee
    def initialize(app, options = {})
      @app = app
      @lookup_path = options[:lookup_path].nil? ? [__DIR__] : options[:lookup_path]
    end

    def call(env)
      name = env['PATH_INFO']

      # Continue processing if requested file is not js
      return @app.call(env) if File.extname(name) != '.js'

      coffee_name = "#{name[0...-3]}.coffee"

      @lookup_path.each do |p|
        coffee_file = File.join(p, coffee_name)
        next unless File.file?(coffee_file)

        response_body = CoffeeScript.compile(File.read(coffee_file))
        headers = {}
        headers["Content-Type"] = 'application/javascript'
        headers["Content-Length"] = response_body.length.to_s

        return [200, headers, [response_body]]
      end

      @app.call(env)
    end
  end
end

私は物事を少しきれいにして、Ramaze の依存関係を取り除きます。このようにして、純粋な Rack ミドルウェアになります :)。

あなたはそれを呼び出すことができます:

m.use Rack::BrewedCoffee, :lookup_path => Ramaze.options.roots

さようなら、アンドレアス

于 2012-07-04T08:40:04.143 に答える
1

これを処理する最善の方法は、おそらく独自のラック ミドルウェアを作成し、以下のように使用することです。.js呼び出しのたびにファイルをファイルから再構築しないように、おそらく何らかのキャッシュを使用する必要があります.coffee

require 'ramaze'

class BrewedCoffee
  def initialize(app)
    @app = app
  end

  def call(env)
    name = env['PATH_INFO']

    # Continue processing if requested file is not js
    return @app.call(env) if name !~ /\.js$/

    # Caching & freshness checks here...
    # ...

    # Brewing coffee
    name = name.split('.')[0..-2].join('.') + ".coffee"

    Ramaze.options.roots.each do |p|
      file_name = File.join("#{name}.coffee")
      next unless File.exists?(file_name)

      response_body = coffee(IO.read(file_name))
      headers["Content-Type"] = 'application/javascript'
      headers["Content-Length"] = response_body.length.to_s


      [status, headers, response_body]
    end

    @app.call(env)
  end
end


class MyController < Ramaze::Controller
  map '/'

  ...
end

Ramaze.middleware! :dev do |m|
  m.use(BrewedCoffee)
  m.run(Ramaze::AppMap)
end

Ramaze.start

これはすぐにハッキングされ、より多くの愛が必要ですが、アイデアはわかります. そして、おそらく本番環境でこれを行いたくないでしょう。コーヒー関連のものを事前にビルドするだけです。そうしないと、システム管理者とトラブ​​ルになるでしょう :D

于 2012-07-04T07:26:44.363 に答える