由於要把dist文件夾部署在一個域名的次級目錄,沒想到和運維同窗一塊兒折騰了一下午。。css
放在這裏備忘,也給後來的同窗一些可查的中文資料:html
1,dva/cra給你的模板index.html是在public裏面的,webpack會原封不動拷到dist,其中引入index.js和index.css都是絕對路徑,能夠用webpack ejs插件生成htmnl,由於我用了dva,不太想改webpack 配置太多,這裏選用直接手去掉前綴/變成相對路徑react
2, 項目裏面使用了react-i18next, locale文件是放到public裏面的,配置locale初始化的時候根據環境變量修改下引入目錄是/仍是/sub/webpack
3,路由react-router匹配的prefix前綴nginx
export const browserHistory = useRouterHistory(createHistory)({ basename: process.env.PUBLIC_PATH || '/', }) 若是是dva import { createHistory } from 'history' import { useRouterHistory } from 'react-router' const app = dva({ history: browserHistory, });
小坑一個!
dva裏面的路由跳轉會這麼寫:web
import { browserHistory } from 'dva/router'; browserHistory.push('some/route')
因爲咱們自定義了history,這樣會失效, 因此必定記得要import剛纔export出來的history,而不是dva默認的那個!react-router
4,webpack設置publickPath:/sub/app
5,nginx配置:運維
server { listen 80; server_name www.abc.com; root /項目/root地址/不帶sub; location /sub { try_files $uri $uri/ /sub/index.html; } }
搞定~插件
edit: 有可能會遇到的坑
- dva的subscription會推薦
if (pathname === '/path')
, 加上publicPath以後會匹配失敗- pathToRegexp 生成的表達式是嚴格匹配,會跟publicPath匹配失敗
解決也很簡單 根據環境變量更改匹配規則便可。