Сообщение Hassaan Tauqir выше, которое я пометил как ответ, помогло мне уточнить решение. Спасибо Hassaan.
package. json
Измените сценарии для среды PRODUCTION, чтобы указать BASE_URL.
"prod:build-server-bundle": "cross-env BASE_URL=/a/b webpack --config webpack.server.config.js",
"prod:build-client-bundle": "cross-env BASE_URL=/a/b webpack --config webpack.client.config.js",
Примечание: вы должны использовать «cross-env», иначе это не будет работать во всех операционных системах, поэтому мне пришлось сначала установить «cross-env»
npm install cross-env
Я оставил сценарии РАЗРАБОТКИ без изменений, как и я. не нужен путь при локальном тестировании
"dev:build-server-bundle": "webpack --config webpack.server.config.js --watch",
"dev:build-client-bundle": "webpack --config webpack.client.config.js --watch",
webpack.base.config. js
Чтение в BASE_URL
«BASE_URL» доступен в «webpack.base.config. js». Я добавил код, чтобы я мог обрабатывать "BASE_URL", указанный в конце sla sh или нет.
// Set up the BASE_URL parameter, ensuring it does not have a trailing slash
let BASE_URL = '';
if (process.env.BASE_URL) {
BASE_URL = process.env.BASE_URL.toString().trim();
if (BASE_URL.substr(-1) === '/') {
BASE_URL = BASE_URL.substr(0, BASE_URL.length - 1);
}
}
publicPath
В модуле " .exports "добавьте раздел" output "и добавьте параметр" publicPath ". «publicPath» позволяет указать базовый путь для всех ресурсов в вашем приложении, например, у меня есть изображения, на которые я ссылаюсь в своем приложении, используя следующий код.
import myImage from '../images/myImage.png';
....
<img src={myImage } alt="myImage " />
....
«publicPath» должен заканчиваться конечный sla sh, поэтому, если у нас есть BASE_URL, я добавляю / в противном случае оставляю его пустым.
output: {
publicPath: (BASE_URL) ? `${BASE_URL}/` : '',
},
Для получения дополнительной информации о «publicPath» см. https://webpack.js.org/guides/public-path/
webpack.DefinePlugin
В «module.exports» добавьте параметр «webpack.DefinePlugin», задающий переменную среды, которая будет передаваться при сбросе приложения
plugins: [
new webpack.DefinePlugin({
'process.env.BASE_URL': JSON.stringify(BASE_URL),
}),
],
Для получения дополнительной информации о «DefaultPlugin» см. https://webpack.js.org/plugins/define-plugin/
Маршрутизация на стороне сервера
Добавьте «базовое имя» в маршрутизатор на стороне сервера, значение которого является переменной, указанной в "DefinePlugin" в файле конфигурации веб-пакета
<StaticRouter context={context} location={req.path} basename={process.env.BASE_URL}>
...
</StaticRouter>
Маршрутизация на стороне клиента
Добавьте «базовое имя» к маршрутизатору на стороне клиента, значением которого является переменная spe указано в "DefinePlugin" в файле конфигурации веб-пакета
<BrowserRouter basename={process.env.BASE_URL}>
...
</BrowserRouter>