Typescript 如何在 Web Worker 中导入外部模块

Dav*_*len 5 web-worker requirejs typescript

我正在尝试在网络工作者的打字稿中使用外部模块,但遇到了问题。测试示例的所有代码都位于www.windward.net/temp/WebWorkerRequireJs.zip(下面列出了关键代码)。

我想要的打字稿(这在主线程中工作得很好)是:

import myClass = require('my-class');
class WorkerThread {
}
self.onmessage = function (e) {
    console.log("client received message = " + e.data);
    var mc = new myClass.MyClass();
    console.log("worker thread toUpper = " + mc.toUpper("dave"));
    self.postMessage("from client");
}
Run Code Online (Sandbox Code Playgroud)

这会生成以下 javascript,由于未定义定义而失败:

define(["require", "exports", 'my-class'], function(require, exports, __myClass__) {
    var myClass = __myClass__;

    var WorkerThread = (function () {
        function WorkerThread() {
        }
        return WorkerThread;
    })();
    self.onmessage = function (e) {
        console.log("client received message = " + e.data);
        var mc = new myClass.MyClass();
        console.log("worker thread toUpper = " + mc.toUpper("dave"));
        self.postMessage("from client");
    };
});
//# sourceMappingURL=worker-thread.js.map
Run Code Online (Sandbox Code Playgroud)

所以第 1 步,我添加了 importScripts 并调用了这个 .js 文件:

importScripts('../../scripts/require.js');

define(["require", "exports", 'my-class'], function(require, exports, __myClass__) {
    var myClass = __myClass__;

    var WorkerThread = (function () {
        function WorkerThread() {
        }
        return WorkerThread;
    })();
    self.onmessage = function (e) {
        console.log("client received message = " + e.data);
        var mc = new myClass.MyClass();
        console.log("worker thread toUpper = " + mc.toUpper("dave"));
        self.postMessage("from client");
    };
});
//# sourceMappingURL=worker-thread.js.map
Run Code Online (Sandbox Code Playgroud)

这不起作用并给出了错误:

Uncaught Error: Mismatched anonymous define() module: function (require, exports, __myClass__) {
    var myClass = __myClass__;

    var WorkerThread = (function () {
        function WorkerThread() {
        }
        return WorkerThread;
    })();
    self.onmessage =...<omitted>...ch 
Run Code Online (Sandbox Code Playgroud)

然后我将“define”切换为“require”,这有效:

importScripts('../../scripts/require.js');

require(["require", "exports", 'my-class'], function(require, exports, __myClass__) {
    debugger;
    var myClass = __myClass__;

    var WorkerThread = (function () {
        function WorkerThread() {
        }
        return WorkerThread;
    })();
    self.onmessage = function (e) {
        console.log("client received message = " + e.data);
        var mc = new myClass.MyClass();
        console.log("worker thread toUpper = " + mc.toUpper("dave"));
        self.postMessage("from client");
    };
});
//# sourceMappingURL=worker-thread.js.map
Run Code Online (Sandbox Code Playgroud)

这就引出了一个问题 - 我如何让打字稿生成它以便它运行。解决方案是设置一个主 javascript 文件,该文件是初始 Web Worker 应用程序,然后调用打字稿部分?如果是这样,我该如何设置?

或者是以某种方式告诉打字稿编译器从定义更改为要求并插入 importScripts() 的解决方案?

更新:看起来(最好的?)解决方案是主网络工作文件是一个 javascript 文件。它具有 importScripts() 和主打字稿类的要求。您创建该类并从那里运行。此时,使用“定义”的打字稿“导入”就可以了。迄今为止...

bas*_*rat 1

工作文件不会由 AMD 加载程序加载,而是由浏览器加载。因此,您需要突破 AMD 代码生成并自行使用原始“require”调用。

  • 你好; 我还被困在这里。我创建了一个示例项目来展示其基础知识,并发现什么有效,什么无效。但我无法弄清楚如何使用打字稿而不手动编辑它创建的每个 .js 文件。有办法吗?谢谢-戴夫 (2认同)