Hot Module Replacement (HMR) — механизм, позволяющий обновлять модули приложения на лету без полной перезагрузки страницы. В контексте Inferno HMR особенно полезен для разработки пользовательских интерфейсов, так как сохраняет состояние компонентов и ускоряет процесс итеративной разработки.
HMR интегрируется с системами сборки, такими как Webpack или Vite. Основная идея заключается в том, что при изменении исходного кода отдельного модуля, система сборки пересобирает только этот модуль и передает изменения в браузер через WebSocket. В результате браузер обновляет только измененные части приложения, не теряя состояние.
Для работы HMR в Inferno требуется:
webpack-dev-server с параметром
hot: true:const path = require('path');
const webpack = require('webpack');
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
devServer: {
hot: true,
open: true,
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
],
};
index.js) необходимо добавить проверку наличия
HMR и подключение логики перезагрузки модулей:import { render } from 'inferno';
import App from './App';
const root = document.getElementById('app');
render(<App />, root);
if (module.hot) {
module.hot.accept('./App', () => {
const NextApp = require('./App').default;
render(<NextApp />, root);
});
}
HMR в Inferno поддерживает замену компонентов без полного сброса
состояния, если используется библиотека inferno-hydrate или
правильно структурирован компонент с локальным состоянием через
useState и useEffect. Ключевой момент —
избегать пересоздания корневого узла приложения, иначе состояние будет
потеряно.
Пример сохранения состояния при обновлении:
import { useState } from 'inferno';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Счёт: {count}</p>
<button onCl ick={() => setCount(count + 1)}>Увеличить</button>
</div>
);
}
export default Counter;
Даже после изменения кода Counter HMR перезагрузит только компонент,
сохранив текущее значение count.
Для сложных приложений с глобальным состоянием рекомендуется
использовать state management (например,
redux или mobx). HMR позволяет интегрироваться
с этими системами:
import { createStore } from 'redux';
import rootReducer from './reducers';
const store = createStore(rootReducer);
if (module.hot) {
module.hot.accept('./reducers', () => {
const nextRootReducer = require('./reducers').default;
store.replaceReducer(nextRootReducer);
});
}
export default store;
key для корневых
компонентов: позволяет явно контролировать момент перерисовки и
сохранить состояние только при необходимости.При использовании TypeScript необходимо дополнительно настраивать HMR
через ts-loader или esbuild-loader. Основная
логика остаётся прежней, важно лишь, чтобы при
module.hot.accept TypeScript корректно обрабатывал типы и
default export.
HMR в Inferno является мощным инструментом, позволяющим значительно ускорить процесс разработки интерфейсов, уменьшить время отклика при внесении изменений и повысить удобство работы с состоянием компонентов.