JavaScript의 성능 최적화

JavaScript는 프런트 엔드 개발에 널리 사용되는 고급 프로그래밍 언어로, 유연성과 상호 작용이 현대 웹 애플리케이션의 필수 요소입니다. 그러나 웹 페이지와 애플리케이션의 복잡성이 계속 증가함에 따라 JavaScript 성능 문제가 점점 더 두드러지고 있습니다. 따라서 웹 애플리케이션을 개발할 때 애플리케이션의 응답 속도와 사용자 경험을 향상시키기 위해 JavaScript의 성능을 최적화하는 방법을 고려해야 합니다.

이 기사에서는 DOM 액세스 감소, 이벤트 위임 사용, 파일 병합 및 압축, 캐싱 사용 등 JavaScript의 몇 가지 성능 최적화 기술을 소개합니다. 동시에 몇 가지 일반적인 성능 문제에 대해 논의하고 독자가 실제 프로젝트에서 JavaScript 성능을 최적화하는 방법을 더 잘 이해할 수 있도록 몇 가지 실용적인 최적화 기술을 제공합니다.

1. 일반적인 JavaScript 성능 문제

JavaScript 성능 최적화 전에 몇 가지 일반적인 JavaScript 성능 문제를 이해해야 합니다. 다음은 자주 묻는 질문입니다.

1. 빈번한 DOM 액세스: DOM 요소에 대한 빈번한 액세스는 성능 문제를 일으킬 수 있습니다. DOM 요소에 액세스하는 것은 비용이 많이 드는 작업이므로 브라우저에서 요소에 대한 참조를 가져와 요소의 위치와 크기를 계산해야 합니다.

2. 너무 많은 HTTP 요청: HTTP 요청이 너무 많으면 페이지가 너무 오래 로드되어 사용자 경험에 영향을 미칩니다. HTTP 요청을 보낼 때마다 TCP 연결을 설정하고 데이터를 전송해야 하며 이러한 작업에는 시간과 리소스가 필요합니다.

3. 많은 수의 JavaScript 파일: 웹 애플리케이션이 많은 수의 JavaScript 파일을 사용하는 경우 로딩 시간이 매우 길어져 사용자 경험에 영향을 미칩니다. 각 JavaScript 파일은 HTTP 요청을 생성하고 구문 분석 및 실행해야 하며 이러한 작업에는 시간과 리소스가 필요합니다.

4. 메모리 누수: 메모리 누수는 코드에서 생성된 개체를 가비지 수집기가 올바르게 회수할 수 없음을 의미합니다. JavaScript 코드에 메모리 누수가 있는 경우 웹 애플리케이션이 장시간 실행될 때 메모리 사용량이 계속 증가하여 성능 문제가 발생할 수 있습니다.

2. JavaScript 성능 최적화 기술

JavaScript 성능 문제를 해결하려면 몇 가지 최적화 조치를 취해야 합니다. 다음은 몇 가지 일반적인 JavaScript 성능 최적화 팁입니다.

1. DOM 액세스 줄이기

위에서 언급했듯이 DOM 요소에 자주 액세스하면 성능 문제가 발생할 수 있습니다. 이러한 종류의 문제를 피하려면 DOM 요소에 대한 액세스를 최소화해야 합니다. 예를 들어 반복 방문을 피하기 위해 DOM 요소에 대한 참조를 캐시할 수 있습니다. 또한 DOM에서 작업 수를 줄이기 위해 documentFragment를 사용할 수 있습니다.

2. 이벤트 위임 사용

이벤트 위임은 이벤트 핸들러의 수를 줄여 웹 애플리케이션의 성능을 향상시키는 JavaScript 기술입니다. 이벤트 위임은 각 자식 요소에 이벤트 처리기를 연결하는 것이 아니라 부모 요소에 이벤트 처리기를 연결하는 것입니다. 자식 요소에서 이벤트가 발생하면 이벤트가 처리되는 부모 요소까지 올라갑니다. 이렇게 하면 하나의 이벤트 핸들러를 사용하여 여러 하위 요소에 대한 이벤트를 처리할 수 있습니다.

예를 들어 여러 li 요소를 포함하는 ul 요소가 있다고 가정합니다. 각 li 요소를 클릭할 때 일부 코드를 실행하려면 이벤트 위임을 사용하여 이를 달성할 수 있습니다.

const ul = document.querySelector('ul');
ul.addEventListener('click', (event) => {
  if (event.target.tagName === 'LI') {
    // 在这里处理li元素的单击事件
  }
});

위의 코드에서 클릭 이벤트 핸들러를 ul 요소에 연결하고 있습니다. 클릭 이벤트가 li 요소에서 발생하면 ul 요소까지 버블링되고 ul 요소에 의해 처리됩니다. 이벤트 핸들러에서 이벤트의 대상 요소가 li 요소인지 확인하고 필요한 경우 해당 코드를 실행할 수 있습니다.

