goja 运行环境:fetch、XMLHttpRequest 与存储 API
扩展脚本不是跑在浏览器或 Node 里——它运行在 goja(纯 Go 编写的 JavaScript 解释器)上。搞清运行时边界,才知道哪些库能用哪些不能用。
环境边界
- goja 支持绝大部分 ES6+ 语法,少数特性(如 async generator)不支持——脚手架项目预置了 babel,最终编译成 ES5,放手写新语法即可;
- 浏览器与 Node 的 API 一概没有:没有 DOM、没有 fs、没有进程对象。
网络请求:两个可用 API
运行时实现了 XMLHttpRequest 与 fetch 两个 API——基于它们或其封装的第三方库(axios、superagent 等)都能用。网络请求是扩展的核心能力:查询接口、解析页面、拿直链全靠它。
事件上下文怎么用
onResolve 触发时拿到上下文 ctx:从 ctx.req 读请求信息(资源地址、请求头),把解析出的文件列表写进 ctx.res:
gopeed.events.onResolve((ctx) => {
ctx.res = {
name: "example",
files: [
{ name: "index.html", req: { url: "example.com/file" } }
],
};
});
持久化:storage API
gopeed.storage 提供 get/set——存登录 token、用户偏好这类需要跨任务保留的数据:
let token = gopeed.storage.get("token");
if (!token) {
token = await login();
gopeed.storage.set("token", token);
}
日志排障
gopeed.logger 的 debug/info/warn/error 四级输出落到安装目录 logs 下的 extension.log,实时 tail 可查;debug 级别仅开发者模式安装的扩展生效,见脚手架创建扩展项目。
相关阅读
- 清单里 settings 声明的用户输入,运行时通过 storage 读取,见manifest.json 清单详解。