【问题标题】:How can typescript import external modules in a web worker打字稿如何在网络工作者中导入外部模块
【发布时间】:2014-04-23 06:14:38
【问题描述】:

我正在尝试在网络工作者的 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");
}

这会生成以下由于未定义而失败的 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

所以第 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

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

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

    var WorkerThread = (function () {
        function WorkerThread() {
        }
        return WorkerThread;
    })();
    self.onmessage =...<omitted>...ch 

然后我将“定义”切换为“要求”,这很有效:

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

这导致了这个问题 - 我如何让 typescript 生成它以便它运行。解决方案是设置一个主要的 javascript 文件,该文件是初始的 web worker 应用程序,然后调用 typescript 部分?如果是这样,我该如何设置?

或者以某种方式告诉 typescript 编译器从 define 更改为 require 并插入 importScripts() 的解决方案?

更新: 看起来一个(最好的?)解决方案是主 web worker 文件是一个 javascript 文件。这具有 importScripts() 和主要打字稿类的要求。你创建了那个类,它从那里运行。那时打字稿“导入”会导致“定义”所有工作。到目前为止...

【问题讨论】:

    标签: requirejs typescript web-worker


    【解决方案1】:

    工作文件不会由 AMD 加载程序加载,而是由浏览器加载。所以你需要打破 AMD 代码生成并自己使用原始的“require”调用。

    【讨论】:

    • 这是否意味着我不能在 web worker 中使用 import 语句?如果是这样,那将是一个巨大的问题。或者我可以将主文件设置为 .js 文件,在该文件中配置 requireJS(如何?),然后我可以进行导入?谢谢 - 戴夫
    • 你可以使用导入,看看:Optional Module Loading and Other Advanced Loading Scenarios 这里:typescript.codeplex.com/… 但你仍然需要原始的 require 调用
    • 嗨;我仍然被困在这里。我创建了一个示例项目来展示它的基础知识,并找到了哪些有效和无效。但是我不知道如何在不手动编辑它创建的每个 .js 文件的情况下使用打字稿。有办法吗?谢谢 - 戴夫
    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2012-12-28
    • 2017-04-11
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多