Material UI 免费 React 模板实战指南:从模板选型到项目落地
本篇基于 Material UI 仓库中的模板文档 templates.md 展开,系统讲解官方免费 React 模板集合的组成、主题机制与使用流程:包括 Dashboard、营销页、结账流程、注册登录页、博客与 CRUD 后台等 8 套开箱即用的模板如何选型、如何拷贝进项目、如何在线(StackBlitz / CodeSandbox)体验,以及如何结合 examples 目录 下的示例工程形成完整的应用起点。读完本文,你可以独立完成「选模板 → 拷贝代码 → 安装依赖 → 接入主题 → 上线预览」的完整落地链路。
免费模板集合:8 套开箱即用的 React 页面
Material UI 官方维护了一组免费模板(Free templates),用于快速搭建应用的第一版界面。根据文档与集合组件 MaterialFreeTemplatesCollection.js 中注册的全部条目,当前模板集合包括:
| 模板 | 适用场景 | 源码目录 |
|---|---|---|
| Dashboard | 数据看板(图表、数据表格、树形结构、日期选择器) | dashboard |
| Marketing page | 营销落地页(Hero、定价、FAQ、客户证言) | marketing-page |
| Checkout | 结账流程(地址表单、支付方式、订单复核) | checkout |
| Sign in | 居中卡片式登录页(含忘记密码入口) | sign-in |
| Sign in side | 左侧品牌区 + 右侧表单的分栏登录页 | sign-in-side |
| Sign up | 注册页 | sign-up |
| Blog | 博客(自定义导航栏、页脚、最新文章流) | blog |
| CRUD dashboard | 带完整 CRUD 的后台(列表/新建/编辑/详情、侧边栏上下文、对话框与通知 Hooks) | crud-dashboard |
文档中说明的四个关键特性,在源码层面均可以找到对应实现:
- 每套模板都带自定义主题与 Material Design 2 默认主题,且两者都支持浅色/深色模式。主题统一来自 shared-theme 目录,模板卡片右上角的切换按钮可在这些风格间切换(集合中每个模板均标记
hasDarkMode: true)。 - 页面区块以注释或独立文件定义,方便抽取复用。以 marketing-page 为例,
components/目录下拆出了Hero、Features、Pricing、FAQ、Testimonials、LogoCollection、Footer等独立组件——你可以直接把Hero或Footer拷到自己的其他页面里复用。 - 每个模板都可从源码、CodeSandbox 或 StackBlitz 直接获取。卡片组件为每个模板生成了三个入口:StackBlitz 按钮、CodeSandbox 按钮、以及指向仓库对应目录的「See source code」链接(见 MaterialFreeTemplatesCollection.js)。
- 模板可与示例工程组合形成完整起点。仓库 examples 目录下提供了 Next.js(App Router / Pages Router / TypeScript 变体)、Vite(含 Tailwind 变体)、Remix、React Router、Gatsby、Express SSR、Preact 等 14+ 个示例项目,模板负责「页面层」,示例项目负责「工程层」。
模板的目录组织:页面 + 组件 + 主题三分法
所有模板都位于仓库的 docs/data/material/getting-started/templates/ 目录,并遵循一致的三分结构:根组件 + components/ 区块 + theme/(或直接复用 shared-theme/)。
以 Dashboard 模板为例,其目录(可从 dashboard 浏览)大致如下:
dashboard/
├─ Dashboard.js / Dashboard.tsx # 根组件,组装整个页面
├─ components/ # 页面区块,独立文件便于抽取复用
│ ├─ AppNavbar / Header / MenuButton / MenuContent
│ ├─ Search / OptionsMenu / StatCard / HighlightedCard
│ ├─ MainGrid / SessionsChart / PageViewsBarChart
│ ├─ ChartUserByCountry / CustomizedDataGrid / CustomizedTreeView
│ └─ ...
├─ internals/ # 版权信息、自定义图标、表格数据
├─ theme/customizations/ # 图表、DataGrid、日期选择器、树视图的样式定制
└─ README.md # 使用说明
Dashboard 模板额外依赖了 MUI X 系列组件(图表、DataGrid、TreeView、日期选择器),因此它的 README 中要求的依赖也最多;而像 Checkout 这类纯表单模板则只需要核心的 Material 依赖。
三步使用流程:以 Dashboard 和 Checkout 为例
每个模板目录下都附有一份 README.md,写明拷贝范围、依赖清单和入口组件。以 Dashboard 模板的 README.md 为例,官方给出的使用步骤是:
- 将
dashboard和shared-theme两个文件夹拷贝进你的项目(或某个示例项目); - 确保项目安装了所需依赖:
@mui/material
@mui/icons-material
@emotion/styled
@emotion/react
@mui/x-charts
@mui/x-date-pickers
@mui/x-data-grid
@mui/x-tree-view
dayjs
- 在应用入口处导入并使用
Dashboard组件。
对比 Checkout 模板的 README.md,其依赖清单明显更精简:
@mui/material
@emotion/styled
@emotion/react
并且只需导入 Checkout 组件即可。这说明模板之间存在依赖梯度:简单页面模板只依赖核心库,而数据密集型模板(Dashboard、CRUD dashboard)会引入 MUI X 生态。选型时可以先对照 README 的依赖清单评估引入成本。
shared-theme 文件夹是所有模板共用的主题来源,这也是为什么每一步都强调要连同 shared-theme 一起拷贝——模板组件中的样式定制与主题 token 是配套的。
shared-theme:自定义主题的底层结构
模板的自定义主题集中在 shared-theme 目录。核心文件 AppTheme.tsx 的组装逻辑如下:
import { ThemeProvider, createTheme } from '@mui/material/styles';
import { inputsCustomizations } from './customizations/inputs';
import { dataDisplayCustomizations } from './customizations/dataDisplay';
import { feedbackCustomizations } from './customizations/feedback';
import { navigationCustomizations } from './customizations/navigation';
import { surfacesCustomizations } from './customizations/surfaces';
import { colorSchemes, typography, shadows, shape } from './themePrimitives';
const theme = createTheme({
cssVariables: {
colorSchemeSelector: 'data-mui-color-scheme',
cssVarPrefix: 'template',
},
colorSchemes, // 浅色/深色双模式配置
typography,
shadows,
shape,
components: {
...inputsCustomizations,
...dataDisplayCustomizations,
...feedbackCustomizations,
...navigationCustomizations,
...surfacesCustomizations,
},
});
从源码结构看,这套主题有三个值得注意的设计点:
- CSS 变量模式:
cssVariables配置指定了colorSchemeSelector: 'data-mui-color-scheme'和cssVarPrefix: 'template',即用 CSS 变量驱动主题,切换浅色/深色只需改变data-mui-color-scheme属性,而非整树重渲染; - colorSchemes 双模式:
themePrimitives中导出colorSchemes(v6 引入的机制),浅色与深色模式的调色板、透明度统一在此声明,这解释了文档中「自定义主题和默认主题都有 light/dark 模式」的实现方式; - 按组件类别拆分定制:
customizations/目录下按inputs、dataDisplay、feedback、navigation、surfaces五类组织components覆盖项,每类都是独立的.js/.tsx文件。想调整按钮圆角或输入框焦点态时,只需修改对应类别文件,而不必翻整份主题对象。
AppTheme 组件还接收一个 disableCustomTheme 属性(源码注释明确说明它是为文档站点提供的开关),传入该属性后直接渲染 React.Fragment 而不包裹 ThemeProvider——这正是文档页面上「Material Design 2 默认主题」预览模式的实现方式:同一份模板代码,套上 AppTheme 就是自定义主题,不套就是默认主题。
此外,CRUD dashboard 模板在共享主题基础上又内置了自己的 theme/customizations(button、dataGrid、datePickers、formInput、sidebar),并附带 ThemeSwitcher 组件与侧边栏上下文(DashboardSidebarContext)、useDialogs / useNotifications 等 Hooks,是八套模板中工程结构最完整的一套,适合作为后台管理系统的骨架参考。
在线 Playground:模板文件如何被一键推送进沙箱
文档提到模板「可以直接从源码或 CodeSandbox / StackBlitz 下载/编辑」,这条能力的实现链路在仓库中完整可查:
- 文件收集:sourceMaterialTemplates.ts 通过 webpack 的
require.context('../../../data/material/getting-started/templates/?raw', true, /^\.\/[^/]+\/.*\.(js|tsx|ts)$/)以原始文本方式批量读取templates/下每个子目录的全部源码文件,按模板名建立templateMap(name -> { files, codeVariant }),shared-theme则单独提取为sharedTheme,且文件路径统一改写为theme/xxx前缀; - 拼装沙箱:卡片组件 MaterialFreeTemplatesCollection.js 在用户点击按钮时,把模板文件与共享主题文件合并(
{ ...item.files, ...materialTemplates.sharedTheme?.files }),再调用stackBlitz.createMaterialTemplate()或codeSandbox.createMaterialTemplate(); - 路径修正:因为模板源码内部以
../shared-theme/相对路径引用主题,沙箱中主题被平铺到了./theme/,所以会执行replaceContent将../shared-theme/全局替换为./theme/,并把入口./App替换为模板组件名(如./Dashboard),最后打开对应路径的沙箱页面。
这套机制保证了「线上可玩」与「仓库可查」的一致性:你从沙箱下载的代码,和仓库 templates/ 目录里的源码是同一份文本。截图预览图则是由仓库脚本生成的(源码注释标明由 pnpm template:screenshot material-ui 生成,禁止手工修改图片),对应静态资源路径为 /static/screenshots{模板路径}.jpg。
与示例项目组合:形成完整应用起点
模板只解决「页面长什么样」,工程配置(构建、路由、样式注入)则由 examples 目录的示例项目承担。仓库当前提供的示例项目包括:
- material-ui-nextjs、material-ui-nextjs-ts、material-ui-nextjs-pages-router(含 TypeScript 变体):Next.js 应用;
- material-ui-vite、material-ui-vite-ts、material-ui-vite-tailwind-ts:Vite 应用,其中 Tailwind 版本演示了与 Tailwind CSS 共存的配置;
- material-ui-express-ssr、material-ui-gatsby、material-ui-preact、material-ui-react-router-ts、material-ui-remix-ts:其他框架/渲染场景;
- material-ui-via-cdn:不构建的 CDN 引入方式。
推荐的组合方式是:克隆一个示例项目作为工程底座,把 docs/data/material/getting-started/templates/ 中你选定的模板文件夹连同 shared-theme 拷入项目,按模板 README 补齐依赖,用模板根组件替换示例项目的默认页面。由于模板区块都是独立文件,后续可以只保留需要的部分(如只留 Footer 和 AppAppBar),其余自由发挥。
进阶模板与社区参与
除免费模板外,文档还指出 MUI Store 的 premium template 栏目提供完整的付费模板与主题(文档中附浅色/深色两种展示图)。如果免费模板不能满足企业级需求,可以沿这条路线扩展选型。
仓库对模板的社区改进持开放态度:文档原文邀请使用者为模板打开 issue 或 pull request。由于每套模板都是结构清晰的小型 React 工程(根组件 + 区块组件 + 主题),修改并回流的门槛并不高——从 docs/data/material/getting-started/templates/ 找到对应目录即可开始。
小结
Material UI 的免费模板体系可以概括为三层:页面层(8 套按场景划分的模板,区块以独立文件拆分、可抽取复用)、主题层(shared-theme 提供的 CSS 变量双模式主题 + 按组件类别拆分的定制项)、工程层(examples 示例项目 + StackBlitz/CodeSandbox 在线沙箱 + 仓库源码三通道获取)。落地时的决策路径也很直接:按业务场景在八套模板中选型 → 对照模板 README 确认依赖 → 拷贝 模板目录 + shared-theme → 选一个示例项目做底座 → 按需保留或删减区块组件。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00