前端开发的发展(4):框架与工程化时代(2010s)

134 阅读13分钟

初步认识

背景:为什么需要“框架”和“工程化”?

在 2000s Web2.0 爆发之后,互联网应用变得越来越复杂:

  • 页面从简单的博客、论坛 → 变成大型应用(电商、社交、地图、协作工具)。
  • 前端逻辑不再只是“表单校验 + Ajax”,而是要承载复杂的 状态管理、模块化交互
  • 开发团队变大,协作需求增强,单纯写 JS + jQuery 已经无法维持。

核心问题:

  1. 代码可维护性差:DOM 操作凌乱,逻辑分散在各个文件。
  2. 模块化不足:JS 文件越写越大,没有清晰的组织方式。
  3. 重复造轮子:每个团队都在写类似功能(组件、工具函数)。
  4. 构建流程落后:没有打包、压缩、自动化工具,性能和效率低。

于是,前端开始走向“框架化”和“工程化”。


框架的兴起:解决“复杂交互”的难题

1. AngularJS(2010)
  • Google 出品,提出了 MVVM 思想:数据和视图自动绑定。
  • 开发者只需要维护数据,框架自动刷新页面 → 大幅简化 DOM 操作。
  • 缺点:性能一般,学习曲线陡峭,但理念影响深远。
2. Backbone.js(2010)
  • 提供 模型(Model)、视图(View)、路由(Router)
  • 是最早推动“前端应用架构化”的框架之一。
3. React(2013)
  • Facebook 推出,引入 虚拟 DOM:用 JS 模拟 DOM,再一次性批量更新。
  • 组件化开发(UI = function(state))。
  • 思想革命:把前端逻辑拆成“一个个可复用的组件”,彻底改变开发方式。
4. Vue(2014)
  • 尤雨溪开发,结合 Angular 的易用性 + React 的思想。
  • 双向绑定 + 组件化 + 简洁 API → 快速流行,尤其在中国。

👉 这一时期,框架解决的主要是:

  • 代码结构化(组件化 / MVVM)。
  • 状态与视图同步
  • 复杂应用可维护性

工程化的兴起:解决“协作和效率”的难题

随着前端应用越来越大,单靠“写 JS 文件”已经不够。于是“工程化”工具应运而生。

1. 模块化方案
  • 早期 JS 没有模块系统,只能靠 <script> 一个个引入,很容易冲突。

  • 解决方案:

    • CommonJS(Node.js 推广)
    • AMD / RequireJS(浏览器端模块加载)
    • ES6 Module(2015) → 标准化
2. 构建工具
  • Grunt/Gulp(2012-2013) :任务流工具(压缩、打包、编译)。
  • Webpack(2014) :革命性工具,支持 模块打包 + 代码拆分 + Loader/Plugin,成为前端工程化核心。
3. 包管理
  • npm(Node.js 生态)。
  • Bower → 淘汰
  • 后来 Yarn、pnpm 提升了效率和一致性。
4. 自动化与测试
  • 自动化构建(CI/CD)。
  • 前端单元测试(Jest、Mocha)。
  • Lint / Prettier → 保证团队代码风格一致。

前后端分离(2010s 的重大转折)

  • 过去:后端负责渲染 HTML,前端只是“页面美化 + 脚本”。

  • 变化:随着 Ajax、SPA(单页应用)兴起 → 前端开始独立承担“视图层”。

  • 模式

    • 前端 → 调用后端提供的 RESTful API(JSON 数据)。
    • 后端 → 只负责业务逻辑和数据存储。
  • 意义:前端彻底成为“应用开发者”,而不是“页面维护者”。


影响与总结

技术影响
  • 前端逐渐拥有完整的软件工程体系:模块化、组件化、自动化、工程化。
  • React/Vue/Angular 三大框架奠定格局。
  • 工具链(Webpack、npm、Babel)成为标配。
观念影响
  • 前端工程师地位上升:不再是“切图仔”,而是和后端平等的工程角色。
  • 前端团队独立化,甚至出现 前端架构师
