如何让编译后的代码在 Worker 中运行(没有 Webpack)?

Posted

技术标签:

【中文标题】如何让编译后的代码在 Worker 中运行(没有 Webpack)?【英文标题】:How to get transpiled code to run in a Worker (without Webpack)? 【发布时间】:2021-11-22 07:15:16 【问题描述】:

我正在使用基于 SystemJS 的 TypeScript 项目,遵循此 example,其代码位于 https://github.com/tekmi/blogging-typescript-with-bundlers/blob/master/systemjs/app.ts

我可以在 TypeScript 中实现一个简单的 Worker,例如从这个example,

// src/worker/simulator.ts
const scope = (self as unknown) as Worker

scope.addEventListener('message', event => 
    console.log(event.data)
    scope.postMessage('pong')
)

它在 SystemJS 环境中运行良好 - 我确保它的代码在 SystemJS 之外 被转译,并按照blog 的建议使用单独的tsconfig.json

但是,一旦我在 Worker 代码中尝试更复杂的东西,即导入/导出某些东西的类,我就会遇到运行代码的障碍。根据转译的格式(tsconfig 中的"module"),我会遇到以下问题:

"module": "ESNext" -> SyntaxError: Cannot use import statement outside a module "module": "CommonJS" -> ReferenceError: exports is not defined 等系统,AMD,存在与这些上下文相关的错误。

调用时已正确加载转译的代码(我在lite-server 的日志中看到它很好)。

我在网页上的按钮的事件代码中调用工作人员:

export function start(this: GlobalEventHandlers, ev: MouseEvent) 
    let worker = new Worker("../worker/simulator.js");
//...

我的结论是转译的工作代码中缺少一些上下文,但我无法弄清楚它是什么。这是我第一次在 TypeScript 中尝试 Workers。

这是我的tsconfig.json src/worker 子项目(这个是为 CommonJS 模块编译配置的):


  "extends": "../generic-tsconfig.json",
  "compilerOptions": 
    "strict": true,
    "target": "ES6",
    "module": "CommonJS",
    // store the webworker transpiled files separately
    "outDir": "../../dist",
    "lib": [
      "ES6",
      "WebWorker"
    ],
  ,
  "include": [
    "../worker/*",
    "../shared/*"
  ]

需要什么才能让(复杂的)Worker 在这种配置下运行?

如果可能,我想避免使用 Webpack,主要是因为我试图了解正在发生的事情。

【问题讨论】:

您可能会在 Web Workers - How To Import Modules 找到一些线索 - 您是否使用 type: module 选项创建您的工人? IE。 new Worker("worker.js", type: "module" ); @SethLutske 你的type: "module" 解决方案有效,至少对"module": "ESNEXT" 有效——如果你想把它写成答案,我很乐意接受。 【参考方案1】:

如 cmets 中所述,如果您希望能够在 web worker 中使用 importexport 之类的模块语法,则需要使用 type: module 选项定义 worker,如下所示:

new Worker("worker.js",  type: "module" );

这将在问题Web Workers - How To Import Modules中进一步讨论

【讨论】:

以上是关于如何让编译后的代码在 Worker 中运行(没有 Webpack)?的主要内容,如果未能解决你的问题,请参考以下文章

visual studio写完程序,编译以后,再改程序,编译器不编译改过后的程序

Sleep() 方法后的代码片段没有被执行

java用eclipse编译运行后的文件保存在哪里呢?

如何在 codedom 编译的代码中调试/中断

[Linux]使用PHP编写Gearman的Worker守护进程

如何不编译使用 TypeScript