JS包提供了一个通用接口

359 阅读1分钟

JS

Go Reference

JS包为在Go中运行Javascript提供了一个共同的接口,使其在一致的环境中运行。

例子

V8

package main

import (
	"context"
	"fmt"
	"os"

	"github.com/livebud/js"
	v8 "github.com/livebud/js/v8"
)

func main() {
	vm, _ := v8.Load(&js.Console{
		Log:   os.Stdout,
		Error: os.Stderr,
	})
	defer vm.Close()
	ctx := context.Background()
	vm.Evaluate(ctx, "math.js", `const multiply = (a, b) => a * b`)
	value, _ := vm.Evaluate(ctx, "run.js", "multiply(3, 2)")
	fmt.Println(value)
}

Goja

package main

import (
	"context"
	"fmt"
	"os"

	"github.com/livebud/js"
	"github.com/livebud/js/goja"
)

func main() {
	vm := goja.New(&js.Console{
		Log:   os.Stdout,
		Error: os.Stderr,
	})
	ctx := context.Background()
	vm.Evaluate(ctx, "math.js", `const multiply = (a, b) => a * b`)
	value, _ := vm.Evaluate(ctx, "run.js", "multiply(3, 2)")
	fmt.Println(value)
}

注意:这个包仍然是一个正在进行的工作。请参阅问题,了解需要完成的工作。

目前支持的Javascript虚拟机

目标

  • 可更换的JS VMs:可用的虚拟机各有其优点和缺点。你应该能够根据你的需求来交换虚拟机。
  • 一致的运行时间:对于每一个虚拟机,都应该有一致的、经过良好测试的全局(例如:console,setTimeout,URL ),尽可能与网络的行为相匹配。

非目标

  • 为用户提交的Javascript提供安全的沙盒:为了提供更好的性能,环境在不同的评估中被重复使用。这意味着你可以设置球状物,以便在随后的评估中读取。这种类型的环境不适合于用户提交的代码。
  • 支持非标准的运行时API:目前没有计划添加特定于某些运行时环境的API,如Cloudflare Workers、Deno等。这没有科学依据,但有以下启发:它应该是一个网络API,并在Node.js中可用。
  • 模块导入/导出支持:使用esbuild来实现这一目的。