** worker.js worker线程脚本文件**
/* eslint-disable no-restricted-globals */
const workercode = () => {
//接受 index 发送过来的数据
self.onmessage = function (e) {
console.log("Worker received from main:", e.data);
//模拟数据大量计算
let i = 0;
let res = 0;
while (i < e.data) {
res += i;
i++;
}
//向 index 线程发送数据
self.postMessage(res);
};
};
// 把脚本代码转为string
let code = workercode.toString();
// 对字符串进行分割,取到worker执行的脚本
code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));
// 将字符串转换为Blob URL
const blob = new Blob([code], { type: "application/javascript" });
//创建一个字符串,其中包含表示参数中给定对象的 URL
const worker_script = URL.createObjectURL(blob);
export default worker_script;
** index.js 主线程**
import { useEffect, useState } from "react";
//引入 worker 线程脚本
import worker_script from "./worker.js";
const Demo = () => {
const [workerInput, setWorkerInput] = useState(100000);
const [workerResult, setWorkerResult] = useState();
//模拟大量 UI 渲染
const [list, setList] = useState(Array(1000).fill("li 渲染"));
useEffect(() => {
//创建一个worker线程
const worker = new Worker(worker_script);
//向 worker 线程发送数据
worker.postMessage(workerInput);
//接受 worker 发送过来的数据
worker.onmessage = function (event) {
setWorkerResult(event.data);
console.log("Main received message", event.data);
};
return () => {
//关闭worker线程
worker.terminate();
};
});
return (
<>
<h2>向 worker 传入的数据:{workerInput}</h2>
<h2>worker 返回的数据:{workerResult}</h2>
<ul>
{list.map((item, index) => (
<li key={index}>
{item} -- {index}
</li>
))}
</ul>
</>
);
};
export default Demo;