当前位置: 首页 > article >正文

前端架构演进:从单体到微前端

前端架构演进从单体到微前端前端架构的发展历程第一阶段单体应用Mono Repo├── src/ │ ├── components/ │ ├── pages/ │ ├── services/ │ ├── utils/ │ └── styles/ └── index.html特点代码集中管理部署简单适合小型项目第二阶段组件化架构├── src/ │ ├── components/ │ │ ├── Button/ │ │ ├── Card/ │ │ └── Modal/ │ ├── containers/ │ ├── pages/ │ └── store/ └── index.html特点代码复用性高关注点分离便于团队协作第三阶段微前端架构├── apps/ │ ├── shell/ │ ├── home/ │ ├── profile/ │ └── checkout/ └── packages/ └── ui-components/特点独立开发和部署技术栈无关高扩展性微前端架构模式模式一基座模式// shell/src/App.js import { registerMicroApps, start } from qiankun; registerMicroApps([ { name: home, entry: //localhost:8081, container: #container, activeRule: /home }, { name: profile, entry: //localhost:8082, container: #container, activeRule: /profile } ]); start();模式二路由分发模式// router/index.js const routes [ { path: /home, microApp: home }, { path: /profile, microApp: profile } ];模式三构建时集成// webpack.config.js module.exports { plugins: [ new ModuleFederationPlugin({ name: shell, remotes: { home: homehttp://localhost:8081/remoteEntry.js } }) ] };状态管理方案对比方案一Redux// store.js import { createStore } from redux; const reducer (state, action) { switch (action.type) { case INCREMENT: return { count: state.count 1 }; default: return state; } }; const store createStore(reducer, { count: 0 });方案二Zustand// store.js import create from zustand; const useStore create((set) ({ count: 0, increment: () set((state) ({ count: state.count 1 })) }));方案三Jotai// store.js import { atom, useAtom } from jotai; const countAtom atom(0); function Counter() { const [count, setCount] useAtom(countAtom); return button onClick{() setCount(c c 1)}{count}/button; }组件设计原则单一职责原则// ❌ 违反一个组件处理多个职责 function UserProfile() { const [user, setUser] useState(null); const [loading, setLoading] useState(true); useEffect(() { fetchUser().then(data { setUser(data); setLoading(false); }); }, []); if (loading) return Spinner /; return ( div h1{user.name}/h1 p{user.email}/p /div ); } // ✅ 正确职责分离 function useUser() { const [user, setUser] useState(null); const [loading, setLoading] useState(true); useEffect(() { fetchUser().then(data { setUser(data); setLoading(false); }); }, []); return { user, loading }; } function UserProfile() { const { user, loading } useUser(); if (loading) return Spinner /; return ( UserCard user{user} / ); }可组合性function withAuth(Component) { return function AuthenticatedComponent(props) { const { isLoggedIn } useAuth(); if (!isLoggedIn) { return Redirect to/login /; } return Component {...props} /; }; } const ProtectedPage withAuth(MyPage);代码组织策略按功能组织src/ ├── features/ │ ├── auth/ │ │ ├── components/ │ │ ├── hooks/ │ │ ├── services/ │ │ └── index.js │ └── dashboard/ │ ├── components/ │ ├── hooks/ │ └── index.js └── shared/ ├── components/ ├── utils/ └── styles/按类型组织src/ ├── components/ │ ├── Button/ │ └── Card/ ├── hooks/ │ ├── useAuth.js │ └── useFetch.js ├── services/ │ └── api.js └── pages/ └── Home.js性能优化策略代码分割const Home React.lazy(() import(./Home)); const About React.lazy(() import(./About)); function App() { return ( Suspense fallback{Loading /} Route path/ component{Home} / Route path/about component{About} / /Suspense ); }懒加载const Image ({ src, alt }) { const [isLoaded, setIsLoaded] useState(false); return ( div {!isLoaded Placeholder /} img src{src} alt{alt} loadinglazy onLoad{() setIsLoaded(true)} / /div ); };总结前端架构设计是一个持续演进的过程需要根据项目规模和团队情况选择合适的方案。关键在于保持代码的可维护性和可扩展性遵循单一职责和高内聚低耦合原则合理利用设计模式和最佳实践持续关注性能优化和用户体验选择适合当前项目的架构方案才能让团队高效协作构建出优秀的产品。

相关文章:

前端架构演进:从单体到微前端

前端架构演进:从单体到微前端 前端架构的发展历程 第一阶段:单体应用(Mono Repo) ├── src/ │ ├── components/ │ ├── pages/ │ ├── services/ │ ├── utils/ │ └── styles/ └── index.html…...

Github创建项目(创建仓库、新建项目、新建仓库)步骤

文章目录 新建项目然后根据指示创建第一个提交并推送即可 新建项目 然后根据指示创建第一个提交并推送即可 echo "# xxxxxxxx" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin ht…...

大模型终于看懂立体几何!中科院联合阿里提出统一形式语言,刷新解析SOTA

