阅读视图

发现新文章,点击刷新页面。

从 Grunt 到 Vite:前端构建工具十几年的演化

如果你是做前端开发的,大概率接触过这些名字:

  • Grunt
  • Gulp
  • Webpack
  • Rollup
  • Parcel
  • Vite

很多人会有一个疑问:

为什么前端工具一直在换?
这些工具到底解决了什么问题?

如果把时间线拉长,你会发现这些工具并不是互相替代,而是在解决 不同阶段的工程问题

本文就从时间线和宏观视角,系统梳理前端构建工具的发展。


一、最早的问题:前端没有工程体系

在 2010 年之前,前端开发几乎没有“构建”概念。

一个典型项目结构是这样的:


index.html
style.css
app.js
jquery.js

开发流程通常是:

  1. 写 JS
  2. 手动合并文件
  3. 手动压缩
  4. 上传服务器

当项目变大之后,就出现了一些明显问题:

  • 文件越来越多
  • 代码无法自动压缩
  • 构建流程完全依赖人工
  • 项目缺乏自动化

于是第一代前端工具出现了。


二、Grunt:任务驱动的自动化工具

Grunt 是最早流行的前端自动化工具之一。

它的核心思想是:

用配置驱动任务自动执行

开发者可以配置各种任务,例如:

  • 压缩 JS
  • 编译 Sass
  • 合并文件
  • 监听文件变化

示例:

grunt.initConfig({
  uglify: {
    build: {
      src: "src/app.js",
      dest: "dist/app.min.js"
    }
  }
})

运行:

grunt build

就会自动完成任务。

Grunt 的特点

优点:

  • 提供自动化构建流程
  • 插件生态丰富
  • 可扩展

缺点:

  • 配置复杂
  • 执行速度慢
  • 每个任务都是独立进程

随着项目规模扩大,Grunt 的效率开始成为问题。

于是出现了新的工具。


三、Gulp:基于流的构建系统

Gulp 的设计目标是解决 Grunt 的性能问题。

核心思想:

使用 Node Stream(流)处理文件

文件不会被反复读写磁盘,而是通过内存流处理。

示例:

gulp.task("scripts", function () {
  return gulp.src("src/*.js")
    .pipe(uglify())
    .pipe(gulp.dest("dist"))
})

Gulp 的特点

优点:

  • 基于流处理,速度更快
  • API 更简洁
  • 代码式配置更灵活

缺点:

  • 仍然是任务工具
  • 不是模块打包工具

随着前端模块化的发展,一个新的问题出现了。


四、模块化时代:Webpack 的出现

随着以下技术的流行:

  • CommonJS
  • ES Modules
  • npm

前端代码不再是简单的脚本文件,而是 模块系统

例如:

import utils from "./utils"

浏览器当时无法直接处理这种依赖关系。

于是 Webpack 出现了。

Webpack 的核心思想是:

一切资源都是模块。

它不仅能处理 JS,还能处理:

  • CSS
  • 图片
  • 字体
  • JSON

示例:

module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "bundle.js"
  }
}

Webpack 会:

  1. 分析依赖
  2. 构建依赖图
  3. 打包成一个 bundle

Webpack 的特点

优点:

  • 强大的模块系统
  • 插件生态极其丰富
  • 支持复杂应用

缺点:

  • 配置复杂
  • 构建速度慢
  • 学习成本高

随着应用规模继续增长,Webpack 的开发体验开始成为瓶颈。


五、Rollup:为库而生的打包工具

Rollup 的目标非常明确:

打包 JavaScript 库。

它最大的特点是:

Tree Shaking

即删除未使用代码。

示例:

import { add } from "./math"

如果 math 里还有其他函数,Rollup 会自动移除。

Rollup 的特点

优点:

  • 打包结果更干净
  • 非常适合库开发
  • Tree Shaking 优秀

缺点:

  • 不适合大型应用
  • 插件生态不如 Webpack

六、零配置工具:Parcel

随着前端复杂度增加,很多开发者开始抱怨:

Webpack 配置太复杂。

于是 Parcel 出现了。

核心理念:

Zero Configuration

开发者只需要运行:

parcel index.html

Parcel 会自动:

  • 识别依赖
  • 编译代码
  • 打包资源

Parcel 的特点

优点:

  • 零配置
  • 开箱即用
  • 开发体验好

缺点:

  • 灵活性不如 Webpack
  • 社区生态较小

七、现代构建工具:Vite