生态影响
  • 大量公司开始基于前端框架搭建复杂应用(电商平台、后台管理系统、社交网络)。
  • 前端岗位需求爆发式增长。

总结一下:
2010s 是前端的黄金十年
它完成了从“写页面” → “做应用” → “工程化体系”的转型,奠定了今天 Vue/React/Angular 三分天下、前后端分离、模块化打包的格局。


2000s(动态交互时代) 和 2010s(框架与工程化时代) 的核心差异

开发模式

  • 2000s 动态交互时代

    • 前端主要职责:HTML + CSS + JS(以 jQuery 为代表)。
    • 页面交互依赖 Ajax,但逻辑仍然分散,主要是“脚本拼接 DOM”。
    • 页面状态管理混乱:数据、DOM、事件耦合。
  • 2010s 框架与工程化时代

    • 前端职责提升:不只是页面美化,而是 独立承担应用的视图层
    • 开发模式转向 组件化:UI 拆成一个个独立组件(React、Vue)。
    • 数据驱动视图:DOM 不再手动操作,而是根据数据状态自动更新。

👉 差异本质
从“面向 DOM 编程” → “面向数据和组件编程”。


工具与技术

  • 2000s

    • JS 脚本直接写在页面里,依赖 <script> 一个个引入。
    • 没有模块化(CommonJS/ESM 尚未普及)。
    • 没有打包工具,部署就是“丢一堆 JS/CSS/HTML 文件到服务器”。
  • 2010s

    • 模块化成为标准(CommonJS、ES Module)。
    • 出现构建工具链:Webpack、Babel、npm、Yarn。
    • 工程化工具支持压缩、打包、转译(ES6 → ES5)、热更新、代码检查。
    • 开发体验飞跃:本地开发服务器、自动刷新、CI/CD。

👉 差异本质
从“无序文件堆” → “模块化 + 自动化的工程体系”。


前后端关系

  • 2000s

    • 前后端未分离:后端模板渲染 HTML,前端只补充交互。
    • Ajax 只是“小帮手”,大部分页面仍然靠整页刷新。
    • 前端工程师更多被看作“页面实现人员”。
  • 2010s

    • 前后端彻底分离:后端只提供数据 API(JSON),前端框架渲染页面。
    • SPA(单页应用)成为主流:前端自己负责路由和状态管理。
    • 前端工程师成为独立角色,负责整个应用的用户体验。

👉 差异本质
从“后端主导、前端附属” → “前后端平等协作”。


页面体验

  • 2000s

    • Ajax 提升体验,但仍需频繁整页刷新。
    • 局部刷新有限,交互相对割裂。
    • 页面像“带交互的电子文档”。
  • 2010s

    • SPA + 组件化 + 虚拟 DOM → 页面无刷新切换流畅。
    • 体验接近桌面应用/原生应用。
    • 大量 WebApp、移动 Web、响应式网站出现。

👉 差异本质
从“网页” → “Web 应用”。


团队协作与生产力

  • 2000s

    • 前端团队人数少,往往隶属于后端团队。
    • 没有统一的开发规范,代码风格随人而异。
    • 测试、部署依赖手工操作。
  • 2010s

    • 前端团队独立化,出现专门的“前端架构师”。
    • 规范化工具(ESLint、Prettier、TypeScript)普及。
    • 自动化测试、持续集成、自动部署成为标配。
    • 开源生态爆炸,前端框架/组件库层出不穷。

👉 差异本质
从“小作坊” → “专业化工程团队”。


总结对比表格

维度动态交互时代(2000s)框架与工程化时代(2010s)
开发模式DOM 操作 + 脚本拼接数据驱动 + 组件化
技术工具jQuery、AjaxReact、Vue、Webpack、npm、Babel
模块管理无模块化ES Module、打包工具
前后端关系后端主导,前端附属前后端分离,前端独立
页面体验整页刷新 + 局部 Ajax单页应用,流畅交互
团队协作手工化,无规范工程化,规范化,CI/CD