论文详细解读:使用统一形式化语言的平面与立体几何图形解析 论文标题:Geoparsing: Diagram Parsing for Plane and Solid Geometry with a Unified Formal Language作者机构:中国科学院自动化研究所(CASIA)、中国科学…...

Agentic Search能替代GraphRAG吗,结论清晰了

2024 年 GraphRAG 爆火以来,「要不要建图」成了 RAG 系统设计中最常被讨论的决策。建图能显著提升多跳推理性能,但代价高昂——实体抽取、图谱构建、索引维护,每一步都是真金白银。 与此同时,agentic search 系统快速崛起——Sear…...

RAG 检索到了还是答错:从一个线上事故讲透 RAG 数据工程全链路

一个合同问答系统的线上事故 某企业法务团队上线了一套合同问答系统。用户问:“渠道商季度返点的计算条件是什么?” 系统返回了三段参考文档,生成了一段看起来完整的回答。法务审核时发现:引用的是 2024 年旧版渠道政策&#xf…...

印地语语音合成落地难?ElevenLabs官方未披露的4大限制、3种绕过技巧,及2个替代模型性能对比数据

更多请点击: https://kaifayun.com 第一章:印地语语音合成落地难?ElevenLabs官方未披露的4大限制、3种绕过技巧,及2个替代模型性能对比数据 ElevenLabs对印地语支持的真实现状 ElevenLabs虽在API文档中标注“支持印地语&#x…...

ElevenLabs波斯文TTS落地难题全破解:从Unicode乱码、音节切分失败到自然语调合成的5大技术卡点

更多请点击: https://codechina.net 第一章:ElevenLabs波斯文TTS落地难题全破解:从Unicode乱码、音节切分失败到自然语调合成的5大技术卡点 波斯文(Farsi)作为右向左(RTL)、连字密集、元音隐含…...

紧急通知:Claude文档解析API响应延迟突增300%?立即启用这3个异步缓存+增量摘要策略保生产可用性

更多请点击: https://intelliparadigm.com 第一章:Claude复杂文档分析工作流的稳定性危机本质 当处理百页PDF、嵌套Markdown表格、多语言混合注释及跨页公式引用的法律合同时,Claude模型常在推理链中出现非确定性断裂——并非简单“超时”或…...

揭秘Midjourney V6蒸汽波出图失败率高达63%的底层原因:3步绕过平台封禁,稳定生成霓虹故障美学

更多请点击: https://codechina.net 第一章:蒸汽波美学的数字幽灵:Midjourney V6封禁机制本质解构 蒸汽波(Vaporwave)以低保真采样、CRT扫描线、80年代商业图腾与数字怀旧为视觉语法,其美学内核恰恰在于对…...

Midjourney单色调风格失效诊断图谱(含8种典型失败案例+对应--no、--style、--seed三重校准方案)

更多请点击: https://intelliparadigm.com 第一章:Midjourney单色调风格失效诊断图谱(含8种典型失败案例对应--no、--style、--seed三重校准方案) 单色调(Monochrome)图像生成在Midjourney中高度依赖提示词…...

从扁平到触手可及,Midjourney拟物化全流程拆解,含12组高复用材质参数模板与避坑清单

更多请点击: https://kaifayun.com 第一章:从扁平到触手可及:Midjourney拟物化设计范式跃迁 当UI设计从iOS 7的极简扁平风席卷全球,我们曾笃信“去装饰即高级”。而Midjourney V6起悄然掀起一场静默革命——它不再满足于生成“看…...

谷歌收录怎么做比较快?Shopify过滤5个无效参数提升商品页收录

一个拥有5000个SPU的Shopify独立站,在Google Search Console后台的网页报告中,未收录网页数量高达45000个。索引分配明细标明,超过32000个URL带有“已抓取 - 目前未索引”标签。谷歌浏览器爬虫每天分配给该站点的抓取请求固定在4000次左右。检…...

我在大厂做开发的5年:那些996的日子

作为一名在互联网大厂摸爬滚打五年的开发工程师,如今转型成为软件测试团队的负责人,回望过去那些被996填满的日子,我有太多话想对同为技术从业者的测试同仁们说。这些经历不仅是我个人的成长印记,更藏着开发与测试岗位在高压环境下…...

谷歌收录怎么做比较快?提升网页打开速度至2秒内的优化方案

谷歌爬虫(Googlebot)在网站停留的时间存在硬性额度。网页文件若达到 6MB,传输会耗尽爬虫配额。调整网页体积到 1MB 以内,同等时间内抓取数量能提升 4倍。每日抓取页面从 1000 个爬升到 4000 个,新内容进入索引库的时间…...

做技术选型时,别只看Star数,这五个指标更重要

在软件研发的技术选型赛道上,GitHub的Star数常被当作“流量密码”,不少团队仅凭这一指标就敲定技术栈。但对于软件测试从业者而言,Star数只是技术生态的“表面繁华”,真正决定技术选型成败的,是那些能直接影响测试可行…...

福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现

更多请点击: https://kaifayun.com 第一章:福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现 ElevenLabs 官方 API 当前仅支持普通话、粤语等主流中文变体,对闽东方言&a…...

