Inferno — это высокопроизводительный JavaScript-фреймворк для построения пользовательских интерфейсов, совместимый с концепциями React, но с рядом принципиальных отличий:
ReactDOM.render или хуки, реализованы с небольшими
изменениями.В приложениях на Inferno сохраняется привычная структура:
inferno или inferno-component.ReactDOM.render
применяется render из пакета inferno, которое
напрямую рендерит виртуальный DOM в реальный:import { render } from 'inferno';
import App from './App';
render(<App />, document.getElementById('root'));
Inferno поддерживает жизненный цикл компонентов, схожий с React, но с оптимизацией скорости. Основные методы:
componentDidMount — вызывается после вставки компонента
в DOM.componentWillUnmount — вызывается перед удалением
компонента.shouldComponentUpdate — используется для контроля
рендеринга и повышения производительности.componentDidUpdate — вызывается после обновления
компонента.Функциональные компоненты в Inferno также поддерживают хуки, но с некоторыми ограничениями. Для миграции React-компонентов с хуками может потребоваться адаптация:
import { useState } from 'inferno-hooks';
function Counter() {
const [count, setCount] = useState(0);
return (
<button onCl ick={() => setCount(count + 1)}>
{count}
</button>
);
}
JSX переносится без изменений, однако следует учитывать разницу в обработке событий и атрибутов:
className, htmlFor
сохраняются.При миграции компонентов важно убедиться, что все props и состояния передаются корректно, особенно при использовании ref:
import { createRef, Component } from 'inferno';
class InputFocus extends Component {
constructor(props) {
super(props);
this.inputRef = createRef();
}
focusInput() {
this.inputRef.current.focus();
}
render() {
return <input ref={this.inputRef} />;
}
}
Inferno поддерживает концепцию состояния и контекста, аналогичную
React. Для классовых компонентов используется this.state и
this.setState. Для функциональных компонентов —
useState и useContext.
Контекст создается через createContext:
import { createContext } from 'inferno';
const ThemeContext = createContext('light');
function Toolbar() {
return (
<ThemeContext.Consumer>
{theme => <div className={theme}>Toolbar</div>}
</ThemeContext.Consumer>
);
}
Inferno совместим с большинством популярных библиотек для маршрутизации и управления состоянием:
inferno-router
или адаптированные версии react-router.inferno-redux для
оптимизации.Inferno предоставляет несколько инструментов для повышения производительности:
Миграция с React на Inferno минимально нарушает архитектуру приложения, если соблюдается совместимость JSX, props и жизненного цикла. Основной выигрыш достигается за счет производительности и уменьшенного размера библиотеки, что особенно важно для крупных SPA и приложений с интенсивным обновлением UI.