如何在 Netlify 上统一域名部署多个 React 应用

大涛酱_9727

大涛酱_9727

2026-09-14

970人浏览

原创

如何在 Netlify 上统一域名部署多个 React 应用

本文详解如何通过单仓库多子目录结构与 netlify.toml 重定向配置,在同一 Netlify 域名(如 example.netlify.app)下托管主应用及多个子路径 React 应用(如 /app-one、/app-two),支持共用仓库、独立构建、统一访问。

本文详解如何通过单仓库多子目录结构与 `netlify.toml` 重定向配置,在同一 netlify 域名(如 `example.netlify.app`)下托管主应用及多个子路径 react 应用(如 `/app-one`、`/app-two`),支持共用仓库、独立构建、统一访问。

要在 Netlify 上实现 一个域名承载多个独立 React 应用(例如 https://example.netlify.app 为主站,/app-one/app-two 为子应用),关键在于统一部署入口 + 路由代理 + 静态文件隔离。推荐采用 单仓库多目录结构 + 自定义 netlify.toml 重定向规则 的方案,无需多个 Netlify 站点,避免跨域与管理碎片化。

✅ 推荐架构:单仓库、多子目录、单部署站点

将所有应用组织在同一 Git 仓库根目录下,结构清晰、版本可控:

root/
├── app-one/          # React 应用一(含 package.json、src/、public/ 等)
├── app-two/          # React 应用二
├── main-app/         # 主 React 应用
├── netlify.toml      # 全局部署与重定向配置
└── package.json      # (可选)根目录聚合脚本,如 "build:all": "npm run build --prefix main-app && npm run build --prefix app-one && npm run build --prefix app-two"

⚠️ 注意:每个子应用需确保其 package.json 中的 "homepage" 字段正确设置(如 "/app-one"),否则路由跳转和静态资源路径会失效。例如 app-one/package.json 应包含:

"homepage": "/app-one"

?️ 配置 netlify.toml 实现路径级分发

在仓库根目录创建 netlify.toml,定义构建指令与路径重定向规则:

# netlify.toml

[build]
  command = "npm run build:all"  # 或依次构建各应用(见下方说明)
  publish = "main-app/build"     # 主应用构建产物作为默认发布目录(必须存在)

# 将 /app-one/* 请求全部指向 app-one 的 index.html(支持客户端路由)
[[redirects]]
  from = "/app-one/*"
  to = "/app-one/index.html"
  status = 200

# 同理处理 app-two
[[redirects]]
  from = "/app-two/*"
  to = "/app-two/index.html"
  status = 200

# 所有其他路径(包括 /)默认指向主应用
[[redirects]]
  from = "/*"
  to = "/main-app/index.html"
  status = 200

? 原理说明:Netlify 的重定向规则在服务器端生效,当用户访问 /app-one/dashboard 时,Netlify 不返回 404,而是将请求“内部重写”为 /app-one/index.html,交由 app-one 的 React Router 处理前端路由——这正是 Create React App 等 SPA 框架所需的 history 模式支持。

? 构建产物部署:静态文件需共存于同一输出目录

由于 Netlify 只允许指定一个 publish 目录,你需要将各应用的 build/ 输出合并到该目录下对应子路径中。推荐两种方式:

React Performance
React Performance

React 与 Next.js 性能优化模式。适用于编写、审查或重构代码以确保最佳性能。涉及组件、数据获取、构建包优化、减少重渲染或服务端组件架构时触发。

下载

方式一:使用构建脚本自动复制(推荐)

在根目录 package.json 中添加构建脚本:

{
  "scripts": {
    "build:main": "cd main-app && npm run build",
    "build:app-one": "cd app-one && npm run build",
    "build:app-two": "cd app-two && npm run build",
    "postbuild:app-one": "mkdir -p main-app/build/app-one && cp -r app-one/build/* main-app/build/app-one/",
    "postbuild:app-two": "mkdir -p main-app/build/app-two && cp -r app-two/build/* main-app/build/app-two/",
    "build:all": "npm run build:main && npm run build:app-one && npm run build:app-two"
  }
}

✅ 最终 main-app/build/ 目录结构如下:

main-app/build/
├── index.html          # 主应用入口
├── static/               # 主应用资源
├── app-one/
│   ├── index.html        # app-one 入口(已适配 homepage="/app-one")
│   └── static/           # app-one 资源
└── app-two/
    ├── index.html        # app-two 入口
    └── static/

方式二:使用 netlify-plugin-subdirectories 插件(进阶)

安装官方插件自动完成子目录构建与发布,适合大型项目,详见 Netlify 插件文档

✅ 部署与验证

  1. 将该仓库推送到 GitHub/GitLab;
  2. 在 Netlify 控制台新建站点,选择该仓库;
  3. 构建设置中确认:
    • Build command: npm run build:all
    • Publish directory: main-app/build
  4. 保存并触发部署;
  5. 部署成功后访问:
    • https://example.netlify.app → 主应用
    • https://example.netlify.app/app-one → app-one
    • https://example.netlify.app/app-two → app-two

⚠️ 注意事项与最佳实践

  • React Router 配置:每个子应用必须使用 <browserrouter basename="/app-one"></browserrouter>(或通过 homepage + HashRouter 降级),否则导航将跳转至根路径;
  • 静态资源路径:确保 public/ 中的图片、manifest 等引用路径与 homepage 一致(如 <link rel="manifest" href="%PUBLIC_URL%/manifest.json"> 会自动解析为 /app-one/manifest.json);
  • 环境变量隔离.env 文件不跨应用共享,各子应用应维护自己的 .env.production
  • CI/CD 效率:可配置 Netlify Build Plugins 或条件构建,避免每次修改 app-one 都重建全部应用;
  • 替代方案对比:若应用完全解耦、团队独立,也可用 Netlify Split Testing 或子域名(app-one.example.netlify.app),但路径模式更利于 SEO 统一与品牌一致性。

通过以上配置,你将以最小运维成本,在单一 Netlify 域名下优雅承载多个 React SPA,兼顾开发独立性与线上统一性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4026

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1029

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

3904

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

820

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1696

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

2965

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

3853

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

2440

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

808

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 11.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习