この記事はOpal Advent Calendar 2016の18日目の投稿として書いています。
完全に間に合っていません。(今日は12月19日です)
ネタ切れ感満載です。しかたがないのでelectron_opalの続きです。
本家にちまちまPRを送るよりは、フォークして完全に書きかえてしまおうという戦略を取ることにしました。
新しいものを作ろうという理由はいくつかあるのですが、一番大きいのは、opal-viennaに読み込んでいるところです。
わたしとしてはやはり拙作のHyaliteやMeniliteを使いたいところです。そうでなくてもviennaにロックインするのはうれしくありません。
いくつかの修正をほどこして、Opal v0.10.3でオリジナルのものと同等くらいに動くようになりました。(v0.0.1でタグ付けしてます)
(ただし、viennaなどデフォルトでrequireしているものは外しました。)
やったことは以下のとおり
- Opal v0.10.3に合わせ使えなくなったAPIを起きかえた
-
Opal::Processor
=>Opal::Builder
など
-
- ファイルをいくつか分割した。
- electron_opal.rb => rake_task.rb, index.rb, debug_server.rb
- DebugServerなどを直してdebugタスクがちゃんと動くようにした。
- SprocketsをOpalに組みこみのものを使うようにするなど
などなど
今日はDebugServerについてちょっと書きます。
オリジナルのコードは
def env
@env ||= Sprockets::Environment.new
@env
end
Sprocketsの環境を新しく作っています。
コンパイルするだけなら、Sprocketsは必要ありません。実際、Opal::Builder
を使っているbuildタスクはこのenv
に依存していません。
debugタスクもコンパイルする部分と開発用のサーバーとに分けると、コンパイルする部分に関してはenv
を使わないはずです。
なのでこのenv
というメソッド完全に消すことができました。
代りにDebugServerではOpal::Server
を作ることにします。
def initialize(config)
Opal::Config.source_map_enabled = true
@opal = Opal::Server.new do |s|
config.paths.each {|path| s.append_path path }
s.debug = true
end
create_app @opal
end
オリジナルのコードではコンストラクタにenv
を渡していたものをconfig
を渡すように変更しました。
依存が切れてすっきりします。
Sprocketsが必要なところでは、opal.sprockets
を使います。こんな風に
maps_app = ::Opal::SourceMapServer.new(opal.sprockets, maps_prefix)
htmlファイルを生成しているindex.rbもシンプルになります。
def javascript_include_tag
if @debug
Opal::Sprockets.javascript_include_tag(@name, sprockets: @sprockets, prefix: @prefix, debug: true)
else
%{<script src="#{@prefix}#{@name}.js"></script>}
end
end
こうなってくるとハードコードしているhtmlファイルの生成部分も普通にテンプレートを使って生成することができそうです。
次回はそのあたりをやろうと思います。