이벤트 위임을 사용하면 이벤트 핸들러의 수를 줄일 수 있으므로 웹 애플리케이션의 성능을 향상시킬 수 있습니다. 또한 코드를 더 간결하고 유지 관리하기 쉽게 만들 수 있습니다.

3. 파일 병합 및 압축

위에서 언급했듯이 웹 애플리케이션이 많은 수의 JavaScript 파일을 사용하는 경우 로딩 시간이 매우 길어져 사용자 경험에 영향을 미칩니다. 이 문제를 해결하기 위해 여러 JavaScript 파일을 단일 파일로 결합하고 압축 알고리즘을 사용하여 파일 크기를 줄일 수 있습니다. 이렇게 하면 HTTP 요청 수가 줄어들고 파일 전송 시간과 구문 분석 시간을 줄일 수 있습니다.

일반적으로 사용되는 JavaScript 파일 병합 도구에는 Grunt, Gulp 및 Webpack이 포함됩니다. 이러한 도구는 여러 JavaScript 파일을 하나로 결합하고 압축 알고리즘을 사용하여 파일 크기를 줄이는 데 도움이 됩니다.

4. 캐싱 사용

캐싱은 웹 애플리케이션의 성능을 향상시키는 중요한 기술입니다. 브라우저가 웹 애플리케이션에 처음 액세스하면 서버에서 HTML, CSS, JavaScript 및 기타 파일을 다운로드합니다. 서버에서 캐싱을 활성화하면 브라우저는 이러한 파일을 로컬 캐시에 저장하고 다음 방문 시 서버에서 파일을 다시 다운로드하는 대신 로컬 캐시를 사용할 수 있습니다. 이렇게 하면 HTTP 요청 수가 줄어들고 웹 애플리케이션의 성능이 향상됩니다.

일반적으로 사용되는 캐싱 기술에는 브라우저 캐싱, CDN 캐싱 및 서버 캐싱이 포함됩니다. 예를 들어 서버 측에서 HTTP 캐싱 헤더를 구성하여 브라우저가 파일을 로컬로 캐시하도록 지시할 수 있습니다. 일반적으로 사용되는 HTTP 캐시 헤더에는 Expires, Cache-Control 및 ETag가 포함됩니다.

5. 메모리 누수 방지

위에서 언급했듯이 JavaScript에는 메모리 누수 문제가 있으며 이는 성능 저하 및 웹 응용 프로그램 충돌로 이어질 수 있습니다. 메모리 누수는 프로그램에서 생성된 개체가 올바르게 해제되지 않아 브라우저의 메모리 제한에 도달할 때까지 메모리 사용량이 계속 증가함을 의미합니다.

메모리 누수를 방지하려면 불필요한 전역 변수 및 클로저 생성을 피하고 더 이상 필요하지 않은 개체를 즉시 삭제해야 합니다. 예를 들어 자바스크립트에서 객체를 생성할 때 사용을 마친 후 즉시 삭제해야 합니다.

let myObj = {
  // 对象的属性和方法
};

// 在这里使用myObj

// 使用完myObj后,删除它
myObj = null;

위의 코드에서 myObj 객체를 사용하여 객체가 점유한 메모리를 해제한 후 null로 설정합니다.

6. DOM 액세스 줄이기

JavaScript에서 DOM에 액세스하는 것은 시간이 많이 걸리는 작업입니다. DOM을 방문할 때마다 브라우저는 페이지 레이아웃을 다시 계산하고 페이지를 다시 렌더링하므로 웹 애플리케이션의 성능이 느려질 수 있습니다. 성능을 향상시키기 위해서는 DOM 접근 횟수를 최소화하고 재사용을 위해 DOM 접근 결과를 캐싱해야 합니다.

예를 들어 페이지에서 요소를 찾고 해당 스타일을 설정해야 한다고 가정합니다. 다음 코드를 사용하여 DOM에 액세스하면 페이지 레이아웃이 다시 계산되고 방문할 때마다 페이지가 다시 렌더링됩니다.

document.querySelector('.my-element').style.color = 'red';

이를 방지하기 위해 먼저 요소의 참조를 변수에 저장하고 필요할 때 요소에 액세스하는 데 사용할 수 있습니다. 예를 들어:

const myElement = document.querySelector('.my-element');
myElement.style.color = 'red';

위의 코드에서는 먼저 요소의 참조를 myElement 변수에 저장하고 필요할 때 요소에 액세스하는 데 사용합니다. 이는 DOM에 대한 다중 액세스를 방지하고 웹 애플리케이션의 성능을 향상시킵니다.

7. requestAnimationFrame 사용

requestAnimationFrame은 애니메이션 성능을 최적화하기 위한 API입니다. 다음 브라우저 다시 그리기 전에 콜백 기능을 실행하여 적절한 시간에 콜백 기능이 실행되도록 하여 페이지 정지 및 부드럽지 않은 애니메이션 문제를 방지합니다.

