웹 작업자란 무엇입니까?
21957 단어 webworkersjavascriptfrontendhtml
웹 작업자란 무엇입니까?
웹 작업자는 백그라운드에서 실행되는 JavaScript 코드이며 페이지 성능에 영향을 미치지 않습니다.
우리 모두 알다시피 JavaScript는 단일 스레드 언어이므로 한 번에 하나의 작업만 처리할 수 있습니다.
예시
let t = new Date();
console.log(`tastk 1 took: ${new Date() - t}ms`);
console.log(`tastk 2 took: ${new Date() - t}ms`);
console.log(`tastk 3 took: ${new Date() - t}ms`);
위의 예에서 콘솔에 다음과 같은 출력이 표시됩니다. In sequence just like we write.
tastk 1 took: 0ms
tastk 2 took: 0ms
tastk 3 took: 1ms
이러한 작업은 간단하기 때문에 콘솔을 열면 세 줄이 모두 인쇄되고 그 사이에 시간이 거의 없는 것을 볼 수 있습니다.
하지만 작업 중 하나가 다른 작업보다 시간이 오래 걸린다면 어떻게 될까요?
예시
let t = new Date();
console.log(`tastk 1 took: ${new Date() - t}ms`);
console.log(`tastk 2 took: ${new Date() - t}ms`);
let i = 0;
while (i <= 10000000) {
i++;
}
console.log(`tastk 3 took: ${new Date() - t}ms`);
내 컴퓨터에서 인쇄하는 데 2777ms가 걸렸습니다
task 3
.tastk 1 took: 0ms
tastk 2 took: 1ms
tastk 3 took: 2777ms
또 다른 예
다음 코드를 복사하여
index.html
파일에 붙여넣거나 GitHub Repo을 다운로드합니다.index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Web Workers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- counter -->
<script>
let i = 0;
let intervalId = null;
const counter = () => {
if (!intervalId) {
intervalId = setInterval(() => {
i++;
document.getElementById("counter").innerText = i;
}, 300);
} else {
clearInterval(intervalId);
i = 0;
document.getElementById("counter").innerText = i;
intervalId = null;
}
};
</script>
<!-- longCalculation -->
<script>
const longCalculation = () => {
let i = 0;
while (i <= 10000000000) {
i++;
}
alert("Long calculation finished!");
};
</script>
</head>
<body>
<h3>Counter: <span id="counter"> # </span></h3>
<button onclick="counter()">Start Counter</button>
<button onclick="longCalculation()">Long Calculation</button>
</body>
</html>
첫 번째 버튼은 클릭하자마자 계산을 시작하는 간단한 카운터입니다.
다른 버튼은 실행하는 데 오랜 시간이 걸리는 코드 조각입니다.
클릭하면 계산이 완료될 때까지 나머지 페이지와 함께 카운터가 정지된 것을 볼 수 있습니다.
The browser may also issue a warning, such as this page is slowing down your browser or this page is not responsive, or anything similar.
JavaScript는 단일 스레드 언어이므로 계속하기 전에 계산이 완료될 때까지 기다려야 합니다.
웹 작업자 사용
여기에서 Web Workers가 도와드립니다.
프로세스가 오랜 시간이 걸릴 가능성이 있는 경우 사용자는 프로세스가 완료될 때까지 기다릴 필요가 없습니다. 이것은 실제로 열악한 사용자 경험입니다.
대신, 이러한 긴 작업은 백그라운드에서 수행되어야 합니다.
다른 버튼을 만들어 보겠습니다
Worker Calculation
.<button onclick="workerCalculation()">Worker Calculation</button>
이제 긴 계산의 논리를 별도의 파일에 추가합니다.
worker.js
let i = 0;
while (i <= 1000000000) {
i++;
}
postMessage("Worker calculation finished!");
그리고 값을 직접 알려주는 대신
postMessage
방법을 사용하겠습니다.그리고
workerCalculation
함수의 논리는 다음과 같습니다.<script>
const workerCalculation = () => {
let worker = new Worker("worker.js");
worker.onmessage = (e) => {
alert(e.data);
};
};
</script>
worker
인스턴스를 만듭니다. onmessage
를 인수로 사용하는 event
콜백을 추가합니다이 콜백을 사용하여 계산이 완료되면
data
메서드에서 오는 postMessage
를 경고합니다.이제 계산이 백그라운드에서 수행되며 페이지가 응답하지 않는 상태가 되지 않습니다.
최종 index.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Web Workers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- counter -->
<script>
let i = 0;
let intervalId = null;
const counter = () => {
if (!intervalId) {
intervalId = setInterval(() => {
i++;
document.getElementById("counter").innerText = i;
}, 300);
} else {
clearInterval(intervalId);
i = 0;
document.getElementById("counter").innerText = i;
intervalId = null;
}
};
</script>
<!-- longCalculation -->
<script>
const longCalculation = () => {
let i = 0;
while (i <= 10000000000) {
i++;
}
alert("Long calculation finished!");
};
</script>
<!-- workerCalculation -->
<script>
const workerCalculation = () => {
let worker = new Worker("worker.js");
worker.onmessage = (e) => {
alert(e.data);
};
};
</script>
</head>
<body>
<h3>Counter: <span id="counter"> # </span></h3>
<button onclick="counter()">Start Counter</button>
<button onclick="longCalculation()">Long Calculation</button>
<button onclick="workerCalculation()">Worker Calculation</button>
</body>
</html>
브라우저 지원
웹 작업자는 모든 브라우저에서 지원되지 않습니다.
웹 워커를 만들기 전에 사용자의 브라우저가 웹 워커를 지원하는지 확인해야 합니다.
if (typeof Worker !== "undefined") {
// Yes!
} else {
// No!
}
따라서 worker.js 파일은 다음과 같아야 합니다.
if (typeof Worker !== "undefined") {
let i = 0;
while (i <= 1000000000) {
i++;
}
postMessage("Worker calculation finished!");
} else {
alert("Your browser doesn't support web workers.");
}
Learn more about Web Workers API
Reference
이 문제에 관하여(웹 작업자란 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/youssefzidan/what-is-web-worker-4g3k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)