찾다
웹 프론트엔드JS 튜토리얼JavaScript 성능 최적화 방법 소개(예제 포함)

JavaScript 성능 최적화 방법 소개(예제 포함)

Nov 17, 2018 pm 03:03 PM
htmlhtml5javascript프런트 엔드성능 최적화

이 글은 JavaScript 성능 최적화 방법을 소개합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

이 기사는 주로 "고성능 Javascript"를 읽은 후 유용한 최적화 솔루션을 기록하고 내 경험을 모두와 공유하고 싶습니다.

# 🎜🎜##🎜 🎜#Javascript 로드 및 실행

우리 모두 알고 있듯이 브라우저가 DOM 트리를 구문 분석할 때 스크립트 태그를 구문 분석할 때 다른 모든 항목을 차단합니다. js 파일이 다운로드되어 구문 분석되고 실행됩니다. 따라서 이때 브라우저는 차단됩니다. 스크립트 태그가 헤드에 배치되면 js 파일이 로드되어 실행되기 전에 사용자는 빈 페이지만 볼 수 있습니다. 이 사용자 경험은 특히 나쁠 것입니다. 이와 관련하여 일반적으로 사용되는 방법은 다음과 같습니다.

    모든 ​​스크립트 태그를 본문 하단에 배치합니다. 이렇게 하면 js 파일이 마지막에 로드되고 실행됩니다. . 먼저 사용자에게 페이지를 표시합니다. 그러나 페이지의 첫 번째 화면 렌더링이 일부 js 파일에 따라 달라지는지 먼저 알아야 합니다. 그렇다면 js 파일의 이 부분을 헤드에 배치해야 합니다.
  • 다음과 같이 defer를 사용하세요. defer를 사용하면 브라우저는 태그를 구문 분석할 때 해당 js 파일을 다운로드하지만 즉시 실행하지 않고, 대신 이러한 js 파일을 실행하기 전에 DOM이 구문 분석될 때까지 기다립니다. 따라서 브라우저가 차단되지 않습니다.
  • <script></script>
    js 파일의 동적 로딩 이러한 방식으로 페이지가 로드된 후 필요한 코드를 로드할 수 있습니다. js 파일의 온디맨드 로딩도 이런 방식으로 구현될 수 있습니다. 예를 들어, 현재는 webpack이 vue-router/react-router와 결합되어 온디맨드 로딩을 ​​달성하는 것이 더 일반적입니다. 특정 경로에 액세스됩니다. 구체적인 방법은
  • 1입니다. 다음 코드를 통해 스크립트 태그를 동적으로 삽입하여 스크립트를 로드합니다.
  function loadScript(url, callback) {
    const script = document.createElement('script');
    script.type = 'text/javascript';
    // 处理IE
    if (script.readyState) {
      script.onreadystatechange = function () {
        if (script.readyState === 'loaded' || script.readyState === 'complete') {
          script.onreadystatechange = null;
          callback();
        }
      }
    } else {
      // 处理其他浏览器的情况
      script.onload = function () {
        callback();
      }
    }
    script.src = url;
    document.body.append(script);
  }

  // 动态加载js
  loadScript('file.js', function () {
    console.log('加载完成');
  })