随着浏览器原生支持 ES Module,新的构建模式出现了。

Vite 的核心思想是:

开发阶段不打包。

开发时:

浏览器直接加载 ES Modules

例如:

import App from "./App.js"

浏览器会直接请求这个模块。

只有在生产环境才会打包。

Vite 的特点

优点:

  • 启动极快
  • HMR 非常快
  • 配置简单

背后的关键技术是:

  • ES Modules
  • 按需编译
  • esbuild

八、构建工具的演化逻辑

如果从时间线总结,可以看到一条非常清晰的路径。

第一阶段

解决 自动化问题

工具:

  • Grunt
  • Gulp

目标:

自动化构建流程。


第二阶段

解决 模块化问题

工具:

  • Webpack
  • Rollup

目标:

管理前端模块依赖。


第三阶段

解决 开发体验问题

工具:

  • Parcel
  • Vite

目标:

提升开发速度。


九、从宏观角度看,这些工具改变了什么?

如果站在更高层看,前端构建工具的发展,其实改变了三件事。


1 前端从“脚本”变成“工程”

早期前端只是:

HTML + CSS + JS

现在前端是完整工程:

TypeScript
Sass
React
测试
构建
CI/CD

构建工具是这套工程体系的核心。


2 浏览器不再是唯一运行环境

现代前端需要支持:

  • SSR
  • SSG
  • Node
  • Edge Runtime

构建工具负责把代码转换成适合不同环境的版本。


3 开发效率革命

现代工具链带来的提升非常巨大:

  • 热更新
  • 自动打包
  • 按需加载
  • 代码拆分

大型项目开发效率因此大幅提升。


十、今天的前端构建生态

目前主流的工具格局大致是:

应用开发:

  • Vite
  • Webpack(仍然大量存在)

库开发:

  • Rollup
  • tsup
  • esbuild

新一代工具:

  • Turbopack
  • Rspack

这些工具的目标都很一致:

更快、更简单、更高效。


总结

前端构建工具的发展,大致经历了四个阶段:

1 自动化阶段(Grunt / Gulp) 2 模块化阶段(Webpack / Rollup) 3 工程化阶段(Webpack 生态) 4 极速开发阶段(Vite)

如果说一句总结的话:

前端工具的发展,本质上是在不断降低开发复杂度,同时提升工程能力。

而随着浏览器能力的增强,未来的构建工具可能会继续向 更快、更轻、更少配置 的方向发展。

CSS 这些年都经历了什么?一次看懂 CSS 的演化史

很多前端在学习 CSS 时都会有一个疑问:

为什么 CSS 会有这么多东西?
css2、css3、less、scss、css-in-js、原子 css ……
看起来像是不断在“发明新轮子”。

其实如果把时间线拉长,你会发现这些技术并不是随机出现的,而是在解决 不同阶段的工程问题

从宏观来看,CSS 的发展基本围绕三件事:

  • 提高复用能力
  • 提高可维护性
  • 提高性能与开发效率

今天我们就从时间线的角度,一步一步看看 CSS 的演化。


一、最早的 CSS:让网页变好看

Q:CSS 最初是为了解决什么问题?

答案其实非常简单:

让 HTML 和样式分离。

在早期网页中,HTML 既负责结构,又负责样式,比如:

<font color="red" size="5">Hello</font>

这种写法的问题是:

  • HTML 变得非常混乱
  • 样式无法统一管理
  • 修改成本极高

于是 CSS 诞生了。

最早的 CSS 提供的能力主要包括:

  • 选择器
  • 字体样式
  • 颜色
  • 盒模型
  • float 布局
  • position 定位

例如:

.container {
  width: 960px;
  margin: auto;
}

这一阶段的核心目标只有一个:

让网页可以优雅地控制样式。


二、CSS 变复杂之后:预处理器时代

随着网站越来越复杂,一个问题开始显现:

CSS 写起来越来越痛苦。

典型问题包括:

  • 没有变量
  • 代码重复
  • 结构混乱
  • 无法复用

于是出现了 CSS 预处理器

比较常见的有:

  • Less
  • Sass
  • SCSS

Q:预处理器解决了什么问题?

答案是:

让 CSS 拥有编程能力。

例如变量:

$primary: #1890ff;

button {
  color: $primary;
}

嵌套结构:

.card {
  padding: 20px;

  .title {
    font-size: 20px;
  }
}

Mixin 复用:

@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

预处理器的出现,让 CSS 第一次具备了 工程化能力

