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

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

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

前端架构的发展历程

第一阶段:单体应用(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: 'home@http://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} loading="lazy" onLoad={() => setIsLoaded(true)} /> </div> ); };

总结

前端架构设计是一个持续演进的过程,需要根据项目规模和团队情况选择合适的方案。关键在于:

  1. 保持代码的可维护性和可扩展性
  2. 遵循单一职责和高内聚低耦合原则
  3. 合理利用设计模式和最佳实践
  4. 持续关注性能优化和用户体验

选择适合当前项目的架构方案,才能让团队高效协作,构建出优秀的产品。

http://www.jsqmd.com/news/861265/

相关文章:

  • MPV_lazy终极指南:如何用懒人包快速提升视频播放体验?
  • 谷歌收录排名怎么做比较好?解决GSC已发现未编入的3个步骤
  • 14. 声明文件(Declaration Files)
  • 创业公司如何做好用户反馈管理
  • 紧急通知:Claude文档解析API响应延迟突增300%?立即启用这3个异步缓存+增量摘要策略保生产可用性
  • Claude Code配置国产模型
  • 微信聊天记录永久保存指南:5分钟掌握WeChatMsg完整备份方案
  • ElevenLabs波斯文TTS落地难题全破解:从Unicode乱码、音节切分失败到自然语调合成的5大技术卡点
  • 拒绝C盘爆红!自制 Windows 系统垃圾一键清理工具(精美UI设计)
  • Python数据流式处理:Streaming深度解析与实战
  • 谷歌搜索SEO优化需要做什么?4个步骤快速做好站内优化
  • Claude Code 6 种权限模式对照表
  • ElevenLabs方言语音开发指南(山东话专项版):从API密钥配置到“俺、恁、咋呼”等27个地域性语义单元精准建模
  • LLM 认知框架:揭秘时间序列与空间结构,洞悉 AI 未来!
  • 谷歌搜索SEO优化需要做什么?解决未建立索引的2个技术点
  • ElevenLabs支持闽南语吗?福建话语音合成实测:从API调用到音色克隆的7步通关手册
  • 15. tsconfig.json 配置详解
  • 单智能体 vs 多智能体系统:架构对比与选择
  • UVa 12572 RMQ Overkill
  • 自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究)
  • Token销毁机制深度解析:从原理到实战,开发者必读指南
  • 【仅限西北开发者内部流通】ElevenLabs陕西话语音微调秘钥+定制音色包(含西安/榆林/延安三地口音模型)
  • Rust分布式系统最佳实践:构建高可用、高性能的后端服务
  • 【编号884】江西省各城市-春节人口迁徙规模数据(2019-2025)
  • 福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现
  • 嵌入式测试学习第 16 天:复位电路、电源电路基础原理
  • UVa 250 Pattern Matching Prelims
  • 【编号938】东南沿海诸河流域边界+东南沿海诸河流域水系矢量多级水系
  • 边缘AI框架:在边缘设备上运行AI模型
  • cursor-vip:当AI编程工具遇上共享经济,你的代码从此有了智能伙伴