diff --git a/src/proxies/worker.ts b/src/proxies/worker.ts index da30a736..0d79da8a 100644 --- a/src/proxies/worker.ts +++ b/src/proxies/worker.ts @@ -78,10 +78,16 @@ const WorkerProxy = new Proxy(originalWorker, { } if (url && !isSameOrigin(url)) { + let workerPath = scriptURL // 如果 scriptURL 是跨域的,使用 Blob URL 加载并执行 worker - const script = `import "${scriptURL}";` - const workerPath = urlFromScript(script) - options.type = 'module' + // 应该遵总 worker 的 type 类型。classic worker + if (options.type === 'module') { + const script = `import "${scriptURL}";` + workerPath = urlFromScript(script) + } else { + const script = `importScripts("${scriptURL}");` + workerPath = urlFromScript(script) + } return new Target(workerPath, options) as WorkerInstance } else { // 如果 scriptURL 是同源的,直接使用原生的 Worker 构造函数 diff --git a/src/sandbox/with/window.ts b/src/sandbox/with/window.ts index af20e613..b1dd6d11 100644 --- a/src/sandbox/with/window.ts +++ b/src/sandbox/with/window.ts @@ -26,6 +26,7 @@ import { import { appInstanceMap, } from '../../create_app' +import WorkerProxy from '../../proxies/worker' /** * patch window of child app @@ -87,9 +88,18 @@ function createProxyWindow ( const rawWindow = globalEnv.rawWindow const descriptorTargetMap = new Map() + Object.defineProperty(microAppWindow, 'Worker', { + value: WorkerProxy, + configurable: true, + writable: true, + }) + const proxyWindow = new Proxy(microAppWindow, { get: (target: microAppWindowType, key: PropertyKey): unknown => { throttleDeferForSetAppName(appName) + if (key === 'Worker') { + return WorkerProxy + } if ( Reflect.has(target, key) || (isString(key) && /^__MICRO_APP_/.test(key)) ||