【编号884】江西省各城市-春节人口迁徙规模数据(2019-2025)

今天分享的是 江西省各城市-春节人口迁徙规模数据(2019-2025)数据概况 江西省各城市-春节人口迁徙规模数据(2019-2025) 春节地级市人口迁徙指数(2019-2025)迁徙指数依托位置时空大数据构建,形…...

LLM 认知框架:揭秘时间序列与空间结构,洞悉 AI 未来!

一、简明摘要 本文是一篇概念说明与方法论文章,核心问题是:LLM 到底是什么,它与 AI、AGI、Agent、Skill 有什么关系。全文先区分 AI、AGI、LLM 三个层级,再说明 LLM 的现实形态已经从“文本生成模型”扩展为“模型、上下文、外部知…...

微信聊天记录永久保存指南:5分钟掌握WeChatMsg完整备份方案

微信聊天记录永久保存指南:5分钟掌握WeChatMsg完整备份方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…...

2026年四款主流 SaaS 收银系统:不同场景怎么选?

开店做生意,最让人头疼的往往不是选址或装修,而是每天打烊后对着乱糟糟的账本发愁。很多刚起步的老板为了省成本,初期只用纸笔或简单的 Excel 记账,一旦客流上来,库存对不上、会员积分算错、交接班混乱等问题接踵而至。…...

YOLOv11公共场所吸烟行为目标检测数据集-6496张-smoking-detection-1

YOLOv11公共场所吸烟行为目标检测数据集 📊 数据集基本信息 目标类别: [‘not_smoking’, ‘smoking’]中文类别:[‘不吸烟’, ‘吸烟’]训练集:5644 张验证集:569 张测试集:283 张总计:6496 张…...

ElevenLabs支持闽南语吗?福建话语音合成实测:从API调用到音色克隆的7步通关手册

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs福建话语音支持现状与能力边界 ElevenLabs 目前尚未在官方语音模型库中提供对福建话(含闽南语、闽东语等分支)的原生支持。其公开文档与 API 文档均未列出任何以“Fuj…...

拒绝C盘爆红!自制 Windows 系统垃圾一键清理工具(精美UI设计)

你的 C盤 又红了吗?相信很多 Windows 用户都经历过被 **“C盘空间不足”** 支配的恐惧。随着日常办公、浏览网页、系统更新,各种临时文件和日志会悄悄吞噬掉我们珍贵的固态硬盘空间。市面上的清理软件鱼龙混杂,要么捆绑软件,要么后…...

MPV_lazy终极指南:如何用懒人包快速提升视频播放体验?

MPV_lazy终极指南:如何用懒人包快速提升视频播放体验? 【免费下载链接】mpv_PlayKit 🔄 mpv player 播放器折腾记录 Windows conf | 中文注释配置 汉化文档 快速帮助入门 | mpv-lazy 懒人包 Win11 x64 config | 着色器 shader 滤镜 filter 整…...

千问 LeetCode 2547. 拆分数组的最小代价 Java实现

这道题是典型的区间DP(动态规划)问题,核心在于如何高效计算每个子数组的"重要性"。问题分析重要性的计算规则: - 子数组中只出现一次的数字会被移除(不计入长度) - 重要性 k 剩余数字的个数 - …...

ElevenLabs陕西话语音落地实录:从零配置API到高保真秦腔语调还原,7步搞定方言TTS部署

更多请点击: https://kaifayun.com 第一章:ElevenLabs陕西话语音落地实录:从零配置API到高保真秦腔语调还原,7步搞定方言TTS部署 环境准备与API密钥获取 首先注册ElevenLabs账号并进入 Profile → API Keys页面,生成…...

15. tsconfig.json 配置详解

15. tsconfig.json 配置详解 1. 概述 tsconfig.json 是 TypeScript 项目的核心配置文件,用于指定编译选项、文件包含/排除规则、项目引用等。正确配置 tsconfig.json 是 TypeScript 项目工程化的基础。 ┌────────────────────────────…...

Python数据流式处理:Streaming深度解析与实战

Python数据流式处理:Streaming深度解析与实战 引言 在Python开发中,数据流式处理是处理大数据和实时数据的关键技术。作为一名从Rust转向Python的后端开发者,我深刻体会到流式处理在处理海量数据时的优势。Python提供了多种流式处理工具&…...

14. 声明文件(Declaration Files)

14. 声明文件(Declaration Files) 1. 概述 声明文件(.d.ts 文件)用于描述 JavaScript 库的类型信息,让 TypeScript 能够理解和使用纯 JavaScript 编写的代码。声明文件只包含类型定义,不包含实现代码。 ┌─…...

远程会议还在发文档改来改去?我用 Rustpad 搭了个协作平台彻底解决

前言 远程会议开到一半,需要共同修订一份文档或代码提纲,这种场景估计不少人经历过。方案来来去去就那几个:发邮件等反馈、微信来回传文件、用腾讯文档但要登录账号……每种都有各自的鸡肋之处。后来我自己琢磨出一套更顺手的方案&#xff1…...