前端性能优化:Bootstrap 最佳实践
2026-03-25 ·
Bootstrap 因功能丰富常被诟病"太重",完整编译的 CSS 约 200KB+,JS 约 70KB。但通过合理的优化策略,可以大幅减小体积而不牺牲开发效率。本文分享 6 个经过验证的性能优化实践。
1. 按需引入 Sass 模块
这是最有效的优化手段。不要使用一个 @import "bootstrap" 引入全部代码,而是只引入你实际使用的模块:
// 核心依赖(必须)
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/variables-dark';
@import 'bootstrap/scss/maps';
@import 'bootstrap/scss/mixins';
@import 'bootstrap/scss/root';
// 按需引入
@import 'bootstrap/scss/reboot';
@import 'bootstrap/scss/type';
@import 'bootstrap/scss/grid';
@import 'bootstrap/scss/buttons';
@import 'bootstrap/scss/forms';
@import 'bootstrap/scss/navbar';
@import 'bootstrap/scss/cards';
@import 'bootstrap/scss/modal';
// 不需要的不引入
经过按需引入,一个典型的项目 CSS 可以从 200KB 压缩到 40-60KB,减少约 70%。
2. JavaScript 按需加载
如果你只使用少数 JavaScript 组件,可以单独引入对应的 JS 文件,而不是整个 bootstrap.bundle.min.js:
<!-- 不引入 bundle,单独引入需要的组件 -->
<script src="bootstrap/js/dist/alert.min.js"></script>
<script src="bootstrap/js/dist/modal.min.js"></script>
<script src="bootstrap/js/dist/dropdown.min.js"></script>
<script src="bootstrap/js/dist/collapse.min.js"></script>
也可以使用 ES Module 方式按需导入:
import { Modal, Dropdown, Collapse } from 'bootstrap'
const myModal = new Modal('#exampleModal')
3. 使用 CDN 并启用 Brotli 压缩
Bootstrap 官方 CDN 已经启用了 Brotli 压缩。使用 CDN 可以获得以下好处:
- 利用浏览器缓存,用户访问其他使用 Bootstrap CDN 的网站时无需重复下载
- CDN 的边缘节点提供更快的网络传输
- Brotli 压缩比 gzip 再小约 20%
<!-- 使用 CDN + 完整性校验 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
rel="stylesheet" crossorigin="anonymous">
4. 移除未使用的 CSS(PurgeCSS)
即使按需引入模块,依然可能存在未使用的样式。使用 PurgeCSS 可以移除未使用的 CSS 类:
// 结合构建工具使用 PostCSS + PurgeCSS
const purgecss = require('@fullhuman/postcss-purgecss')({
content: ['./src/**/*.html', './src/**/*.js'],
safelist: ['was-validated', 'is-valid', 'is-invalid']
})
注意:PurgeCSS 是基于文本匹配的,动态拼接的类名(如 btn-${variant})需要加入 safelist。
5. 懒加载非关键资源
对于首屏不需要的资源,使用懒加载策略:
<!-- 非关键 CSS 延迟加载 -->
<link rel="preload" href="non-critical.css" as="style"
onload="this.onload=null;this.rel='stylesheet'">
<!-- 图片懒加载 -->
<img src="placeholder.jpg" data-src="real-image.jpg"
loading="lazy" class="lazy" alt="...">
<!-- Defer JS 加载 -->
<script src="bootstrap.min.js" defer></script>
6. 优化字体加载
如果使用自定义字体,字体文件可能占据页面加载体积的很大一部分:
- 使用
font-display: swap 避免 FOIT(Flash of Invisible Text)
- 只加载需要的字重和字符集
- 使用 woff2 格式(比 woff 小约 30%)
- 使用
preload 提前加载字体
@font-face {
font-family: 'MyFont';
src: url('myfont.woff2') format('woff2');
font-display: swap;
}
性能优化检查清单
| 优化项 | 预估效果 | 实施难度 |
| 按需引入 Sass 模块 | CSS 体积减少 60-70% | 中等 |
| JS 按需导入 | JS 体积减少 30-80% | 低 |
| CDN + Brotli | 传输体积减少 20% | 低 |
| PurgeCSS | CSS 体积再减少 20-40% | 中等 |
| 懒加载 | 首屏加载减少 30-50% | 中等 |
| 字体优化 | 字体加载减少 50-70% | 低 |
7. Tree Shaking Bootstrap JavaScript
如果你使用 Webpack、Vite 或 Rollup 等构建工具,Tree Shaking 可以自动移除未使用的 JavaScript 代码,进一步减小打包体积:
// 只导入需要的组件
import {
Modal,
Dropdown,
Tooltip,
Popover,
Collapse,
Tab,
} from 'bootstrap'
推荐在 Vite 项目中使用以下配置:
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
optimizeDeps: {
include: ['bootstrap'],
},
build: {
rollupOptions: {
output: {
manualChunks: {
bootstrap: ['bootstrap'],
},
},
},
},
})
在 Vite 项目中正确配置 Tree Shaking 后,如果只使用 Modal 和 Dropdown 两个组件,Bootstrap JS 体积可以从 70KB 降至约 15KB。
8. 关键 CSS 提取
关键 CSS(Critical CSS)是指首屏渲染所必需的样式。将其内联在 <head> 中,其余样式延迟加载,可以显著提升首次内容绘制(FCP)和 Largest Contentful Paint(LCP)指标。
使用 Critical 工具生成关键 CSS:
// 安装 npm install -D critical
const critical = require('critical').stream
// gulp 示例
gulp.src('dist/*.html')
.pipe(critical({
base: 'dist/',
inline: true,
css: ['dist/css/bootstrap.min.css'],
width: 1300,
height: 900,
}))
.pipe(gulp.dest('dist'))
内联关键 CSS 后的 HTML 结构:
<head>
<style>
/* 关键 CSS 内联在此处 */
.navbar { ... }
.hero { ... }
.btn { ... }
</style>
<!-- 非关键 CSS 延迟加载 -->
<link rel="preload" href="bootstrap.min.css" as="style"
onload="this.onload=null;this.rel='stylesheet'">
</head>
对于大多数 Bootstrap 项目,首屏关键 CSS 通常只占全部样式的 10-20%,这意味着内联关键 CSS 可以将首屏渲染需要的 CSS 从 200KB 降至 20-40KB。
9. 性能优化效果基准测试
为了验证优化效果,以下是同一 Bootstrap 项目在优化前后的性能对比数据:
| 指标 | 优化前 | 优化后 | 提升幅度 |
| CSS 体积(未压缩) | 210 KB | 35 KB | 83% |
| CSS 体积(gzip) | 28 KB | 6 KB | 79% |
| JS 体积(未压缩) | 72 KB | 18 KB | 75% |
| JS 体积(gzip) | 18 KB | 5 KB | 72% |
| FCP(首次内容绘制) | 2.1 s | 0.9 s | 57% |
| LCP(最大内容绘制) | 3.4 s | 1.5 s | 56% |
| Lighthouse 性能评分 | 58 分 | 94 分 | +36 分 |
推荐在优化过程中使用以下工具进行持续监控:
- Lighthouse:Chrome 内置的性能审计工具,提供具体的优化建议
- WebPageTest:从全球多个节点测试页面加载性能
- BundlePhobia:分析 npm 包的大小和依赖
- source-map-explorer:可视化分析打包后的 JS 代码构成
// 使用 source-map-explorer 分析打包体积
npx source-map-explorer dist/assets/*.js
// 使用 bundlesize 设置体积阈值
// package.json 中添加:
{
"bundlesize": [
{ "path": "dist/css/*.css", "maxSize": "10 kB" },
{ "path": "dist/js/*.js", "maxSize": "25 kB" }
]
}
总结
"Bootstrap 很重"的说法在合理优化之后并不成立。通过按需引入、PurgeCSS、懒加载等策略,完全可以将 Bootstrap 项目的 CSS 控制在 30-50KB,JS 控制在 20-30KB,同时享受 Bootstrap 带来的开发效率提升。性能优化不是为了极致而极致,而是在用户体验和开发效率之间找到最佳平衡点。