Posted at
OpalDay 18

OpalでElectronのアプリをつくる(その4)

More than 1 year has passed since last update.

この記事は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を作ることにします。


lib/electron_opal/debug_server.rb

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もシンプルになります。


lib/electron_opal/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ファイルの生成部分も普通にテンプレートを使って生成することができそうです。

次回はそのあたりをやろうと思います。