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",
  )
}

进阶

规范描述了一种 JavaScript 实现,它把类型化数组缓冲区传给 Node.js 插件。js/ 中的插件通过 make js-install 和 make js-build 构建,目前只导出 runtimeName;架构指南对它做了描述。

常见陷阱

  • 不要调用 @shared.javascript_policy():它在 v1 中会中止。
  • RuntimeCapabilities::for_backend(JavaScript) 声明了尚不存在的异步和零拷贝支持。

下一步

backend/js API 列出了这三个函数,backend/js 设计解释了为什么这个包先于后端而存在。