首页
/ Material UI 免费 React 模板实战指南:从模板选型到项目落地

Material UI 免费 React 模板实战指南:从模板选型到项目落地

2026-09-06 13:28:54作者:余洋婵Anita

本篇基于 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

文档中说明的四个关键特性,在源码层面均可以找到对应实现:

  1. 每套模板都带自定义主题与 Material Design 2 默认主题,且两者都支持浅色/深色模式。主题统一来自 shared-theme 目录,模板卡片右上角的切换按钮可在这些风格间切换(集合中每个模板均标记 hasDarkMode: true)。
  2. 页面区块以注释或独立文件定义,方便抽取复用。以 marketing-page 为例,components/ 目录下拆出了 HeroFeaturesPricingFAQTestimonialsLogoCollectionFooter 等独立组件——你可以直接把 HeroFooter 拷到自己的其他页面里复用。
  3. 每个模板都可从源码、CodeSandbox 或 StackBlitz 直接获取。卡片组件为每个模板生成了三个入口:StackBlitz 按钮、CodeSandbox 按钮、以及指向仓库对应目录的「See source code」链接(见 MaterialFreeTemplatesCollection.js)。
  4. 模板可与示例工程组合形成完整起点。仓库 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 为例,官方给出的使用步骤是:

  1. dashboardshared-theme 两个文件夹拷贝进你的项目(或某个示例项目);
  2. 确保项目安装了所需依赖:
@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
  1. 在应用入口处导入并使用 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/ 目录下按 inputsdataDisplayfeedbacknavigationsurfaces 五类组织 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 下载/编辑」,这条能力的实现链路在仓库中完整可查:

  1. 文件收集sourceMaterialTemplates.ts 通过 webpack 的 require.context('../../../data/material/getting-started/templates/?raw', true, /^\.\/[^/]+\/.*\.(js|tsx|ts)$/)原始文本方式批量读取 templates/ 下每个子目录的全部源码文件,按模板名建立 templateMapname -> { files, codeVariant }),shared-theme 则单独提取为 sharedTheme,且文件路径统一改写为 theme/xxx 前缀;
  2. 拼装沙箱:卡片组件 MaterialFreeTemplatesCollection.js 在用户点击按钮时,把模板文件与共享主题文件合并({ ...item.files, ...materialTemplates.sharedTheme?.files }),再调用 stackBlitz.createMaterialTemplate()codeSandbox.createMaterialTemplate()
  3. 路径修正:因为模板源码内部以 ../shared-theme/ 相对路径引用主题,沙箱中主题被平铺到了 ./theme/,所以会执行 replaceContent../shared-theme/ 全局替换为 ./theme/,并把入口 ./App 替换为模板组件名(如 ./Dashboard),最后打开对应路径的沙箱页面。

这套机制保证了「线上可玩」与「仓库可查」的一致性:你从沙箱下载的代码,和仓库 templates/ 目录里的源码是同一份文本。截图预览图则是由仓库脚本生成的(源码注释标明由 pnpm template:screenshot material-ui 生成,禁止手工修改图片),对应静态资源路径为 /static/screenshots{模板路径}.jpg

与示例项目组合:形成完整应用起点

模板只解决「页面长什么样」,工程配置(构建、路由、样式注入)则由 examples 目录的示例项目承担。仓库当前提供的示例项目包括:

推荐的组合方式是:克隆一个示例项目作为工程底座,把 docs/data/material/getting-started/templates/ 中你选定的模板文件夹连同 shared-theme 拷入项目,按模板 README 补齐依赖,用模板根组件替换示例项目的默认页面。由于模板区块都是独立文件,后续可以只保留需要的部分(如只留 FooterAppAppBar),其余自由发挥。

进阶模板与社区参与

除免费模板外,文档还指出 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 → 选一个示例项目做底座 → 按需保留或删减区块组件。

登录后查看全文
热门项目推荐
相关项目推荐