浅谈现代前端体系:组件化、模块化、类型系统与工程化

现代前端开发概览

现代前端开发是指一套基于工程化、组件化、模块化和自动化工具的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通信。

  1. 前端:独立部署、运行,负责用户界面(UI)渲染、交互逻辑(如页面跳转、表单验证),通过 AJAX/Fetch 请求后端 API。
  2. 后端:独立部署、运行,负责数据处理、业务逻辑、权限校验等,通过 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动态完成的。其特点是:前端路由变化 → 渲染新组件 → 页面不刷新 → 无白屏

  1. 只加载一个HTML入口(通常是index.html),页面中包含基础的结构(如 <div id="app"></div>)和引入的 JavaScript/CSS 资源,后续页面内容的变化都在这个HTML文件中(Vue、React其实都在这个id为app的div内改变,Vue3代码:createApp(App).mount('#app)就是把这个id为app的作为根元素);
  2. 由JS控制页面内容切换;通过URL 的哈希(#,如 /#/about)或 HTML5 History API(如 history.pushState)修改 URL,当URL改变后,去显示不同的组件,从而页面内容改变,其过程不需要浏览器刷新。URL 变 → 显示不同组件 → 不刷新页面。
  3. 通过API向后端获取数据,后端不需要返回HTML,只返回JSON数据。
SSR

SSR(Server-Side Rendering)服务端渲染,是一种页面的渲染方式,由服务器端生成HTML返回给浏览器端,浏览器端接收后可直接展示页面。执行流程:

  1. 用户访问页面(浏览器发送 HTTP 请求)
  2. 服务器接收请求并执行业务逻辑
  3. 服务器生成完整的HTML文件并返回给浏览器
  4. 浏览器接收 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
相关推荐
IT_陈寒1 小时前
JavaScript开发者必知的7个ES2023新特性,让你的代码效率提升50%
前端·人工智能·后端
前端一课1 小时前
【前端每天一题】🔥 第 1 题:什么是 闭包(Closure)?它有什么作用?
前端·面试
j***63081 小时前
SpringbootActuator未授权访问漏洞
android·前端·后端
ze_juejin1 小时前
JavaScript事件循环总结
前端
forestsea1 小时前
现代 JavaScript 加密技术详解:Web Crypto API 与常见算法实践
前端·javascript·算法
_前端小李_1 小时前
pnpm老是默认把包安装在C盘很头疼?教你快速配置pnpm的全局目录
前端
Cache技术分享1 小时前
254. Java 集合 - 使用 Lambda 表达式操作 Map 的值
前端·后端
CryptoPP2 小时前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang