从具有相对路径的模块中引用网络工作者

Reference a web-worker from a module with a relative path

长话短说:我有一个模块 baz.ts 和一个 web-worker 脚本 worker.ts 在同一个文件夹中彼此相邻,但是当我引用时 worker 不会加载它具有来自同一文件的相同相对路径(对于工作人员,我显然正在加载 js 文件)。模块编译为 AMD 语法。

我有以下文件夹布局:

MyApp
|-- tests
|   `-- test-a
|       |-- test.html
|       `-- test.ts
`-- lib
    |-- foo.ts
    `-- foo
        |-- 
        |-- bar.ts   <-- 'bar/worker' loaded here
        `-- bar
            |-- baz.ts
            `-- worker.ts

foo.ts, bar.ts, baz.ts 是模块, foo.tstests/test-a/test.ts 中导入,相邻 使用]test.html(这是代码运行的地方)。其余的依赖项很容易通过文件夹布局可视化:foo.ts imports bar.ts,这又会导入 baz.ts 并从 worker.ts 创建一个工人——更准确地说,从编译的 .js 输出:

bar.ts

import {Baz} from "./bar/baz";

export class Bar {
    constructor() {
        var worker = new Worker("./bar/worker.js"); // same path as the above import
        // ...
    }
}

查看 baz.tsworker.ts 如何位于相对于 [=29= 的同一文件夹中]bar.ts(相应的 .js 文件已就地创建),但工作程序未加载。它尝试加载 url tests/foo/bar/worker.js.

我怎样才能做到这一点,以便我可以使用与导入它旁边的模块相同的相对路径来引用 worker?

很奇怪。

通常您正在发出的请求(或资源加载)是相对于加载的 html 文件的 url 而言的,但如果是这样的话(正如我在评论中所写) 它应该尝试从 tests/test-a/bar/worker.js.

加载 worker

你可以做的是为你的工人建立一个绝对 url 并使用它,比如:

let url = new URL("lib/foo/bar.js", window.location.origin);
let worker = new Worker(url.toString());

可能不理想,但应该可以。