详细介绍:基于React的开源框架Next.js、UmiJS、Ant Design Pro
<style>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; line-height: 1.6 !important; padding: 16px !important; margin: 16px 0 !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; tab-size: 4 !important; -moz-tab-size: 4 !important; max-width: 100% !important; box-sizing: border-box !important }code { font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; overflow-wrap: normal !important; display: inline !important; background: rgba(0, 0, 0, 0) !important; border: none !important; padding: 0 !important; margin: 0 !important; line-height: inherit !important }
pre code { background: rgba(0, 0, 0, 0) !important; border: 0 !important; border-radius: 0 !important; display: block !important; line-height: 1.6 !important; margin: 0 !important; max-width: none !important; overflow: visible !important; padding: 0 !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; color: inherit !important }
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: rgba(112, 128, 144, 1) !important; font-style: italic !important }
.token.punctuation { color: rgba(153, 153, 153, 1) !important }
.token.atrule, .token.attr-value, .token.keyword { color: rgba(0, 119, 170, 1) !important; font-weight: bold !important }
.token.function, .token.class-name { color: rgba(221, 74, 104, 1) !important; font-weight: bold !important }
.token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: rgba(102, 153, 0, 1) !important }
.token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: rgba(153, 0, 85, 1) !important }
.cnblogs-markdown pre, .cnblogs-post-body pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; padding: 16px !important; margin: 16px 0 !important }
pre, pre, pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important }</style>
<div class="markdown_views prism-atom-one-dark" id="content_views"><svg style="display: none" xmlns="http://www.w3.org/2000/svg"><path d="M5,0 0,2.5 5,5z" id="raphael-marker-block" stroke-linecap="round" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path></svg><h2>Next.js、UmiJS、Ant Design Pro 分别是什么?</h2><p>这三个都是基于 React 的框架,但定位和使用场景不同。让我详细对比一下:</p><h3>1. Next.js</h3><p><strong>定位:通用的 React 全栈框架</strong>(由 Vercel 开发)</p><h4>特点</h4><ul><li> <strong>国际化产品</strong>:全球使用最广泛的 React 框架</li><li> <strong>多种渲染方式</strong>:SSR、SSG、CSR、ISR</li><li> <strong>适合场景</strong>:内容型网站、电商、营销页</li><li> <strong>灵活性</strong>:高度可定制</li><li> <strong>生态</strong>:全球最大的社区</li></ul><h4>代码示例</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript"><span class="token comment">// app/page.js</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">Home</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">'https://api.example.com/data'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator"><</span>div<span class="token operator">></span>Hello Next<span class="token punctuation">.</span>js<span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// app/api/users/route.js</span>
<span class="token keyword">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token constant">GET</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> Response<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> users<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h4>适用场景</h4><ul><li>✅ 官网、博客、文档</li><li>✅ 电商网站</li><li>✅ 需要 SEO 的应用</li><li>❌ 企业后台管理系统(杀鸡用牛刀)</li></ul><hr><h3>2. UmiJS</h3><p><strong>定位:企业级 React 应用框架</strong>(由阿里巴巴蚂蚁金服开发)</p><h4>特点</h4><ul><li> <strong>中国特色</strong>:专为国内开发者设计</li><li> <strong>插件化</strong>:通过插件扩展功能</li><li> <strong>开箱即用</strong>:内置大量企业级功能</li><li> <strong>约定式路由</strong>:类似 Next.js 的文件路由</li><li> <strong>企业级</strong>:适合大型后台管理系统</li></ul><h4>核心功能</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript"><span class="token comment">// .umirc.ts 或 config/config.ts</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
routes<span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> <span class="token string">'@/pages/index'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/users'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> <span class="token string">'@/pages/users'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
plugins<span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token string">'@umijs/plugin-model'</span><span class="token punctuation">,</span> <span class="token comment">// 数据流</span>
<span class="token string">'@umijs/plugin-request'</span><span class="token punctuation">,</span> <span class="token comment">// 网络请求</span>
<span class="token string">'@umijs/plugin-access'</span><span class="token punctuation">,</span> <span class="token comment">// 权限管理</span>
<span class="token string">'@umijs/plugin-layout'</span><span class="token punctuation">,</span> <span class="token comment">// 布局</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
dva<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 内置 Redux</span>
antd<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 内置 Ant Design</span>
locale<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 国际化</span>
access<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 权限</span>
request<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 请求配置</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre>
<h4>代码示例</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript"><span class="token comment">// src/pages/index.tsx</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> useModel <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'umi'</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">HomePage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> <span class="token punctuation">{</span> user <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">useModel</span><span class="token punctuation">(</span><span class="token string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator"><</span>div<span class="token operator">></span>Hello <span class="token punctuation">{</span>user<span class="token punctuation">.</span>name<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// src/app.ts - 运行时配置</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> request <span class="token operator">=</span> <span class="token punctuation">{</span>
timeout<span class="token operator">:</span> <span class="token number">1000</span><span class="token punctuation">,</span>
errorConfig<span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token function-variable function">errorHandler</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">error</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre>
<h4>适用场景</h4><ul><li>✅ <strong>企业后台管理系统</strong>(最佳选择)</li><li>✅ 中后台应用</li><li>✅ 复杂的企业级应用</li><li>✅ 需要快速开发的项目</li><li>❌ 需要 SEO 的网站(不如 Next.js)</li></ul><hr><h3>3. Ant Design Pro</h3><p><strong>定位:开箱即用的中后台前端解决方案</strong>(基于 UmiJS)</p><h4>特点</h4><ul><li> <strong>完整的项目模板</strong>:不仅是框架,更是解决方案</li><li> <strong>基于 UmiJS + Ant Design</strong></li><li> <strong>企业级模板</strong>:包含完整的后台管理系统结构</li><li> <strong>开箱即用</strong>:登录、权限、菜单、布局全都有</li></ul><h4>项目结构</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code>my-app/
├── config/ # 配置文件
│ ├── config.ts # UmiJS 配置
│ └── routes.ts # 路由配置
├── src/
│ ├── components/ # 组件
│ ├── layouts/ # 布局
│ │ ├── BasicLayout.tsx # 基础布局(侧边栏+顶栏)
│ │ └── UserLayout.tsx # 用户布局(登录页)
│ ├── pages/ # 页面
│ │ ├── Dashboard/ # 仪表盘
│ │ ├── User/ # 用户管理
│ │ └── Welcome.tsx # 欢迎页
│ ├── services/ # API 请求
│ ├── models/ # 数据模型
│ ├── access.ts # 权限定义
│ └── app.tsx # 运行时配置
├── mock/ # Mock 数据
└── package.json</code></pre>
<h4>内置功能</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-typescript"><span class="token comment">// src/pages/Dashboard/index.tsx</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> PageContainer <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@ant-design/pro-components'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Card<span class="token punctuation">,</span> Row<span class="token punctuation">,</span> Col<span class="token punctuation">,</span> Statistic <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'antd'</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">Dashboard</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator"><</span>PageContainer<span class="token operator">></span>
<span class="token operator"><</span>Row gutter<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">16</span><span class="token punctuation">}</span><span class="token operator">></span>
<span class="token operator"><</span>Col span<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">}</span><span class="token operator">></span>
<span class="token operator"><</span>Card<span class="token operator">></span>
<span class="token operator"><</span>Statistic title<span class="token operator">=</span><span class="token string">"总用户"</span> value<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">1128</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>Card<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>Col<span class="token operator">></span>
<span class="token operator"><</span>Col span<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">}</span><span class="token operator">></span>
<span class="token operator"><</span>Card<span class="token operator">></span>
<span class="token operator"><</span>Statistic title<span class="token operator">=</span><span class="token string">"今日访问"</span> value<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">93</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>Card<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>Col<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>Row<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>PageContainer<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// src/access.ts - 权限控制</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">(</span>initialState<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> <span class="token punctuation">{</span> currentUser <span class="token punctuation">}</span> <span class="token operator">=</span> initialState <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span>
canAdmin<span class="token operator">:</span> currentUser<span class="token operator">?.</span>role <span class="token operator">===</span> <span class="token string">'admin'</span><span class="token punctuation">,</span>
canEdit<span class="token operator">:</span> currentUser<span class="token operator">?.</span>role <span class="token operator">===</span> <span class="token string">'admin'</span> <span class="token operator">||</span> currentUser<span class="token operator">?.</span>role <span class="token operator">===</span> <span class="token string">'editor'</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre>
<h4>适用场景</h4><ul><li>✅ <strong>企业后台管理系统</strong>(最快速的选择)</li><li>✅ 不想从零开始搭建项目</li><li>✅ 需要标准的管理系统 UI</li><li>❌ 需要高度定制的 UI(模板限制较多)</li></ul><hr><h3>三者对比</h3><table><thead><tr><th>特性</th><th>Next.js</th><th>UmiJS</th><th>Ant Design Pro</th></tr></thead><tbody><tr><td><strong>定位</strong></td><td>通用全栈框架</td><td>企业级框架</td><td>后台管理模板</td></tr><tr><td><strong>开发者</strong></td><td>Vercel(美国)</td><td>阿里巴巴(中国)</td><td>蚂蚁集团(中国)</td></tr><tr><td><strong>主要用途</strong></td><td>官网、电商、博客</td><td>后台管理系统</td><td>后台管理系统</td></tr><tr><td><strong>渲染方式</strong></td><td>SSR/SSG/CSR/ISR</td><td>主要 CSR</td><td>CSR</td></tr><tr><td><strong>SEO</strong></td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐</td><td>⭐</td></tr><tr><td><strong>开发速度</strong></td><td>中等</td><td>快</td><td>最快</td></tr><tr><td><strong>灵活性</strong></td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐</td></tr><tr><td><strong>学习曲线</strong></td><td>中等</td><td>中等</td><td>低(开箱即用)</td></tr><tr><td><strong>UI 组件</strong></td><td>需自选</td><td>通常用 Ant Design</td><td>内置 Ant Design</td></tr><tr><td><strong>路由</strong></td><td>文件路由</td><td>文件路由 + 配置路由</td><td>配置路由</td></tr><tr><td><strong>状态管理</strong></td><td>需自选</td><td>内置 Dva/插件</td><td>内置</td></tr><tr><td><strong>权限管理</strong></td><td>需自己实现</td><td>插件支持</td><td>内置</td></tr><tr><td><strong>国际化</strong></td><td>需自己配置</td><td>插件支持</td><td>内置</td></tr><tr><td><strong>Mock</strong></td><td>需自己配置</td><td>内置</td><td>内置</td></tr><tr><td><strong>部署</strong></td><td>Node.js 服务器</td><td>静态文件</td><td>静态文件</td></tr><tr><td><strong>社区</strong></td><td>全球最大</td><td>国内为主</td><td>国内为主</td></tr></tbody></table><h3>层级关系</h3>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code>Ant Design Pro (完整解决方案)
↓ 基于
UmiJS (框架)
↓ 基于
React (库)</code></pre>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code>Next.js (独立框架)
↓ 基于
React (库)</code></pre>
<h3>如何选择?</h3><h4>选择 Next.js</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript">✅ 官网、博客、文档站
✅ 电商网站
✅ 需要 <span class="token constant">SEO</span>
✅ 需要 <span class="token constant">SSR</span>
✅ 国际化产品
✅ 全栈应用(需要 <span class="token constant">API</span>)</code></pre>
<h4>选择 UmiJS</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript">✅ 企业后台管理系统
✅ 复杂的中后台应用
✅ 需要快速开发
✅ 团队熟悉阿里系技术栈
✅ 需要插件化扩展
❌ 不需要 <span class="token constant">SEO</span></code></pre>
<h4>选择 Ant Design Pro</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-javascript">✅ 标准的后台管理系统
✅ 不想从零开始
✅ 接受 Ant Design 的设计风格
✅ 需要最快的开发速度
✅ 项目需求标准化
❌ 需要高度定制 <span class="token constant">UI</span></code></pre>
<h3>你的项目分析</h3><p>看你的项目结构,你目前使用的是:</p><ul><li>✅ React</li><li>✅ Redux(手动配置)</li><li>✅ Webpack</li><li>✅ 自己搭建的路由</li><li>✅ 可能集成了一些京东内部的组件库(<code>@jd/jmt-design</code>)</li></ul><p><strong>如果要迁移,建议:</strong></p><ol><li><strong>UmiJS</strong> - 最适合你的场景(企业后台),保持灵活性</li><li><strong>Ant Design Pro</strong> - 如果想要快速标准化</li><li><strong>Next.js</strong> - 如果未来有 SEO 需求</li></ol><h3>快速开始</h3><h4>Next.js</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">npx create-next-app@latest</code></pre>
<h4>UmiJS</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">npx create-umi@latest</code></pre>
<h4>Ant Design Pro</h4>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash"><span class="token function">npm</span> i @ant-design/pro-cli -g
pro create my-app</code></pre>
<h3>总结</h3><table><thead><tr><th>框架</th><th>一句话总结</th></tr></thead><tbody><tr><td><strong>Next.js</strong></td><td>React 的"生产级"框架,SEO 友好,适合内容型网站</td></tr><tr><td><strong>UmiJS</strong></td><td>企业级 React 框架,插件化,适合后台管理系统</td></tr><tr><td><strong>Ant Design Pro</strong></td><td>开箱即用的后台管理系统模板,最快速</td></tr></tbody></table><p><strong>简单记忆:</strong></p><ul><li> 需要 SEO → Next.js</li><li> 企业后台(灵活) → UmiJS</li><li> 企业后台(快速) → Ant Design Pro</li></ul><p>对于你目前的项目(京东商智后台),<strong>UmiJS 或 Ant Design Pro 会是更好的选择</strong>!</p></div><br><br>
来源:https://www.cnblogs.com/yangykaifa/p/19342644
頁:
[1]