Ramaze + CoffeeScript: возможно ли автоматически генерировать Javascript с помощью Ramaze?
Я пытаюсь найти способ автоматически генерировать Javascript из файла CoffeeScript, как это можно было бы легко сделать в Sinatra следующим образом:
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...
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
Пока Андреас
Вероятно, лучший способ справиться с этим - написать собственное промежуточное программное обеспечение для стойки и использовать его, как показано ниже. Вам, вероятно, нужно использовать какое-то кэширование, чтобы не перестраивать свой .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