总结一下:
2000s 的前端像“小刀小剪”——能裁剪页面、加点交互;
2010s 的前端则像“工厂流水线”——有框架、有工具、有分工,能独立构建复杂应用。


2010s 内部的发展阶段演化(Angular → React → Vue → 工程化工具链爆发)

2010s 被称为 “前端爆炸十年” ,核心变化是 从“能用”到“工程化”,从“拼补丁”到“体系化”

1. 前端技术的起点(2010s 初期,jQuery → AngularJS)

  • 当时的背景

    • 2000s 后期,Ajax 已经普及,但开发方式依旧是“脚本堆砌”。
    • jQuery 成为事实标准(操作 DOM、做动画、写 Ajax 请求)。
    • 但随着需求复杂化(Gmail、地图应用),前端代码量急剧膨胀。
    • 问题:页面逻辑与 DOM 操作严重耦合,代码难维护。
  • AngularJS(2010)

    • Google 推出 AngularJS,第一次将“MVVM”模式带到前端。

    • 提供:

      • 双向数据绑定:数据改,UI 自动改;UI 改,数据也同步。
      • 依赖注入:像后端框架一样写前端。
      • 指令系统:声明式扩展 HTML。
    • 意义:

      • 从“命令式 DOM 操作” → “声明式绑定”。
      • 前端第一次有了类似后端 MVC 的架构思维。
    • 局限:

      • 过度魔法化,性能瓶颈(脏检查),学习曲线陡峭。

2. 思维大转折:React(2013)

  • 背景问题

    • AngularJS 虽然流行,但在大规模应用(Facebook、Twitter)下,性能和可维护性不足。
    • 大型 WebApp 需要更高效的 UI 渲染机制。
  • React 出现(Facebook 出品)

    • 核心思想

      • UI = f(state) (声明式 UI 哲学):UI 是状态的函数。
      • 虚拟 DOM(Virtual DOM) :不直接操作真实 DOM,而是先生成虚拟树,再批量高效更新。
      • 组件化:一切都是组件,可复用、可组合。
    • 意义:

      • 前端开发进入 函数式思维,把 UI 看成纯函数。
      • 彻底改变了“如何组织 UI 代码”的方式。
  • 思维飞跃

    • AngularJS:在命令式与声明式之间摇摆。
    • React:极端声明式,甚至提出 单向数据流(避免双向绑定混乱)。

3. 社区接力:Vue(2014)

  • 背景

    • AngularJS 太复杂,React 太前卫(JSX 一开始被很多人嫌弃)。
    • 需要一个“轻量、易学、灵活”的框架。
  • Vue 的诞生(尤雨溪,前 Google 工程师)

    • 借鉴 Angular 的模板语法(v-model、指令)。

    • 借鉴 React 的组件化和虚拟 DOM。

    • 加入更符合“直觉”的 API(易上手,渐进式框架)。

    • 意义:

      • 前端三驾马车(Angular、React、Vue)正式形成。
      • Vue 把前端开发带入更大众的层面,尤其在中小企业和个人开发者中爆发。

4. 工程化时代爆发(2015+)

  • 背景

    • 随着框架成熟,前端项目规模持续膨胀。

    • 问题:

      • 模块管理混乱(以前靠 <script> 引入 JS 文件)。
      • 打包优化缺失(体积过大,性能差)。
      • 团队协作缺乏规范(代码风格、构建流程)。
  • 工程化工具链兴起

    • Webpack(2015 崛起)

      • 模块打包,支持 ES6 import。
      • 支持代码分割(按需加载)。
      • Loader + Plugin 体系,几乎万能。
    • npm/yarn:前端包管理成熟化。

    • Babel:ES6+ 代码转换。

    • Lint/Prettier:团队协作规范化。

    • 后期(2018+)出现新工具

      • Parcel(零配置打包)
      • Rollup(专注库打包)
      • Vite(基于 ES Module + 浏览器原生能力,极快开发体验)。
  • 核心变化

    • 从“框架思维” → “全链路工程思维”。
    • 前端不只是写 UI,而是需要考虑 构建、部署、优化、协作、监控 等完整体系。

