现代前端开发概览
现代前端开发是指一套基于工程化、组件化、模块化和自动化工具的Web开发模式,不仅包含传统前端对页面 "视觉呈现" 和 "交互逻辑" 的实现,更强调工程化、模块化、性能优化、跨端适配以及与后端服务的高效协同,核心目标是应对复杂业务场景、提升开发效率和用户体验。

组件化
UI 被拆成一个个独立、可复用的组件,每个组件都有自己的结构(HTML)、样式(CSS)和逻辑(JS);从"页面为单位"变成"组件为单位"开发。
模块化
将一个复杂的程序根据功能或规范拆分成一个个独立的模块,每个模块内部数据/方法都是私有的,只有暴露出去的数据/方法才可以被外部访问。自ES6之后,开始使用ES module规范组织代码结构,使用import/export导入导出。
单项数据流/响应式
单项数据流:数据只能从上往下流动(父 → 子),不能反向随意改变。
JavaScript
// 示例
// Vue版
/* Parent.vue 父组件 props → 子组件 */
<Child :count="count" @update="count = $event" />
/* Child.vue 子组件不能直接改 props,必须通过事件来通知父组件 */
<button @click="$emit('update', count + 1)">+</button>
/* React 版
Props 只读(只从父到子)
状态(state)由组件自己管理
子要修改父的状态,需要父给它一个函数
*/
<!-- Parent.jsx-->
function Parent() {
const [count, setCount] = useState(0);
return <Child count={count} setCount={setCount} />;
}
<!-- Child.jsx -->
function Child({ count, setCount }) {
return <button onClick={() => setCount(count + 1)}>+</button>;
}
响应式:框架能自动追踪依赖的变量,当变量改变时,自动更新 UI。数据改变 -> UI更新。
JavaScript
/*
在Vue3中使用Proxy监听对象变化。
Vue 内部自动追踪:
哪个组件依赖了 count
当 count 变了 → 通知对应组件更新
*/
const state = reactive({ count: 0 })
state.count++ // 触发 UI 更新
/*
React:基于 state 的重新渲染
组件直接重新执行(渲染),完成更新。
依赖通过 Virtual DOM diff 确定真正需要更新的地方。
*/
const [count, setCount] = useState(1)
setCount(count + 1)
无论是单项数据流还是响应式,都是改变数据-> 视图更新。我们不再直接操作DOM,而是更新数据,DOM由框架来负责更新。
TypeScript系统类型
在 JavaScript 的基础上增加了静态类型检查,通过类型定义约束变量、函数、对象等的结构和行为,在编译阶段就能发现类型错误,提升代码的可维护性和可靠性。涵盖了基础类型、复合类型、特殊类型以及高级类型工具等。
TypeScript 类型系统是一套用于在编译阶段检查代码正确性的静态类型系统。
前后端分离、SPA、SSR
前后端分离
是一种软件内部的职责划分模式(架构模式),将应用分为前端和后端,两者使用HTTP通信。
- 前端:独立部署、运行,负责用户界面(UI)渲染、交互逻辑(如页面跳转、表单验证),通过 AJAX/Fetch 请求后端 API。
- 后端:独立部署、运行,负责数据处理、业务逻辑、权限校验等,通过 API 接口向前端提供数据;API接口遵循RESTful API规范,一般返回 JSON。
好处(优势)
| 内容 | 说明 |
|---|---|
| 前后端职责更清晰 | 前端负责 UI & 交互;后端负责数据 & 业务逻辑,提高可维护性 |
| 前后端可以并行开发 | 不再互相等待,提高团队协作效率 |
| 接口复用性高 | 一个 API 后端可服务 Web、App、小程序、IoT 等多端 |
| 更适合现代工程体系 | 可使用构建工具、组件化、模块化、TypeScript 等先进技术 |
| 运维与部署更灵活 | 前端静态资源 + 后端服务可以独立部署、独立扩容 |
| 更容易水平扩展(高并发场景) | 前端走 CDN,后端服务做负载均衡,系统扩展能力强 |
| 提高可测试性 | 前端可以单独做 UI 测试,后端可以做 API 测试 |
坏处(劣势)
| 内容 | 说明 |
|---|---|
| 开发复杂度提升 | 要管理 API、跨域、路由、状态管理、构建工具等 |
| 后端专门写 API | API 调试与联调成本增加 |
| 安全性问题需要更多处理 | 如 CORS、Token、XSS、CSRF 等需要自行处理 |
| 浏览器同源策略导致跨域问题 | 需要代理、中间层、CORS 等方式解决 |
| SSR 场景下复杂度增加 | Next.js / Nuxt.js 需要处理服务端与客户端双端逻辑 |
| 前端工程化要求更高 | 构建工具(Webpack/Vite)、Lint、TypeScript、CI/CD 更复杂 |
| 运维多服务部署更复杂 | 前端、后端、网关、CDN 都需要配置和维护 |
SPA:
SPA(Single-Page Application,单页应用)是一种现代 Web 应用架构模式(页面结构/应用形态),整个应用只加载一个HTML页面,页面内容的更新是通过JavaScript动态完成的。其特点是:前端路由变化 → 渲染新组件 → 页面不刷新 → 无白屏
- 只加载一个HTML入口(通常是index.html),页面中包含基础的结构(如
<div id="app"></div>)和引入的 JavaScript/CSS 资源,后续页面内容的变化都在这个HTML文件中(Vue、React其实都在这个id为app的div内改变,Vue3代码:createApp(App).mount('#app)就是把这个id为app的作为根元素); - 由JS控制页面内容切换;通过URL 的哈希(#,如 /#/about)或 HTML5 History API(如 history.pushState)修改 URL,当URL改变后,去显示不同的组件,从而页面内容改变,其过程不需要浏览器刷新。URL 变 → 显示不同组件 → 不刷新页面。
- 通过API向后端获取数据,后端不需要返回HTML,只返回JSON数据。
SSR
SSR(Server-Side Rendering)服务端渲染,是一种页面的渲染方式,由服务器端生成HTML返回给浏览器端,浏览器端接收后可直接展示页面。执行流程:
- 用户访问页面(浏览器发送 HTTP 请求)
- 服务器接收请求并执行业务逻辑
- 服务器生成完整的HTML文件并返回给浏览器
- 浏览器接收 HTML 并直接展示(无需 JS 渲染)
Tip: SSR(Server-Side Rendering)、CSR(Client-side Rendering)、SSG(Static Site Generation)、ISR(Incremental Static Regeneration)都是页面的渲染方式;SPA是一种页面结构,属于CSR,但CSR不一定是SPA。
SPA与SSR区别:
| SPA | SSR | |
|---|---|---|
| 渲染方式 | 客户端渲染 (CSR) | 服务器端渲染 (SSR) |
| 首屏加载 | 慢(需要等待JS执行) | 快 |
| SEO | 差(初始HTML是空的) | 好 |
| 服务器压力 | 小(只请求API) | 大(需要生成完整的HTML) |
JavaScript
// SPA 初始HTML(示例)
<html>
<body>
<div id="app"></div>
<script src="/bundle.js"></script>
</body>
</html>
// SSR 初始HTML(示例)
<html>
<body>
<div id="app">
<h1>商品名称:iPhone 17</h1>
<p>价格:¥9999</p>
</div>
<script src="/app.js"></script>
</body>
</html>
了解SPA和SSR之后,既然都有优缺点,那么我们只取它们的优点可不可以呢(在首屏加载使用SSR,在之后的页面切换使用SPA)?可以,框架NextJS和NuxtJS就实现了这种渲染方式-同构渲染/混合渲染(Isomorphic Rendering / Hybrid Rendering)。
同构渲染
同一套前端代码(React 或 Vue)既在服务端执行一次,又在客户端执行一次;第一次负责渲染 HTML(SSR),第二次负责让页面变得可交互(CSR)。在NuxtJS、NextJs中,使用同构渲染时,在打包部署后,都会自己开启一个NodeJS服务。
前端工程化/工具链

工程化清单示例
| 模块 | 内容 |
|---|---|
| 语言与框架 | Vue3、TypeScript |
| 工程构建 | Vite |
| UI框架 | Element Plus |
| 样式 | Tailwind CSS/Less/Scss |
| 代码规范 | EsLint、Prettier |
| HTTP请求 | Axios + 封装 |
| 状态管理 | Vuex/Pinia |
| 路由系统 | vue-router |
| 单元测试 | Vitest |
| Mook数据 | vite-plugin-mock |
| 生产部署 | Nginx、Docker |