NodeJS + Lighthouse + Gulp를 사용하여 자동화된 웹사이트 성능 테스트 도구를 구축하는 방법
이 글은 주로 NodeJS + Lighthouse + Gulp를 사용하여 자동화된 웹사이트 성능 테스트 도구를 구축하는 방법을 소개합니다. 이제는 도움이 필요한 친구들이 참고할 수 있도록 공유하겠습니다. Lighthouse is What
Lighthouse는 웹사이트 품질을 자동으로 감지할 수 있는 Google의 오픈 소스 도구입니다. 친숙한 인터페이스, 간단한 조작, 다양한 사용 방법 및 포괄적인 관점을 갖추고 있어 일반 사용자도 테스트할 수 있습니다. QA 및 개발자가 빠르게 시작할 수 있습니다.
시작 자세
난이도 +1
Lighthouse를 사용하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 Chrome의 개발자 도구를 사용하는 것입니다.
- Chrome 브라우저를 엽니다.
- F12를 누르세요
- 팝업 창에서 감사 탭 열기
- 감사 수행을 클릭하세요...모두 확인
- 감사 실행
- 난이도 +2
명령줄을 사용할 수도 있습니다.
- Install Node
- Lighthouse 설치
npm install -g lighthouse
在命令行中run
lighthouse <url></url>
npm install -g lighthouse
以上两种使用方式都不是本文的重点,如果想深入了解,可参照 Run Lighthouse in DevTools
难度系数+3
由于最近在学习 NodeJS, 因此笔者决定使用 Node 8 + Gulp 来跑 lighthouse,为了提高结果的准确性,每次task都跑10次 lighthouse, 并且只关心结果指标中的 first-meaningful-paint
毫秒数,最终取10次的平均值,为了可视化与可读性,最终的结果以网页的形式展示,用户可在网页上看到每次执行 Lighthouse 之后 first-meaningful-paint
的毫秒数,也可以看到平均值,如果用户对某次执行的细节感兴趣,可以点击链接察看。最终的结果长这个样子:
环境搭建
安装 Node 8
安装依赖包
npm i lighthouse --save-dev npm i chrome-launcher --save-dev npm i fs-extra --save-dev npm i gulp --save-dev
配置
在项目根目录下创建Lighthouse的配置文件 lighthouse-config.js
, 这里我们全部使用默认配置,使用默认配置需在配置文件中声明 extends: 'lighthouse:default'
。
module.exports = { extends: 'lighthouse:default' }
如果读者需要了解更详细的配置选项,可参考:
Lighthouse 这篇大部分内容是关于命令行的,命令行参数同样可用于Node
throttling这篇是关于网络模拟的
Default Config 具体的默认配置参数
Web Page Test 模拟不同的网速
Emulation 模拟不同的设备
Coding
在项目根目录下创建 gulpfile.js
,首先引入所有依赖的工具:
const gulp = require('gulp'); const lighthouse = require('lighthouse'); const chromeLauncher = require('chrome-launcher'); const printer = require('lighthouse/lighthouse-cli/printer'); const Reporter = require('lighthouse/lighthouse-core/report/report-generator'); const fs = require('fs-extra'); const config = require('.lighthouse-config.js');
在开始使用 lighthouse 之前,首先创建一个写入文件的方法, 用于最后生成自定义的 report 文件:
async function write(file, report) { try { await fs.outputFile(file, report); } catch (Error e) { console.log("error while writing report ", e); } }
调用 Lighthouse 之前,我们需要首先启动一个 Chrome 的 instance ,并将端口号提供给 Lighthouse 。--headless
表示不打开 browser 窗口。
async function launchChrome() { let chrome; try { chrome = await chromeLauncher.launch({ chromeFlags: [ "--disable-gpu", "--no-sandbox", "--headless" ], enableExtensions: true, logLevel: "error" }); console.log(chrome.port) return { port: chrome.port, chromeFlags: [ "--headless" ], logLevel: "error" } } catch (e) { console.log("Error while launching Chrome ", e); } }
Chrome 实例启动之后,我们就可以调用 Lighthouse , 调用时,须提供需要进行性能测试的网站,参数,以及前文创建好的配置,参数包含了 Chrome 启动端口,启动方式(是否 headless 等信息)。
async function lighthouseRunner(opt) { try { return await lighthouse("https://www.baidu.com", opt, config); } catch (e) { console.log("Error while running lighthouse"); } }
Lighthouse 的返回结果是一个包含性能测试结果, 最终版的配置参数, 指标分组等信息的 json 对象,读者可以参考 Understanding Results 获得更深入的理解。
由于这里我们需要使用 Lighthouse 官方的模板生成报告,因此调用官方提供的方法,注意第一个参数传入 result.lhr
, 第二个参数声明生成 html 报告(还可以生成 csv 等格式的报告)。
function genReport(result) { return Reporter.generateReport(result.lhr, 'html'); }
下面我们写一个将上面几个方法串起来的函数,首先启动一个 Chrome 实例, 然后将 Chrome 实例的某些参数传递给 Lighthouse,使用 lighthouse 跑出来的结果生成报告,并写入 html 文件, html文件应带有时间戳和执行顺序作为唯一标识。start
方法返回结果中的first-meaningful-paint
lighthouse <url></url>
🎜🎜🎜🎜Above를 실행하세요. 두 가지 사용 방법 모두 이 기사의 초점이 아닙니다. 자세한 내용은 DevTools의 Run Lighthouse🎜🎜난이도 계수 +3🎜🎜최근에 NodeJS를 배우고 있기 때문에 저자는 Node 8 + Gulp를 사용하기로 결정했습니다. 결과를 개선하기 위해 Lighthouse를 실행합니다. 정확성을 위해 각 작업은 Lighthouse를 10번 실행하고 결과 표시기의 first-meaningful-paint
밀리초에만 관심을 갖습니다. 마지막으로 10번의 평균은 다음과 같습니다. 시각화 및 가독성을 위해 최종 결과는 웹 페이지 형식으로 표시됩니다. 사용자는 Lighthouse를 실행할 때마다 first-meaningful-paint
의 시간을 확인할 수 있습니다. 사용자가 특정 항목을 실행하면 웹 페이지에서 평균값을 볼 수도 있습니다. 세부 사항에 관심이 있으면 링크를 클릭하여 볼 수 있습니다. 최종 결과는 다음과 같습니다. 🎜🎜![1531471455691990.png 355591978 -5b484ee3e3c0f_articlex[1].png](https://img.php.cn//upload/image/612/878/944/1531471455691990.png?x-oss-process=image/resize,p_40)

환경 설정
🎜노드 8 설치🎜🎜종속성 패키지 설치🎜async function run(timestamp, num) { let chromeOpt = await launchChrome(); let result = await lighthouseRunner(chromeOpt); let report = genReport(result); await printer.write(report, 'html', `./cases/lighthouse-report@${timestamp}-${num}.html`); return result.lhr.audits['first-meaningful-paint'].rawValue; await chrome.kill(); }
구성
🎜프로젝트 루트 디렉터리에 Lighthouse 생성 구성 파일lighthouse-config.js
, 여기서는 모두 기본 구성을 사용합니다. 기본 구성을 사용하려면 구성에서 extends: 'lighthouse:default'
를 선언해야 합니다. 파일. 🎜gulp.task('start', async function() { let timestamp = Date.now(); let spent = []; for(let i=0; i🎜더 자세한 구성 옵션이 필요한 경우 다음을 참조하세요.🎜🎜🎜🎜이 문서의 대부분은 명령줄 매개변수를 Node🎜🎜🎜🎜제한에 사용할 수도 있습니다. 🎜🎜🎜🎜Default Config 특정 기본 구성 매개변수 🎜🎜🎜🎜웹 페이지 테스트는 다양한 네트워크 속도를 시뮬레이션하고 🎜🎜🎜🎜Emulation은 프로젝트의 다양한 장치 🎜🎜🎜<h4 id="Coding">Coding</h4>🎜을 시뮬레이션합니다. 루트 디렉터리 <code>gulpfile.js</code>를 생성하고 먼저 모든 종속 도구를 도입합니다: 🎜<pre class="brush:php;toolbar:false">gulp start🎜 Lighthouse 사용을 시작하기 전에 먼저 파일을 작성하는 메서드를 생성하여 최종적으로 사용자 정의 보고서 파일을 생성합니다: 🎜
nbsp;html> <meta> <meta> <title>Lighthouse Summary Report</title> <style> body { font-family: sans-serif; } table { margin: auto; } tr { border: 1px solid grey; } h1 { text-align: center; margin: 30px auto 50px auto } </style>
Case No. | First Meaningful Paint | Link To Details |
---|
--headless
는 브라우저 창을 열지 않음을 의미합니다. 🎜rrreee🎜Chrome 인스턴스가 시작된 후 Lighthouse를 호출할 수 있습니다. 호출 시 성능 테스트가 필요한 웹사이트, 매개변수 및 이전에 생성된 구성을 제공해야 합니다. 매개변수에는 Chrome 시작 포트, 시작 방법(그것인지 여부)이 포함됩니다. 머리가 없습니다 등). 🎜rrreee🎜Lighthouse의 반환 결과는 성능 테스트 결과, 구성 매개변수의 최종 버전, 표시기 그룹화 및 기타 정보가 포함된 json 객체입니다. 독자는 더 깊은 이해를 위해 결과 이해를 참조할 수 있습니다. 보고서를 생성하려면 공식 Lighthouse 템플릿을 사용해야 하므로 공식 메소드를 호출합니다. 첫 번째 매개변수는
result.lhr
에 전달되고 두 번째 매개변수는 다음과 같이 선언됩니다. html 보고서를 생성합니다(csv 및 기타 형식의 보고서도 생성할 수 있습니다). 🎜rrreee🎜 다음으로 위의 메서드를 하나로 묶는 함수를 작성합니다. 먼저 Chrome 인스턴스를 시작한 다음 Chrome 인스턴스의 일부 매개변수를 Lighthouse에 전달하고 Lighthouse에서 실행한 결과를 사용하여 보고서를 생성한 다음 HTML로 작성합니다. html 파일에는 고유 식별자로 타임스탬프와 실행 순서가 있어야 합니다. start
메소드는 결과에 first-meaningful-paint
를 반환합니다(이것이 우리가 가장 우려하는 지표입니다. 독자는 자신의 필요에 따라 이를 교체할 수 있습니다. 특정 지표의 경우 , 등대를 참조하세요). 🎜async function run(timestamp, num) { let chromeOpt = await launchChrome(); let result = await lighthouseRunner(chromeOpt); let report = genReport(result); await printer.write(report, 'html', `./cases/lighthouse-report@${timestamp}-${num}.html`); return result.lhr.audits['first-meaningful-paint'].rawValue; await chrome.kill(); }
下面, 我们可以正式开始写一个 gulp task 啦,首先获得当前时间戳,用于最终生成的报告命名,然后声明一个数组,用于记录每次跑 Lighthouse 生成的 first-meaningful-paint
毫秒数,然后跑10次 Lighthouse, 使用提前创建的模板文件,根据这10的结果,生成一个汇总报告,这里,笔者使用了Lighthouse对外暴露的工具函数进行字符串的替换。
gulp.task('start', async function() { let timestamp = Date.now(); let spent = []; for(let i=0; i<p>最后的最后, 执行:</p><pre class="brush:php;toolbar:false">gulp start
万事大吉。
附上汇总界面的模板源码:
nbsp;html> <meta> <meta> <title>Lighthouse Summary Report</title> <style> body { font-family: sans-serif; } table { margin: auto; } tr { border: 1px solid grey; } h1 { text-align: center; margin: 30px auto 50px auto } </style>
Case No. | First Meaningful Paint | Link To Details |
---|
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
jQuery+AJAX+PHP+MySQL开发搜索无跳转无刷新的功能
关于vue中extend,mixins,extends,components,install的操作
위 내용은 NodeJS + Lighthouse + Gulp를 사용하여 자동화된 웹사이트 성능 테스트 도구를 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