5. 总结:2010s 的迭代逻辑

阶段核心代表解决问题思维方式
2010 初期jQuery → AngularJSDOM 操作混乱、代码难维护从命令式 → 声明式,前端开始像后端
2013ReactUI 性能 & 复杂应用UI = f(state),虚拟 DOM,组件化,单向数据流
2014Vue上手难度高 & 社区需求渐进式、易学,结合优点
2015+Webpack、工程化工具大型应用开发痛点模块化、构建优化、全链路工程化

总结一下 ****2010s
前端从“会写 JS 脚本”进化到“能写大规模应用”,从“堆代码”变成“工程体系”。


模块化与工程化的关系

2010s 的核心是“模块化”和“工程化” ,两者不是并列孤立的,而是有先后关系和内在递进的。

先有“模块化”,才有“工程化”

背景(2000s 的痛点)
  • 页面越来越复杂,动辄几十上百个 JS 文件。
  • 依赖顺序要手工控制(先引 jQuery,再引插件;先引核心,再引扩展)。
  • 全局变量满天飞,函数命名冲突严重。
  • 没有模块化 = 代码复用难,维护成本极高。
模块化的演化
  1. 无模块时代

    • <script src="xxx.js"> 顺序加载,靠人记忆和文档规范。
  2. 社区规范:CommonJS / AMD / CMD(2009-2012)

    • CommonJS(Node.js 采用):require('module'),模块在加载时执行。
    • AMD(RequireJS):适合浏览器,异步加载模块。
    • CMD(SeaJS):国人提出,延迟执行模块。
  3. 原生标准化:ES6 Module(2015)

    • import / export,语言级支持。
    • 静态依赖分析(编译期即可确定依赖关系)。
    • 统一了前后端模块化生态。

👉 结论:模块化解决了“代码组织和依赖管理”的问题,为规模化开发打下基础。


工程化是在模块化基础上发展出来的

为什么需要“工程化”?
  • 模块化之后,开发体验改善了,但生产环境还有很多痛点:

    • 浏览器不直接支持 ES6 Module(需要转译)。
    • 依赖过多,HTTP 请求数爆炸。
    • 大型应用要按需加载,不然首屏太慢。
    • 团队协作需要统一规范(代码风格、构建、测试、部署)。
工程化的表现
  • 构建工具链

    • Webpack(2015) :把所有模块(JS、CSS、图片)都视为依赖,统一打包 → 单文件或分块。
    • Babel:转译新语法,兼容老浏览器。
    • Tree-shaking:只打包用到的代码,减少体积。
    • 代码分割(Code Splitting) :按需加载,提升性能。
  • 工程实践

    • 包管理(npm、yarn)。
    • 代码规范(ESLint、Prettier)。
    • 测试(Jest、Mocha)。
    • 自动化(CI/CD、持续集成)。
    • 前端框架 + 工程工具形成完整生态。

👉 结论:工程化解决了“如何让模块化代码在团队和生产环境里跑得更快、更稳、更规范”的问题。


两者关系总结

  • 模块化:是代码层面的基础设施,解决“怎么组织和调用代码”。

  • 工程化:是开发到上线的全流程体系,解决“怎么高效、规范、稳定地把项目做出来”。

  • 关系

    • 模块化 → 是前提,奠定代码组织方式。
    • 工程化 → 是扩展,把模块化代码带到实际生产和团队协作中。

可以这么类比:

  • 模块化像是“有了砖头和积木,能搭房子”。
  • 工程化像是“有了施工队、建筑图纸、吊车和监理,能盖摩天大楼”。

总结一下:
2010s模块化奠定了前端开发的“代码组织”基础,而工程化把它推向了“规模化、体系化”的新高度。没有模块化,工程化无从谈起;有了工程化,前端才真正走上“工业级生产”的道路。