跳到主要内容

前端性能优化: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%
PurgeCSSCSS 体积再减少 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 KB35 KB83%
CSS 体积(gzip)28 KB6 KB79%
JS 体积(未压缩)72 KB18 KB75%
JS 体积(gzip)18 KB5 KB72%
FCP(首次内容绘制)2.1 s0.9 s57%
LCP(最大内容绘制)3.4 s1.5 s56%
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 带来的开发效率提升。性能优化不是为了极致而极致,而是在用户体验和开发效率之间找到最佳平衡点。

本网站使用 Cookie 来提升您的浏览体验。隐私政策