Первое приложение на Solid.js

Solid.js — это современный фреймворк для создания пользовательских интерфейсов, который использует реактивность на основе вычислений и минимальных изменений в DOM. Этот фреймворк позволяет строить быстрые и легковесные веб-приложения, при этом его подход к реактивности сильно отличается от других фреймворков, таких как React.

Создание первого приложения на Solid.js начинается с установки необходимых зависимостей и настройки проекта. Solid.js предоставляет простой и удобный способ начать разработку с минимальной конфигурацией, при этом он также позволяет интегрировать сторонние библиотеки и инструменты для более сложных приложений.

Установка и настройка проекта

Для начала необходимо установить Node.js, если он еще не установлен на вашем компьютере. Затем, используя командную строку или терминал, можно создать новый проект с помощью Create Solid App, официального шаблона для создания приложений на Solid.js.

Для этого достаточно выполнить следующую команду:

npm create solid@latest

После этого будет предложено выбрать шаблон для приложения, а также указать его название. Выбрав подходящий шаблон, нужно перейти в каталог проекта и установить все зависимости:

cd имя-проекта
npm install

Теперь проект готов для запуска. Для старта локального сервера достаточно выполнить команду:

npm start

При этом откроется приложение по адресу http://localhost:3000, и вы сможете увидеть начальную страницу.

Структура проекта

После установки и запуска проекта, структура файлов и каталогов выглядит следующим образом:

  • src/ — основной каталог для исходных файлов проекта.
  • src/index.jsx — основной файл, где инициализируется приложение.
  • src/App.jsx — главный компонент приложения.

При этом проект уже содержит базовые компоненты и настройку, которые можно использовать в качестве отправной точки для дальнейшей разработки.

Компоненты в Solid.js

Компоненты в Solid.js представляют собой JavaScript-функции, которые возвращают элементы DOM. Solid.js использует декларативный подход, позволяя компоненты описывать как результат вычислений. Главное отличие от React заключается в том, что Solid.js использует компиляцию для отслеживания реактивных зависимостей, что позволяет обновлять только необходимые части DOM без перерасчета всего компонента.

Пример простого компонента:

import { createSignal } from 'solid-js';

function Counter() {
  const [count, setCount] = createSignal(0);

  return (
    <div>
      <p>Счетчик: {count()}</p>
      <button onCl ick={() => setCount(count() + 1)}>Увеличить</button>
    </div>
  );
}

export default Counter;

Здесь используется хук createSignal, который создает реактивное состояние. count() возвращает текущее значение состояния, а setCount — функция для обновления этого значения. Каждый раз, когда вызывается setCount, Solid.js обновляет только часть DOM, которая зависит от этого состояния.

Реактивность в Solid.js

В Solid.js ключевым понятием является реактивность. Вместо того чтобы работать с состоянием в классовом или функциональном компоненте и заставлять весь компонент перерендериваться при изменении состояния, Solid.js обновляет только те части интерфейса, которые зависят от изменившихся данных.

Для этого Solid.js использует систему «зависимостей». Компоненты и их элементы могут подписываться на изменения состояния, и если состояние изменяется, только те части интерфейса, которые напрямую зависят от этого состояния, будут обновляться.

В приведенном примере выше, когда мы вызываем setCount, компонент Counter не перерендеривается целиком. Вместо этого обновляется только тот фрагмент DOM, где используется значение count().

Создание и использование сигналов

Сигналы в Solid.js — это способ создания реактивных данных, которые автоматически отслеживают зависимости. Когда состояние обновляется, Solid.js изменяет только те части интерфейса, которые зависят от этого состояния.

Пример использования сигналов:

import { createSignal } from 'solid-js';

function App() {
  const [count, setCount] = createSignal(0);

  return (
    <div>
      <h1>Счетчик: {count()}</h1>
      <button onCl ick={() => setCount(count() + 1)}>Увеличить</button>
    </div>
  );
}

export default App;

В данном примере создается сигнал count, который инициализируется значением 0. При нажатии на кнопку значение count увеличивается на единицу. При этом Solid.js отслеживает изменения состояния и обновляет только ту часть DOM, которая зависит от значения count.

Рендеринг и виртуальный DOM

Solid.js использует технологию виртуального DOM, но в отличие от других фреймворков, таких как React, здесь применяется более оптимизированный подход. Вместо того чтобы производить полный перерасчет виртуального DOM при каждом изменении состояния, Solid.js компилирует шаблоны и следит за изменениями данных, минимизируя количество операций.

Когда состояние компонента изменяется, Solid.js проверяет, какие части интерфейса нуждаются в обновлении, и минимизирует работу с реальным DOM, обновляя только те элементы, которые действительно изменились.

Обработчики событий и взаимодействие с пользователем

Solid.js позволяет легко добавлять обработчики событий, например, для работы с кнопками, формами и другими элементами управления. Обработчики в Solid.js аналогичны тем, что используются в JavaScript, с одной важной особенностью — они могут быть напрямую привязаны к реактивным данным.

Пример обработчика события:

import { createSignal } from 'solid-js';

function App() {
  const [message, setMessage] = createSignal('Привет, мир!');

  function handleClick() {
    setMessage('Нажата кнопка');
  }

  return (
    <div>
      <p>{message()}</p>
      <button onCl ick={handleClick}>Нажми меня</button>
    </div>
  );
}

export default App;

Когда пользователь нажимает на кнопку, значение состояния message изменяется с помощью функции setMessage. Так как message — это сигнал, изменение его значения приводит к автоматическому обновлению DOM, и отображаемое сообщение на странице меняется.

Состояния и побочные эффекты

Помимо сигналов, в Solid.js также можно использовать более сложные концепции, такие как createEffect, для работы с побочными эффектами. Это позволяет следить за изменениями состояния и выполнять дополнительные действия в ответ на них.

Пример с createEffect:

import { createSignal, createEffect } from 'solid-js';

function App() {
  const [count, setCount] = createSignal(0);

  createEffect(() => {
    console.log('Текущее значение счетчика: ', count());
  });

  return (
    <div>
      <p>Счетчик: {count()}</p>
      <button onCl ick={() => setCount(count() + 1)}>Увеличить</button>
    </div>
  );
}

export default App;

В данном примере createEffect следит за изменениями значения count и выводит его в консоль всякий раз, когда счетчик изменяется. Это полезно для реализации побочных эффектов, таких как запросы к серверу или манипуляции с DOM.

Заключение

Solid.js представляет собой высокопроизводительный фреймворк для создания реактивных веб-приложений, с особенностями, которые позволяют минимизировать перерасчет DOM и обеспечивать высокую производительность. Простота в использовании, реактивность и компактность кода делают его отличным выбором для разработчиков, которые ищут высокоэффективные решения для разработки UI.