如何避免在 Deno Workers 中缓存源代码
How to avoid cached source code in Deno Workers
下午好,我正在开发一个基于 Deno Workers 的 javascript 代码执行环境。我还有一个 Oak Web 服务器,它处理脚本中的代码更改请求以及这些请求的编译和执行。
当我请求执行一个脚本(例如console.log ())时问题就开始了,后来我修改了上述代码,当再次尝试执行该脚本时,Deno 执行了更改前的 Worker,只有在我重新启动 Oak 服务器后才考虑更改。
export class Runner {
private task: Task;
constructor(task: Task) {
this.task = task;
}
async run() {
new Worker(
new URL(await joinPath(`tasks/${this.task.id}/output.js`), import.meta.url).href,
{ type: "module" }
);
}
}
Runner class 负责初始化 Worker,对于每个执行请求,都会生成一个新的 Runner 实例,因此也会生成一个 Worker。
// oak router
router.get("/api/tasks/:id/run", async ctx => {
const id: any = ctx.params.id;
if (!id) ctx.throw(500);
const task: Task = await get(id);
const compiler: Compiler = new Compiler(task);
const runner: Runner = new Runner(task);
await compiler.compile();
await runner.run();
ctx.response.body = 'ok';
});
这是处理请求的函数,进而实例化Runnerclass。
非常感谢您。
这里有一个开放的issue,缓存将在未来动态加载时失效。
现在的解决方法是在 URL 中添加一个查询字符串。并在每次调用 new Worker
.
时更改它
let v = 0;
export class Runner {
private task: Task;
constructor(task: Task) {
this.task = task;
}
async run() {
new Worker(
new URL(await joinPath(`tasks/${this.task.id}/output.js?v=${v++}`), import.meta.url).href,
{ type: "module" }
);
}
}
下午好,我正在开发一个基于 Deno Workers 的 javascript 代码执行环境。我还有一个 Oak Web 服务器,它处理脚本中的代码更改请求以及这些请求的编译和执行。
当我请求执行一个脚本(例如console.log ())时问题就开始了,后来我修改了上述代码,当再次尝试执行该脚本时,Deno 执行了更改前的 Worker,只有在我重新启动 Oak 服务器后才考虑更改。
export class Runner {
private task: Task;
constructor(task: Task) {
this.task = task;
}
async run() {
new Worker(
new URL(await joinPath(`tasks/${this.task.id}/output.js`), import.meta.url).href,
{ type: "module" }
);
}
}
Runner class 负责初始化 Worker,对于每个执行请求,都会生成一个新的 Runner 实例,因此也会生成一个 Worker。
// oak router
router.get("/api/tasks/:id/run", async ctx => {
const id: any = ctx.params.id;
if (!id) ctx.throw(500);
const task: Task = await get(id);
const compiler: Compiler = new Compiler(task);
const runner: Runner = new Runner(task);
await compiler.compile();
await runner.run();
ctx.response.body = 'ok';
});
这是处理请求的函数,进而实例化Runnerclass。
非常感谢您。
这里有一个开放的issue,缓存将在未来动态加载时失效。
现在的解决方法是在 URL 中添加一个查询字符串。并在每次调用 new Worker
.
let v = 0;
export class Runner {
private task: Task;
constructor(task: Task) {
this.task = task;
}
async run() {
new Worker(
new URL(await joinPath(`tasks/${this.task.id}/output.js?v=${v++}`), import.meta.url).href,
{ type: "module" }
);
}
}