但问题依然存在。


三、CSS 的大问题:全局污染

当项目规模继续扩大时,一个新的问题开始困扰开发者:

CSS 是全局的。

例如:

.title {
  color: red;
}

如果项目中有多个 .title,样式就会互相污染。

于是社区提出了一种解决方案:

CSS Modules

Q:CSS Modules 是什么?

核心思想:

让 CSS 拥有局部作用域。

例如:

.title {
  color: red;
}

编译后会变成:

.title__3x82a

在 React 中使用:

import styles from "./index.module.css"

<div className={styles.title}></div>

这样就避免了:

  • 命名冲突
  • 全局污染

但 CSS Modules 仍然存在一个问题:

样式和组件仍然是分离的。


四、组件化时代:CSS-in-JS

当 React 等组件框架流行起来之后,开发者开始思考一个问题:

既然 UI 是组件,那 CSS 为什么不能也是组件的一部分?

于是出现了:

CSS-in-JS

典型写法:

const Button = styled.button`
  color: red;
  padding: 10px;
`

Q:CSS-in-JS 的优势是什么?

主要有三个:

1 作用域天然隔离

组件之间不会污染。

2 动态样式非常容易

const Button = styled.button`
  color: ${props => props.primary ? "blue" : "gray"};
`

3 完美适配组件化开发

样式和组件写在一起。

但 CSS-in-JS 也带来了新的问题:

  • 运行时性能开销
  • JS 体积变大
  • SSR 更复杂

于是前端社区又走向了另一条路线。


五、效率革命:原子 CSS

最近几年非常流行的一种方案叫:

Atomic CSS(原子 CSS)

核心思想是:

一个 class 只做一件事。

例如:

<div class="flex items-center justify-center p-4 text-red-500"></div>

每个 class 都是一个最小样式单元。

Q:原子 CSS 的优点是什么?

1️⃣ 高复用 2️⃣ 几乎没有冗余 CSS 3️⃣ 开发效率非常高 4️⃣ 编译体积很小

典型框架包括:

  • Tailwind
  • UnoCSS
  • WindiCSS

很多现代项目都会使用这种方式。


六、CSS 本身也在进化

与此同时,CSS 标准本身也在不断增强。

例如:

  • Flexbox
  • Grid
  • CSS Variable
  • Container Query
  • Nesting

例如 CSS 变量:

:root {
  --primary: red;
}

button {
  color: var(--primary);
}

很多原本需要 Sass 才能实现的能力,现在 CSS 原生就能实现了


七、从宏观角度看 CSS 的发展

如果把这些技术放在一条时间线上,其实非常清晰。

第一阶段

解决 样式问题

目标:

让网页变好看


第二阶段

解决 代码问题

工具:

  • Less
  • Sass
  • SCSS

目标:

让 CSS 更容易维护


第三阶段

解决 规模问题

工具:

  • CSS Modules
  • BEM

目标:

大型项目不混乱


第四阶段

解决 组件化问题

工具:

  • CSS-in-JS

目标:

CSS 与组件绑定


第五阶段

解决 效率和性能问题

工具:

  • Atomic CSS

目标:

写得更快,体积更小


八、真正推动 CSS 发展的三股力量

如果站在更高层看,其实是三件事在推动 CSS 进化。

1 前端项目规模爆炸

过去的网站:

几十个页面。

现在的应用:

几千个组件。

CSS 必须工程化。


2 前端框架崛起

组件化开发成为主流。

UI 不再是页面,而是 组件树

CSS 也必须适应组件化。


3 性能需求越来越高

现代网站需要:

  • SEO
  • SSR
  • SSG
  • Core Web Vitals

CSS 体积和加载速度变得非常重要。


九、现代前端通常怎么用 CSS?

现在很多项目会使用这样的组合:

Tailwind + CSS Variable

或者:

Tailwind + CSS Modules

这样可以同时获得:

  • 开发效率
  • 组件隔离
  • 高性能

十、一个有趣的趋势

很多人没有意识到一件事:

CSS 其实正在慢慢“消失”。

未来的 UI 体系更可能是:

Design Token
+
Atomic Engine
+
Runtime Layout

样式不再是手写 CSS 文件,而是由系统自动生成。

CSS 的角色,正在从“写样式”变成:

驱动 UI 渲染的底层语言。


如果这篇文章对你有帮助,欢迎点赞、转发,让更多前端一起看懂 CSS 的进化之路。

❌