이 글은 JavaScript 성능 최적화 방법을 소개합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
이 기사는 주로 "고성능 Javascript"를 읽은 후 유용한 최적화 솔루션을 기록하고 내 경험을 모두와 공유하고 싶습니다.
# 🎜🎜##🎜 🎜#Javascript 로드 및 실행우리 모두 알고 있듯이 브라우저가 DOM 트리를 구문 분석할 때 스크립트 태그를 구문 분석할 때 다른 모든 항목을 차단합니다. js 파일이 다운로드되어 구문 분석되고 실행됩니다. 따라서 이때 브라우저는 차단됩니다. 스크립트 태그가 헤드에 배치되면 js 파일이 로드되어 실행되기 전에 사용자는 빈 페이지만 볼 수 있습니다. 이 사용자 경험은 특히 나쁠 것입니다. 이와 관련하여 일반적으로 사용되는 방법은 다음과 같습니다.
<script src="test.js" type="text/javascript" defer></script>
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 < 300 || xhr.status === 304) { const script = document.createElement('script'); script.type = 'text/javascript'; script.text = xhr.responseText; document.body.append(script); } } }
3. 여러 js 파일을 하나로 병합하고 압축합니다. 이유: 현재 대부분의 브라우저는 이미 js 파일의 병렬 다운로드를 지원하지만 동시 다운로드 수에는 여전히 특정 제한이 있으며(브라우저에 따라 일부 브라우저는 4개만 다운로드할 수 있음) 각 js 파일은 추가 http 연결을 사용하면 25KB 파일 4개를 로드하는 것이 100KB 파일 1개를 로드하는 것보다 시간이 더 걸립니다. 따라서 여러 js 파일을 하나로 병합하고 코드를 압축하는 것이 가장 좋습니다.
javascript 범위
. 따라서 자주 사용되는 전역 변수 참조를 로컬 변수 에 저장할 수 있습니다. const a = 5;
function outter () {
const a = 2;
function inner () {
const b = 2;
console.log(b); // 2
console.log(a); // 2
}
inner();
}
를 최대한 줄여야 합니다. 예를 들어 다음 코드는 // 进行两次对象成员查找
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;
}
// 优化前,在每次循环的时候,都要获取id为t的节点,并且设置它的innerHTML function innerHTMLLoop () { for (let count = 0; count < 15000; count++) { document.getElementById('t').innerHTML += 'a'; } } // 优化后, function innerHTMLLoop () { const tNode = document.getElemenById('t'); const insertHtml = ''; for (let count = 0; count < 15000; count++) { insertHtml += 'a'; } tNode.innerHtml += insertHtml; }
// 优化前 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!