有时候我们需要将一个 App 部署在另一个项目的子目录下,CRA 默认设置会导致一些资源加载 404 的情况出现。
原因
React 并不知道你将应用部署在子目录下,加载资源时依旧从根目录出发。
解决这个问题,需要从两方面出发
- 资源加载问题,主要表现在 JavaScript、CSS 和 静态资源(图片,字体等)
- 路由导航问题
解决办法
资源加载问题通过设置 package.json
的 homepage
属性来配置子目录名称
路由问题通过设置 BrowserRouter
的 basename
属性
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:解决静态资源问题