You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importReact,{useState}from"react";import"./App.css";letworker;functionApp(){const[workerOutput,setWorkerOutput]=useState("");const[mainThreadOutput,setMainThreadOutput]=useState("");consttestWorker=()=>{if(typeofWorker!=="undefined"){if(typeofworker==="undefined"){worker=newWorker('./worker.js');}worker.onmessage=function(event){setWorkerOutput(event.data);};}else{setWorkerOutput("Web Workers are not supported in your browser");}};constterminateWorker=()=>{worker&&worker.terminate();worker=undefined;};consttestMainThread=()=>{for(leti=0;i<2000000;i++){setMainThreadOutput("Main Thread Counter: "+i);}};return(<divclassName="App"><divclassName="output-cont"><buttononClick={testWorker}>start worker</button><h3id="workerOutput">{workerOutput}</h3><buttononClick={terminateWorker}>terminate worker</button></div><br/><divclassName="output-cont"><buttononClick={testMainThread}>start blocking main thread</button><h3id="mainThreadOutput">{mainThreadOutput}</h3></div><br/><divclassName="output-cont"><buttononClick={()=>{alert("browser responsive!");}}>
test browser responsiveness
</button></div></div>);}exportdefaultApp;
importReact,{useState}from"react";import"./App.css";importworker_scriptfrom'./worker';<---导入letworker;functionApp(){const[workerOutput,setWorkerOutput]=useState("");const[mainThreadOutput,setMainThreadOutput]=useState("");consttestWorker=()=>{if(typeofWorker!=="undefined"){if(typeofworker==="undefined"){worker=newWorker(worker_script);<---使用}worker.onmessage=function(event){setWorkerOutput(event.data);};}else{setWorkerOutput("Web Workers are not supported in your browser");}};
...剩余代码}exportdefaultApp;
今天闲着没事,于是想试一下在React应用中使用Web Worker,用来测试Web Worker运行在单独的线程中,不影响主线程。
于是我用Create React App生成了一个React初始工程,然后在
src
目录添加了一个文件worker.js
:接着,我在
App.js
写了一些简单的代码:我想测试当Web Worker中执行一些繁重的计算工作的时候,用户依然可以和页面进行交互,比如响应用户点击事件。
一切看起来都很完美!
但是当我点击
start worker
按钮的时候,浏览器报告了一个错误:于是我去网上寻找解决方案,最终在Create React App的GitHub仓库找到了方法。
照着他的方法,我把代码改成了这样:
再次运行程序,这一次终于正常了。
让我们逐步看一下做了哪些修改:
↑首先把要在Worker中执行的代码放到一个函数里面。
↑接着把函数转为字符串。
↑然后截取函数体部分。
↑把这部分字符串转为Blob对象。
↑再把这个Blob对象转为DOMString。
这样,就可以在别的文件通过
import
来访问这个文件对象了:由于本人水平有限,对这里面的具体技术细节还不是很了解,等我熟悉这里面的细节,我会回来更新这篇文章。
感谢阅读!
The text was updated successfully, but these errors were encountered: