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

  • 0
    いいね
  • 0
    コメント

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

    この投稿は Opal Advent Calendar 201618日目の記事です。