在动手优化之前,必须先量化当前的性能指标。盲目优化只会浪费时间。我们将使用 Chrome 自带的 Lighthouse 进行精准诊断,它能提供详细的性能、可访问性、最佳实践和 SEO 评分。
为了避免浏览器插件带来的干扰,建议直接在命令行使用 Lighthouse。首先确保你已经安装了 Node.js 环境,然后执行以下命令全局安装 Lighthouse:
```bash npm install -g lighthouse ```安装完成后,在终端运行以下命令对你的网站进行全方位扫描。将 `https://your-website.com` 替换为你的实际域名:
```bash lighthouse https://your-website.com --view --preset=desktop --throttling-method=devtools ```参数说明:`--view` 会自动生成并在浏览器中打开 HTML 报告;`--preset=desktop` 模拟桌面端环境;`--throttling-method=devtools` 模拟 4G 网络环境下的加载速度。重点关注报告中的 Largest Contentful Paint (LCP) 和 Total Blocking Time (TBT),这是本文优化的核心指标。
图片通常占据页面总大小的 60% 以上。优化图片是提升加载速度性价比最高的手段。
对于非首屏可见的图片,必须推迟加载。现代浏览器已经原生支持懒加载,无需引入笨重的 jQuery 插件。直接在 `` 标签中添加 `loading` 属性即可:
```
注意:务必显式设置 `width` 和 `height` 属性,这能防止页面布局在图片加载时发生抖动,提升 Cumulative Layout Shift (CLS) 指标。
WebP 格式相比 JPEG 能减少 30% 以上的体积。在 Nginx 配置中开启图片自动转换,或者在构建时使用工具转换。这里提供一个 Node.js 脚本,使用 `sharp` 库批量将项目中的图片转为 WebP:
首先安装依赖:
```bash npm install sharp glob --save-dev ```创建 `convertImages.js`:
```javascript const sharp = require('sharp'); const glob = require('glob'); const fs = require('fs'); glob('src/images//.{jpg,png}', (err, files) => { files.forEach(file => { const newFile = file.replace(/\.(jpg|png)$/, '.webp'); sharp(file) .webp({ quality: 80 }) // 质量设为80,在体积和清晰度间取得平衡 .toFile(newFile) .then(() => console.log(`Converted ${file} to ${newFile}`)) .catch(err => console.error(err)); }); }); ```在 `package.json` 的 scripts 中添加 `"convert": "node convertImages.js"`,运行 `npm run convert` 即可生成 WebP 图片。HTML 中使用 `
无论前端如何优化,如果 HTTP 请求没有压缩且不利用缓存,速度依然会很慢。以下是 Nginx 的核心配置,直接修改 `nginx.conf` 或对应的站点配置文件。
Brotli 比 Gzip 压缩率更高,优先开启。首先确保 Nginx 安装了 `ngx_brotli` 模块。在 `http` 块中添加以下配置:
```nginx Gzip 配置 gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; 压缩级别,1-9,6为推荐值,平衡CPU和速度 gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; Brotli 配置 (需安装模块) brotli on; brotli_comp_level 6; brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; ```对于哈希命名的静态资源(如 `main.a1b2c3.js`),文件名变化即内容变化,可以设置极长的缓存时间。在 `server` 块中添加:
```nginx location ~ \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; 缓存一年 add_header Cache-Control "public, immutable"; access_log off; 关闭静态资源日志,减少IO } ```注意:HTML 文件绝对不能设置强缓存,必须协商缓存或每次都从服务器拉取,否则用户无法获取新版本。配置如下:
```nginx location ~ \.html$ { add_header Cache-Control "no-cache, no-store, must-revalidate"; } ```针对构建工具(以 Webpack 5 为例)和运行时环境进行深度配置。
不要将所有代码打包成一个巨大的 `vendor.js`。利用 SplitChunksPlugin 将第三方库和业务代码分离。在 `webpack.config.js` 中配置:
```javascript module.exports = { // ... optimization: { splitChunks: { chunks: 'all', cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, priority: -10, reuseExistingChunk: true, }, default: { minChunks: 2, priority: -20, reuseExistingChunk: true, }, }, }, }, }; ```生产环境构建必须开启 Tree Shaking 和压缩。确保 `mode` 设置为 `production`。同时,在 `package.json` 中配置 `sideEffects`,告诉 Webpack 哪些文件可以安全地被剔除:
```json { "name": "your-project", "sideEffects": [ ".css", ".scss" ] } ```对于关键的第三方域名(如 CDN、API 域名),使用 DNS 预解析和预连接。在 HTML `
` 中添加: ```html ```对于首屏渲染必须用到的关键 JS 或 CSS,使用 `preload`:
```html ```自定义字体往往会阻塞文字渲染(FOIT 现象)。使用 `font-display: swap` 让浏览器先显示系统字体,待自定义字体下载完成后立即切换,保证内容可读性。
在你的 CSS 文件中修改 `@font-face` 声明:
```css @font-face { font-family: 'MyCustomFont'; src: url('my-font.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; / 关键配置 / } ```只引入你实际用到的字符集。如果你只使用英文字符,不要引入包含几万个汉字的中文字体包。可以使用 `subfont` 或在线工具生成子集字体。
完成以上所有步骤后,清理浏览器缓存并再次运行 Lighthouse 检测。通常情况下,LCP 指标能从 3-4 秒降低至 1.2 秒以内,性能评分将达到 90 分以上。请务必逐项检查配置文件中的每一行代码,确保 MIME 类型定义正确,缓存策略没有覆盖到 HTML 文件,这样才能在不破坏业务逻辑的前提下实现极速加载。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图