LoginSignup
2

More than 5 years have passed since last update.

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

Posted at

この記事は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ファイルの生成部分も普通にテンプレートを使って生成することができそうです。
次回はそのあたりをやろうと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2