Better

Ethan的博客,欢迎访问交流

如何将 React App 部署在子目录

有时候我们需要将一个 App 部署在另一个项目的子目录下,CRA 默认设置会导致一些资源加载 404 的情况出现。

原因

React 并不知道你将应用部署在子目录下,加载资源时依旧从根目录出发。

解决这个问题,需要从两方面出发

  • 资源加载问题,主要表现在 JavaScript、CSS 和 静态资源(图片,字体等)
  • 路由导航问题

解决办法

资源加载问题通过设置 package.jsonhomepage 属性来配置子目录名称

路由问题通过设置 BrowserRouterbasename 属性

PUBLIC_URL 环境变量,可以理解为优先级最高,大于 package.json 中 homepage 设置

Angular

最近在部署 Angular 时,也需要部署在非根目录下,然而官方文档并没有详细的说明,最后在 google 中找到如下命令成功实施

ng build -prod --base-href /users --deploy-url /public

看参数名称,就更理解 React 中两个设置的具体含义了

  • --base-href:解决路由问题
  • --deploy-url:解决资源访问问题

对应 React 而言

  • basename:解决路由问题
  • homepage:解决资源访问问题

关于 base 标签

Angular 关于路由的实现原理,是通过在 Head 标签中添加 <base> 标签实现的。关于 base 标签的作用,MDN 的定义为

用于文档中相对 URL 地址的基础 URL。允许绝对和相对URL。

umijs

对于 umijs 中,同样提供了类似的解决方案,主要通过配置 config 实现

  • base:解决路由问题
  • publicPath:解决静态资源问题

资料



留言