backend/js チュートリアル

この短いチュートリアルでは、JavaScript バックエンドのパッケージが今何を提供しているか、そしてそれに備えたコードをどう書くかを示します。パッケージは JavaScript ターゲットを示し、モジュールのほかの部分はすでに JavaScript のポリシーとケイパビリティを記述できますが、JavaScript で実行されるものはまだありません。

クイックスタート

パッケージをインポートします。すべてのターゲットでビルドできます。

import {
  "Luna-Flow/luna_thread/backend/js",
}
test "js quick start" {
  inspect(@shared.backend_label(@js.backend_target()), content="javascript")
}

日常的なタスク

ターゲットでバックエンドを選ぶ

実行時にバックエンドを選ぶコードは、各バックエンドパッケージの backend_target を使えます。

fn backend_for(prefer_js : Bool) -> @shared.BackendTarget {
  if prefer_js {
    @js.backend_target()
  } else {
    @shared.native_target()
  }
}

test "select" {
  inspect(@shared.backend_label(backend_for(true)), content="javascript")
}

JavaScript バックエンドが何を受け付けるか確かめる

検証により v1 が JavaScript バックエンドを拒否することがわかるので、ネイティブバックエンドに切り替えられます。

test "rejected" {
  let result = @shared.make_execution_policy(backend=@js.backend_target())
  assert_true(result is Err({ issue: UnsupportedBackendForV1(JavaScript) }))
  let graph = @workflow.Workflow::new("one").add_node(
    @workflow.spawn_node(1, "spawn"),
  )
  inspect(
    @workflow.submit(graph, backend=@js.backend_target()).accepted(),
    content="false",
  )
}

さらに進んで

仕様は、型付き配列のバッファを Node.js アドオンに渡す JavaScript の実現を記述しています。js/ のアドオンは make js-install と make js-build でビルドし、現在は runtimeName しかエクスポートしません。詳しくはアーキテクチャガイドを参照してください。

よくある落とし穴

  • @shared.javascript_policy() を呼ばないでください。v1 では中断します。
  • RuntimeCapabilities::for_backend(JavaScript) は、まだ存在しない非同期とゼロコピーのサポートを宣言しています。

次のステップ

backend/js API に 3 つの関数が載っており、backend/js の設計では、バックエンドより先にパッケージが存在する理由を説明しています。