> 웹 프론트엔드 > JS 튜토리얼 > 성능을 위한 JavaScript 최적화

성능을 위한 JavaScript 최적화

王林
풀어 주다: 2024-07-19 11:36:33
원래의
448명이 탐색했습니다.

Optimizing JavaScript for Performance

성능을 위한 JavaScript 최적화

JavaScript는 다재다능하고 강력한 언어이지만 올바르게 최적화되지 않으면 성능 병목 현상의 원인이 될 수도 있습니다. 이 기사에서는 JavaScript 코드를 최적화하는 몇 가지 주요 기술과 각 요점을 설명하는 예제를 살펴보겠습니다.

1. DOM 액세스 최소화

문서 개체 모델(DOM)을 조작하는 것은 JavaScript에서 가장 시간이 많이 걸리는 작업 중 하나입니다. DOM 액세스를 최소화하려면 다음을 수행해야 합니다.

  • DOM 요소 캐시
  • DOM 조작 횟수 줄이기
  • 대량 업데이트에 문서 조각 사용

예:

// Inefficient DOM manipulation
for (let i = 0; i < 1000; i++) {
    let div = document.createElement('div');
    div.textContent = i;
    document.body.appendChild(div);
}

// Optimized with Document Fragment
let fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
    let div = document.createElement('div');
    div.textContent = i;
    fragment.appendChild(div);
}
document.body.appendChild(fragment);
로그인 후 복사

2. 디바운스 및 스로틀 이벤트 핸들러

이벤트 핸들러는 특히 스크롤이나 크기 조정과 같은 이벤트의 경우 자주 실행될 수 있습니다. 최적화하려면 디바운스 또는 제한 기술을 사용하여 이러한 핸들러가 실행되는 속도를 제한하세요.

예:

// Debounce function
function debounce(func, wait) {
    let timeout;
    return function(...args) {
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(this, args), wait);
    };
}

// Throttle function
function throttle(func, limit) {
    let inThrottle;
    return function(...args) {
        if (!inThrottle) {
            func.apply(this, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    };
}

// Usage
window.addEventListener('resize', debounce(() => {
    console.log('Resized');
}, 200));

window.addEventListener('scroll', throttle(() => {
    console.log('Scrolled');
}, 100));
로그인 후 복사

3. 비동기 프로그래밍 사용

동기 작업으로 메인 스레드를 차단하면 사용자 경험이 저하될 수 있습니다. async/await, Promises 또는 setTimeout과 같은 비동기 기술을 활용하여 메인 스레드의 응답성을 유지하세요.

예:

// Synchronous operation (blocking)
function fetchData() {
    let response = fetch('https://api.example.com/data'); // Blocking
    console.log(response);
}

// Asynchronous operation (non-blocking)
async function fetchDataAsync() {
    let response = await fetch('https://api.example.com/data'); // Non-blocking
    console.log(response);
}

fetchDataAsync();
로그인 후 복사

4. 루프 및 반복 최적화

루프 내부에서 수행되는 작업을 최소화하여 루프를 최적화할 수 있습니다. 예를 들어 배열의 길이를 캐시하거나 보다 효율적인 루프 구성을 사용합니다.

예:

// Inefficient loop
let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

// Optimized loop
for (let i = 0, len = arr.length; i < len; i++) {
    console.log(arr[i]);
}

// Using forEach
arr.forEach(item => console.log(item));
로그인 후 복사

5. 리플로우 및 리페인트 최소화

리플로우 및 다시 그리기는 브라우저 렌더링 프로세스에서 비용이 많이 드는 작업입니다. 다음을 통해 이를 최소화하세요.

  • DOM 업데이트 일괄
  • 인라인 스타일 대신 CSS 클래스 사용
  • 레이아웃 스래싱 방지

예:

// Layout thrashing (inefficient)
const element = document.getElementById('myElement');
element.style.width = '100px';
console.log(element.offsetWidth);
element.style.height = '100px';
console.log(element.offsetHeight);

// Optimized
const element = document.getElementById('myElement');
element.style.cssText = 'width: 100px; height: 100px;';
const width = element.offsetWidth;
const height = element.offsetHeight;
console.log(width, height);
로그인 후 복사

6. 효율적인 데이터 구조 사용

올바른 데이터 구조를 선택하면 성능이 크게 향상될 수 있습니다. 예를 들어, 고유한 값에는 세트를 사용하고 조회가 자주 발생하는 키-값 쌍에는 맵을 사용하세요.

예:

// Inefficient array search for unique values
let arr = [1, 2, 3, 4, 5, 1, 2];
let uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);

// Optimized using Set
let uniqueSet = new Set(arr);
let uniqueArrOptimized = [...uniqueSet];
로그인 후 복사

결론

웹 애플리케이션의 성능과 응답성을 향상하려면 JavaScript 최적화가 중요합니다. DOM 액세스 최소화, 이벤트 핸들러 디바운싱 및 제한, 비동기 프로그래밍 사용, 루프 최적화, 리플로우 및 다시 그리기 최소화, 효율적인 데이터 구조 선택을 통해 더 빠르고 효율적인 JavaScript 코드를 생성할 수 있습니다. 프로젝트에 이러한 기술을 구현하면 성능이 눈에 띄게 향상됩니다.

위 내용은 성능을 위한 JavaScript 최적화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