2 . xhr 방법을 통해 js 파일을 로드하지만 이 방법을 사용하면 도메인 간 문제가 발생할 수 있습니다. 예는 다음과 같습니다:

  const xhr = new XMLHttpRequest();
  xhr.open('get', 'file.js');
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
      if (xhr.status >= 200 && xhr.status <p>3. 여러 js 파일을 하나로 병합하고 압축합니다. 이유: 현재 대부분의 브라우저는 이미 js 파일의 병렬 다운로드를 지원하지만 동시 다운로드 수에는 여전히 특정 제한이 있으며(브라우저에 따라 일부 브라우저는 4개만 다운로드할 수 있음) 각 js 파일은 추가 http 연결을 사용하면 25KB 파일 4개를 로드하는 것이 100KB 파일 1개를 로드하는 것보다 시간이 더 걸립니다. 따라서 여러 js 파일을 하나로 병합하고 코드를 압축하는 것이 가장 좋습니다. </p><p>javascript 범위</p><h3 id="함수가-실행될-때-실행-컨텍스트가-생성됩니다-이-실행-컨텍스트는-함수가-실행될-때의-환경을-정의합니다-함수-실행이-완료되면-실행-컨텍스트가-삭제됩니다-따라서-동일한-함수를-여러-번-호출하면-여러-실행-컨텍스트가-생성됩니다-각-실행-컨텍스트에는-자체-범위-체인이-있습니다-함수의-첫-번째-범위는-함수-내부의-변수입니다-함수-실행-중에-변수가-발견될-때마다-함수의-범위-체인을-검색하여-일치하는-첫-번째-변수를-찾습니다-먼저-함수-내부의-변수를-검색한-다음-범위-체인을-따라-계층별로-검색합니다-따라서">함수가 실행될 때 실행 컨텍스트가 생성됩니다. 이 실행 컨텍스트는 함수가 실행될 때의 환경을 정의합니다. 함수 실행이 완료되면 실행 컨텍스트가 삭제됩니다. 따라서 동일한 함수를 여러 번 호출하면 여러 실행 컨텍스트가 생성됩니다. 각 실행 컨텍스트에는 자체 범위 체인이 있습니다. 함수의 첫 번째 범위는 함수 내부의 변수입니다. 함수 실행 중에 변수가 발견될 때마다 함수의 범위 체인을 검색하여 일치하는 첫 번째 변수를 찾습니다. 먼저 함수 내부의 변수를 검색한 다음 범위 체인을 따라 계층별로 검색합니다. 따라서 </h3>가장 바깥쪽 변수(전역변수)에 접근하게 되면 내부 변수에 직접 접근하는 것에 비해 성능 손실이 상대적으로 커집니다<p>. 따라서 <strong> 자주 사용되는 전역 변수 참조를 로컬 변수 </strong>에 저장할 수 있습니다. <strong><pre class="brush:php;toolbar:false">const a = 5;
function outter () {
  const a = 2;
  function inner () {
    const b = 2;
    console.log(b); // 2
    console.log(a); // 2
  }
  inner();
}
객체 읽기

JavaScript에는 주로 리터럴, 지역 변수, 배열 요소 및 객체의 네 가지 유형이 있습니다. 리터럴과 지역 변수에 액세스하는 것이 가장 빠른 반면, 배열 요소와 객체 멤버에 액세스하는 것은 상대적으로 느립니다. 범위 체인과 마찬가지로 객체 멤버에 액세스할 때 검색은 프로토타입 체인에서 수행됩니다. 따라서 검색된 멤버가 프로토타입 체인 내에서 너무 깊다면 접근 속도가 느려질 수 있습니다. 따라서

객체 멤버의 조회 수와 중첩 깊이

를 최대한 줄여야 합니다. 예를 들어 다음 코드는

  // 进行两次对象成员查找
  function hasEitherClass(element, className1, className2) {
    return element.className === className1 || element.className === className2;
  }
  // 优化,如果该变量不会改变,则可以使用局部变量保存查找的内容
  function hasEitherClass(element, className1, className2) {
    const currentClassName = element.className;
    return currentClassName === className1 || currentClassName === className2;
  }
DOM 작업 최적화

    DOM 작업 수를 최소화하고 javascript를 사용하여 최대한 처리합니다. , 가능한 한 많이 사용하십시오. 로컬 변수를 사용하여 DOM 노드를 저장하십시오. 예를 들어, 다음 코드는
  •   // 优化前,在每次循环的时候,都要获取id为t的节点,并且设置它的innerHTML
      function innerHTMLLoop () {
        for (let count = 0; count 
    리플로우를 줄이고 리플로우를 최대한 많이 수행하는 데 비용이 많이 들 수 있습니다. 따라서 재배치 및 재병합 횟수를 줄이기 위해 Dom의 스타일을 수정하려는 경우에는 다음과 같은 최적화를 수행할 수 있습니다
  • 1. , 우리는 재배치 및 재병합 횟수를 줄이기 위해 모든 수정 사항을 가능한 한 많이 병합하고 한 번에 처리해야 합니다.
  // 优化前
  const el = document.getElementById('test');
  el.style.borderLeft = '1px';
  el.style.borderRight = '2px';
  el.style.padding = '5px';

  // 优化后,一次性修改样式,这样可以将三次重排减少到一次重排
  const el = document.getElementById('test');
  el.style.cssText += '; border-left: 1px ;border-right: 2px; padding: 5px;'

2.当我们要批量修改DOM节点的时候,我们可以将DOM节点隐藏掉,然后进行一系列的修改操作,之后再将其设置为可见,这样就可以最多只进行两次重排。具体的方法如下:

  // 未优化前
  const ele = document.getElementById('test');
  // 一系列dom修改操作

  // 优化方案一,将要修改的节点设置为不显示,之后对它进行修改,修改完成后再显示该节点,从而只需要两次重排
  const ele = document.getElementById('test');
  ele.style.display = 'none';
  // 一系列dom修改操作
  ele.style.display = 'block';

  // 优化方案二,首先创建一个文档片段(documentFragment),然后对该片段进行修改,之后将文档片段插入到文档中,只有最后将文档片段插入文档的时候会引起重排,因此只会触发一次重排。。
  const fragment = document.createDocumentFragment();
  const ele = document.getElementById('test');
  // 一系列dom修改操作
  ele.appendChild(fragment);

3.使用事件委托:事件委托就是将目标节点的事件移到父节点来处理,由于浏览器冒泡的特点,当目标节点触发了该事件的时候,父节点也会触发该事件。因此,由父节点来负责监听和处理该事件。

那么,它的优点在哪里呢?假设你有一个列表,里面每一个列表项都需要绑定相同的事件,而这个列表可能会频繁的插入和删除。如果按照平常的方法,你只能给每一个列表项都绑定一个事件处理器,并且,每当插入新的列表项的时候,你也需要为新的列表项注册新的事件处理器。这样的话,如果列表项很大的话,就会导致有特别多的事件处理器,造成极大的性能问题。而通过事件委托,我们只需要在列表项的父节点监听这个事件,由它来统一处理就可以了。这样,对于新增的列表项也不需要做额外的处理。而且事件委托的用法其实也很简单:

function handleClick(target) {
  // 点击列表项的处理事件
}
function delegate (e) {
  // 判断目标对象是否为列表项
  if (e.target.nodeName === 'LI') {
    handleClick(e.target);
  }
}
const parent = document.getElementById('parent');
parent.addEventListener('click', delegate);


위 내용은 JavaScript 성능 최적화 방법 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
브라우저 너머 : 실제 세계의 JavaScript브라우저 너머 : 실제 세계의 JavaScriptApr 12, 2025 am 12:06 AM

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Apr 11, 2025 am 08:23 AM

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Apr 11, 2025 am 08:22 AM

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript : 웹 언어의 다양성 탐색JavaScript : 웹 언어의 다양성 탐색Apr 11, 2025 am 12:01 AM

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 진화 : 현재 동향과 미래 전망JavaScript의 진화 : 현재 동향과 미래 전망Apr 10, 2025 am 09:33 AM

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

Demystifying JavaScript : 그것이하는 일과 중요한 이유Demystifying JavaScript : 그것이하는 일과 중요한 이유Apr 09, 2025 am 12:07 AM

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python 또는 JavaScript가 더 좋습니까?Python 또는 JavaScript가 더 좋습니까?Apr 06, 2025 am 12:14 AM

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.

JavaScript를 어떻게 설치합니까?JavaScript를 어떻게 설치합니까?Apr 05, 2025 am 12:16 AM

JavaScript는 이미 최신 브라우저에 내장되어 있기 때문에 설치가 필요하지 않습니다. 시작하려면 텍스트 편집기와 브라우저 만 있으면됩니다. 1) 브라우저 환경에서 태그를 통해 HTML 파일을 포함하여 실행하십시오. 2) Node.js 환경에서 Node.js를 다운로드하고 설치 한 후 명령 줄을 통해 JavaScript 파일을 실행하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전