前置知识
- Lighthouse 提供了一个命令行工具和一个可嵌入到 Chrome 浏览器中的开发者工具扩展,可以用于在不同的环境中评估网页。它执行一系列自动化测试,并根据一组预定义的标准和指南生成报告,其中包含了关于网页在不同方面的表现的详细信息
- Lighthouse 报告通常包括以下几个主要指标和类别:
- 性能(Performance): 评估网页的加载性能,包括页面加载时间、资源加载时间、首次渲染时间等。
- 可访问性(Accessibility): 检查网页的可访问性,包括是否符合 Web Content Accessibility Guidelines (WCAG) 等规范。
- 最佳实践(Best Practices): 检查网页是否遵循最佳实践,包括安全性、HTTPS 使用、资源优化等。
- SEO(Search Engine Optimization): 评估网页在搜索引擎优化方面的表现,包括页面标题、元描述、结构化数据等。
- Puppeteer 是一个 Node.js 库,它提供了一个高级 API 来通过 Headless Chrome(无头浏览器)控制和操作浏览器。它是由 Google Chrome 团队开发和维护的工具,可以用于实现许多自动化任务,包括网页截图、生成 PDF、爬取数据、模拟用户操作等
- Puppeteer 的主要特点和用途包括:
- 控制浏览器: Puppeteer 允许您在无头模式下控制 Chrome 浏览器的各个方面,如页面导航、表单提交、用户交互等。
- 网页截图和生成 PDF: 您可以使用 Puppeteer 在浏览器中加载网页,并将网页内容保存为截图或生成 PDF 文件。
- 自动化测试: Puppeteer 可以用于执行自动化测试,模拟用户在浏览器中的交互和行为。
- 数据爬取: 您可以使用 Puppeteer 来爬取网站上的数据,模拟用户访问和操作,然后提取所需的信息。
- 性能分析: Puppeteer 可以用于分析网页的性能指标,帮助您识别性能瓶颈和优化机会。
- 页面预渲染: 在一些情况下,Puppeteer 可以用于生成静态的预渲染页面,以加速首次加载。
Lighthouse使用
const fs = require('fs')
const lighthouse = require('lighthouse')
const chromeLauncher = require('chrome-launcher')
async function start() {
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] })
const options = {
logLevel: 'info',
output: 'html',
onlyCategories: ['performance'],
port: chrome.port,
}
const runnerResult = await lighthouse('https://news.baidu.com/', options)
const reportHtml = runnerResult.report
fs.writeFileSync('lhreport.html', reportHtml)
console.log('报告已完成,地址为:', runnerResult.lhr.finalUrl)
console.log(
'性能得分为:',
runnerResult.lhr.categories.performance.score * 100
)
await chrome.kill()
}
start()

配合Puppeteer使用
const chromeLauncher = require('chrome-launcher')
const puppeteer = require('puppeteer')
const lighthouse = require('lighthouse')
const config = require('lighthouse/lighthouse-core/config/lr-desktop-config.js')
const reportGenerator = require('lighthouse/report/generator/report-generator')
const request = require('request')
const util = require('util')
const fs = require('fs')
async function start() {
const opts = {
logLevel: 'info',
output: 'json',
disableDeviceEmulation: true,
defaultViewport: {
width: 1200,
height: 900,
},
chromeFlags: ['--disable-mobile-emulation'],
}
const chrome = await chromeLauncher.launch(opts)
opts.port = chrome.port
const resp = await util.promisify(request)(
`http://localhost:${opts.port}/json/version`
)
const { webSocketDebuggerUrl } = JSON.parse(resp.body)
const browser = await puppeteer.connect({
browserWSEndpoint: webSocketDebuggerUrl,
})
page = (await browser.pages())[0]
await page.setViewport({ width: 1200, height: 900 })
await page.goto('https://news.baidu.com/')
console.log(page.url())
const report = await lighthouse(page.url(), opts, config).then((results) => {
return results
})
const html = reportGenerator.generateReport(report.lhr, 'html')
const json = reportGenerator.generateReport(report.lhr, 'json')
await browser.disconnect()
await chrome.kill()
fs.writeFile('report.html', html, (err) => {
if (err) {
console.error(err)
}
})
fs.writeFile('report.json', json, (err) => {
if (err) {
console.error(err)
}
})
}
start()