typescript 如何在Web Worker中导入模块?

pkln4tw6  于 2023-01-21  发布在  TypeScript
关注(0)|答案(1)|浏览(607)

我正在使用Node.js + TypeScript开发项目。
启动main. ts后,它返回:

import { parentPort } from 'worker_threads';
^^^^^^

SyntaxError: Cannot use import statement outside a module
  • 主文件. ts *
import { Worker } from 'worker_threads';

const worker = new Worker('./src/Workers/worker.ts');

worker.on('message', (data) => {
    console.log(data);
})

worker.postMessage('start');
  • 工人. ts *
import { parentPort } from 'worker_threads';
import { broadcastService } from '../services/BroadcastService'

parentPort?.on('message', async (data: string) => {
    console.log(data);
    const currentBroadcasts = await broadcastService.startBroadcastsChecking();
    parentPort?.postMessage(currentBroadcasts);
})

尝试:
1.将文件扩展名更改为.js(* worker. ts-〉worker. js *)

  1. new Worker('./src/Workers/broadcastsCheckingWorker.ts', { type: 'module' } as any)(* 主文件. ts *)
import { parentPort } from 'worker_threads';
^^^^^^

SyntaxError: Cannot use import statement outside a module
  1. importScripts('../services/BroadcastService')(* 工人. js/工人. ts *)
importScripts('../services/BroadcastService')
^
ReferenceError [Error]: importScripts is not defined

1.将"type": "module"添加到package.json

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for C:\Users\Administrator\Desktop\lives-downloader-bot\src\server.ts
h6my8fg2

h6my8fg21#

使用Web Workers时,JavaScript文件在不同的上下文中执行,无法访问主线程的全局作用域。
因此,您不能在Web工作器中使用import语句,而应该使用require语句。
在主.ts文件中,应更改以下行

import { Worker } from 'worker_threads';

const { Worker } = require('worker_threads');

在worker.ts文件中,应更改以下行

import { parentPort } from 'worker_threads';
import { broadcastService } from '../services/BroadcastService'

const { parentPort } = require('worker_threads');
const { broadcastService } = require('../services/BroadcastService');

另外,确保worker.ts使用tsc或其他转换器转换为javascript。
Web Workers依赖于浏览器中没有的require函数,所以如果你打算在浏览器端使用这个函数,你应该使用其他的库比如worker-loader或者webpack来加载worker。

相关问题