예를 들어 페이지에서 요소를 이동해야 하는 애니메이션 효과가 있다고 가정합니다. 애니메이션 효과를 얻기 위해 다음 코드를 사용하면 페이지가 정지되고 애니메이션이 부드럽지 않을 수 있습니다.

const element = document.querySelector('.my-element');
let position = 0;

function animate() {
  position += 1;
  element.style.left = position + 'px';
  requestAnimationFrame(animate);
}

animate();

위의 코드에서는 루프를 사용하여 요소의 위치를 ​​지속적으로 업데이트합니다.

이러한 상황을 피하기 위해 requestAnimationFrame을 사용하여 애니메이션 효과를 최적화할 수 있습니다. 예를 들어:

const element = document.querySelector('.my-element');
let position = 0;

function animate() {
  position += 1;
  element.style.left = position + 'px';
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

위의 코드에서 requestAnimationFrame을 사용하여 애니메이션 효과를 수행합니다. 이렇게 하면 애니메이션이 적절한 시간에 실행되어 페이지 끊김 및 갑작스러운 애니메이션을 방지할 수 있습니다.

8. 이벤트 위임 사용

JavaScript에서 이벤트 위임은 이벤트 핸들러의 성능을 최적화하는 데 사용되는 기술입니다. 이벤트 위임은 이벤트 버블링의 원칙을 사용하여 각 하위 요소의 이벤트를 개별적으로 처리하는 대신 상위 요소의 이벤트를 처리합니다. 이것은 이벤트 처리기의 수를 줄이고 웹 응용 프로그램의 성능을 향상시킵니다.

예를 들어 목록이 있고 목록의 각 요소에 클릭 이벤트 핸들러를 추가해야 한다고 가정합니다. 다음 코드를 사용하여 이 기능을 구현하면 성능 문제가 발생할 수 있습니다.

const items = document.querySelectorAll('.my-list-item');
items.forEach(item => {
  item.addEventListener('click', () => {
    // 处理点击事件
  });
});

위의 코드에서 각 목록 항목에 대한 클릭 이벤트 핸들러를 추가했습니다. 이로 인해 이벤트 핸들러 수가 증가하고 성능 문제가 발생할 수 있습니다.

이 문제를 해결하기 위해 이벤트 위임을 사용하여 클릭 이벤트를 처리할 수 있습니다. 예를 들어:

const list = document.querySelector('.my-list');
list.addEventListener('click', event => {
  if (event.target.classList.contains('my-list-item')) {
    // 处理点击事件
  }
});

위의 코드에서 목록 요소에 대한 클릭 이벤트 핸들러를 추가하고 핸들러에서 클릭 이벤트의 대상이 목록 항목인지 확인했습니다. 이것은 이벤트 처리기의 수를 줄이고 웹 응용 프로그램의 성능을 향상시킵니다.

9. 파일 병합 및 압축

웹 애플리케이션에서는 일반적으로 JavaScript, CSS 및 이미지와 같은 파일을 서버에서 로드해야 합니다. 성능을 향상시키려면 파일의 수와 크기를 최소화하고 병합 및 압축 기술을 사용하여 파일 크기를 줄여야 합니다.

병합은 여러 파일을 하나로 결합하는 프로세스입니다. 예를 들어 app.js와 utils.js라는 두 개의 JavaScript 파일이 있다고 가정합니다. 그것들을 하나의 파일로 결합하면 파일 수를 줄일 수 있으므로 웹 응용 프로그램의 성능을 향상시킬 수 있습니다.

압축은 파일 크기를 최소로 줄이는 프로세스입니다. 예를 들어 크기가 100KB인 CSS 파일이 있다고 가정해 보겠습니다. CSS 압축 도구를 사용하여 이 파일을 압축하면 파일 크기를 50KB 이하로 줄일 수 있으므로 파일 로드 속도를 높일 수 있습니다.

파일 병합 및 압축을 달성하기 위해 몇 가지 도구와 기술을 사용할 수 있습니다. 예를 들어 Webpack, Gulp 및 Grunt와 같은 빌드 도구를 사용하여 파일 병합 및 압축을 자동화할 수 있습니다. 이러한 도구는 필요에 따라 파일을 자동으로 병합, 압축 및 최적화하여 웹 애플리케이션 성능을 향상시킬 수 있습니다.

결론적으로

JavaScript는 매우 강력한 프로그래밍 언어이지만 웹 애플리케이션에서 사용하면 성능 문제가 발생할 수 있습니다. 웹 애플리케이션의 성능을 개선하려면 DOM 액세스를 최소화하고, 이벤트 위임을 사용하고, 파일을 병합 및 압축하고, 캐싱 및 기타 기술을 사용해야 합니다. 이러한 기술은 네트워크 요청을 줄이고 코드 실행을 최적화하고 파일 로드 속도를 높여 웹 애플리케이션의 성능과 사용자 경험을 향상시킵니다.

추천

출처blog.csdn.net/tyxjolin/article/details/130472117