22

我有一个脚本http://localhost/js/foo.js,需要从文件中生成一个 Web Worker http://localhost/js/fooWorker.js。我以为我可以做这样的事情:

var worker = new Worker('fooWorker.js')

但是,这会导致 404 错误,因为浏览器无法找到http://localhost/fooWorker.js. 我的印象是工作路径是相对于生成工作的脚本解析的,所以我不应该能够在同一目录中指定另一个 .js 文件的名称而不必提供绝对路径吗?难道我做错了什么?

4

4 回答 4

8

来自http://www.w3.org/TR/workers/

当调用 Worker(scriptURL) 构造函数时,用户代理必须运行以下步骤:

  1. 在调用该方法时,解析相对于入口脚本的基本 URL的 scriptURL 参数。
于 2012-09-14T02:12:18.267 回答
3

实际上,它应该是相对于嵌入的文档路径

例如,

我有

pathDoc\docA.html
js\b.js
js\worker\c.js

那么代码应该是

var worker = new Worker('..\js\worker\c.js')
于 2015-07-03T20:52:45.910 回答
1

请注意,您仍然可以使用 获取 worker 中的脚本 url,self.location并将其添加到路径中,以使它们相对于 worker 脚本而不是 html 基本 url。

const workerUrl = location + '';
const basePath = workerUrl.replace(/\/[^/]+$/, '/');

self.importScripts(basePath + '/fooWorker.js');

顺便说一句,如果您通过 blob 包含您的工作人员,您仍然可以通过#哈希参数传递元信息,例如它的 url。

于 2020-06-23T21:05:01.343 回答
0

使用import.meta.url,您应该能够让它像相对路径一样工作。

var worker = new Worker(new URL('./fooWorker.js', import.meta.url));
于 2022-01-11T03:49:36.773 回答