#webpack #electron
Вопрос:
Здравствуйте и извините за мой английский. Я создаю приложение с помощью Electron (Webpack TS React Redux), и у меня проблема. На сервере Webpack Dev есть система замены горячих модулей (HMR), и я использую ее, и она хорошо работает. Я меняю стили, реагирую на компоненты и перезагружаю приложение после этих изменений. Но когда я открываю Инструменты разработчика в приложении (Ctrl Shift I или в меню «Вид») HMR выходит из строя. Я вижу в консоли на Инструментах разработчика:
[HMR] Cannot apply update. Need to do a full reload!
[HMR] Error: Aborted because ./src/renderer/containers/MainScreen/index.tsx is not accepted
Update propagation: ./src/renderer/containers/MainScreen/index.tsx -> ./src/renderer/containers/App/index.tsx -> ./src/renderer/renderer.tsx
at applyHandler (http://localhost:8085/build/renderer.js:60091:31)
at http://localhost:8085/build/renderer.js:59807:21
at Array.map (<anonymous>)
at internalApply (http://localhost:8085/build/renderer.js:59806:54)
at http://localhost:8085/build/renderer.js:59781:24
at waitForBlockingPromises (http://localhost:8085/build/renderer.js:59737:55)
at http://localhost:8085/build/renderer.js:59779:22
После этого приложение не перезагружается, и я не вижу изменений в компонентах или стилях. Кнопка принудительной перезагрузки тоже не работает.
Но я работаю на 2 компьютерах, и проблема только на одном, на втором все хорошо работает с некоторой операционной системой, пакетами npm и конфигурацией webpack. Я пытался изменить версию узла, electron и некоторые другие, но проблема остается.
Моя конфигурация разработчика Webpack:
mode: 'development',
entry: MAIN
? path.resolve(`${baseWebpackConfig.externals.paths.src}/main/main.ts`)
: path.resolve(`${baseWebpackConfig.externals.paths.src}/renderer/renderer.tsx`),
output: {
path: `${baseWebpackConfig.externals.paths.dist}`,
filename: MAIN ? 'index.js' : 'renderer.js',
publicPath: 'http://localhost:8085/build/',
},
target: MAIN ? 'electron-main' : 'electron-renderer',
devtool: 'cheap-module-source-map',
optimization: {},
devServer: !MAIN ? {
publicPath: 'http://localhost:8085/build/',
port: '8085',
host: '0.0.0.0',
historyApiFallback: true,
hot: true,
inline: true,
progress: false,
index: 'index.html',
} : {},
watchOptions: {
ignored: /node_modules/,
},
plugins: [],
},
Я понятия не имею, в чем дело.
Ответ №1:
Я решил проблему HMR, добавив
if (module.hot) {
module.hot.accept();
}
на рендеринге и основных файлах.ts, но принудительная перезагрузка все еще не работает.