Skip to content

Commit 2247341

Browse files
authored
docs: Update Russian translation (#1378)
* Update ru.json * Update ru/about/libraries-addons.md * Update ru/guide/v10/debugging.md * Update ru/guide/v11/debugging.md * Update ru/guide/v10/signals.md * Update ru/guide/v11/signals.md * Add ru/guide/v11/preact-custom-element.md * Update ru/guide/v11/web-components.md
1 parent 8bd667e commit 2247341

File tree

8 files changed

+703
-116
lines changed

8 files changed

+703
-116
lines changed

content/ru/about/libraries-addons.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ description: Коллекция библиотек и дополнений, ко
4141
- :ice_cube: **[Kretes](https://kretes.dev/docs/howtos/preact-setup/)**: Разрабатываем full-stack приложения на TypeScript с использованием Preact и Node.js
4242
- 🏝: **[preact-island](https://github.com/mwood23/preact-island)**: Запускаем виджет Preact на любом веб-сайте с реактивными пропсами.
4343
- 🧩 **[ziko-wrapper](https://github.com/zakarialaoui10/ziko-wrapper)**: Оборачиваем ваши компоненты [ZikoJS](https://github.com/zakarialaoui10/zikojs) внутри Preact-приложения — и наоборот.
44+
- 💤 **[zikofy](https://github.com/zakarialaoui10/zikofy)**: Превращает компоненты Preact в `UIElement` из Zikojs.
4445

4546
## Инструментальные средства графического интерфейса
4647

content/ru/guide/v10/debugging.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ render(<App />, document.getElementById('root'));
6060

6161
Убедитесь, что переменная `NODE_ENV` имеет правильное значение в вашем инструменте сборки.
6262

63+
## Отладка сигналов
64+
65+
Если вы используете Preact Signals в своём приложении, доступны специализированные инструменты для отладки:
66+
67+
- **[Signals Debug](https://github.com/preactjs/signals/blob/main/packages/debug)** — Инструмент разработки, который предоставляет подробный вывод в консоль об обновлениях сигналов, выполнении эффектов и пересчётах вычисляемых значений.
68+
- **[Signals DevTools](https://github.com/preactjs/signals/blob/main/packages/devtools-ui)** — Визуальный интерфейс DevTools для отладки и визуализации Preact Signals в реальном времени. Его можно встроить прямо на страницу для демонстраций или интегрировать в собственные инструменты.
69+
70+
> **Примечание:** Это инструменты, независимые от фреймворка, из библиотеки Signals. Хотя они отлично работают с Preact, они не являются специфичными именно для Preact.
71+
6372
## Предупреждения и ошибки отладки
6473

6574
Иногда могут появляться предупреждения или ошибки, когда Preact обнаруживает недействительный код. Их необходимо исправить, чтобы обеспечить безупречную работу приложения.

content/ru/guide/v10/signals.md

Lines changed: 279 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,51 @@ function Optimized() {
498498

499499
Аналогичная оптимизация рендеринга также поддерживается при передаче сигналов в качестве атрибута в элементах DOM.
500500

501+
## Модели
502+
503+
Модели предоставляют структурированный способ создания реактивных контейнеров состояния, которые инкапсулируют сигналы, вычисляемые значения, эффекты и действия. Они предлагают чистый паттерн для организации сложной логики состояния, обеспечивая при этом автоматическую очистку и пакетные обновления.
504+
505+
По мере роста сложности приложений управление состоянием с помощью отдельных сигналов может стать неудобным. Модели решают эту проблему, объединяя связанные сигналы, вычисляемые значения и действия в цельные единицы. Это делает ваш код более поддерживаемым, тестируемым и понятным.
506+
507+
### Зачем использовать модели?
508+
509+
Модели дают несколько ключевых преимуществ:
510+
511+
- **Инкапсуляция**: Группируют связанное состояние и логику вместе, делая очевидным, что к чему относится
512+
- **Автоматическая очистка**: Эффекты, созданные в моделях, автоматически удаляются при уничтожении модели, предотвращая утечки памяти
513+
- **Автоматическая пакетная обработка**: Все методы автоматически оборачиваются как действия, обеспечивая оптимальную производительность
514+
- **Компонуемость**: Модели можно вкладывать друг в друга и комбинировать, при этом родительские модели автоматически управляют жизненным циклом дочерних
515+
- **Повторное использование**: Модели могут принимать параметры инициализации, что делает их пригодными для повторного использования в разных контекстах
516+
- **Тестируемость**: Модели можно создавать и тестировать изолированно, без необходимости рендеринга компонентов
517+
518+
Вот простой пример, показывающий, как модели организуют состояние:
519+
520+
```js
521+
import { signal, computed, createModel } from '@preact/signals';
522+
523+
const CounterModel = createModel((initialCount = 0) => {
524+
const count = signal(initialCount);
525+
const doubled = computed(() => count.value * 2);
526+
527+
return {
528+
count,
529+
doubled,
530+
increment() {
531+
count.value++;
532+
},
533+
decrement() {
534+
count.value--;
535+
}
536+
};
537+
});
538+
539+
const counter = new CounterModel(5);
540+
counter.increment();
541+
console.log(counter.count.value); // 6
542+
```
543+
544+
Подробнее о том, как использовать модели в ваших компонентах, и полная справочная информация по API — см. [API моделей](#createmodelfactory) в разделе API ниже.
545+
501546
## API
502547

503548
В этом разделе представлен обзор API сигналов. Он призван стать кратким справочником для людей, которые уже знают, как использовать сигналы, и нуждаются в напоминании о том, что доступно.
@@ -594,8 +639,8 @@ batch(() => {
594639
Функция `untracked(fn)` может быть использована для доступа к значению нескольких сигналов без подписки на них.
595640

596641
```js
597-
const name = signal("Jane");
598-
const surname = signal("Doe");
642+
const name = signal("Джейн");
643+
const surname = signal("Доу");
599644

600645
effect(() => {
601646
untracked(() => {
@@ -604,6 +649,229 @@ effect(() => {
604649
})
605650
```
606651

652+
### createModel(factory)
653+
654+
Функция `createModel(factory)` создаёт конструктор модели из фабричной функции. Фабричная функция может принимать аргументы для инициализации и должна возвращать объект, содержащий сигналы, вычисляемые значения и методы-действия.
655+
656+
```js
657+
import { signal, computed, effect, createModel } from '@preact/signals';
658+
659+
const CounterModel = createModel((initialCount = 0) => {
660+
const count = signal(initialCount);
661+
const doubled = computed(() => count.value * 2);
662+
663+
effect(() => {
664+
console.log('Счётчик изменился:', count.value);
665+
});
666+
667+
return {
668+
count,
669+
doubled,
670+
increment() {
671+
count.value++;
672+
},
673+
decrement() {
674+
count.value--;
675+
}
676+
};
677+
});
678+
679+
// Создаём новый экземпляр модели с помощью `new`
680+
const counter = new CounterModel(5);
681+
counter.increment(); // Обновления автоматически группируются в пакет
682+
console.log(counter.count.value); // 6
683+
console.log(counter.doubled.value); // 12
684+
685+
// Очищаем все эффекты, когда закончили
686+
counter[Symbol.dispose]();
687+
```
688+
689+
#### Ключевые возможности
690+
691+
- **Аргументы фабрики**: Фабричные функции могут принимать аргументы для инициализации, что делает модели повторно используемыми с разными конфигурациями.
692+
- **Автоматическая пакетная обработка**: Все методы, возвращаемые из фабрики, автоматически оборачиваются как действия, поэтому обновления состояния внутри них группируются в пакет и не отслеживаются.
693+
- **Автоматическая очистка эффектов**: Эффекты, созданные при построении модели, захватываются и автоматически удаляются при уничтожении модели через `Symbol.dispose`.
694+
- **Компонуемые модели**: Модели естественно компонуются — эффекты из вложенных моделей захватываются родительской и удаляются вместе с ней при уничтожении родителя.
695+
696+
#### Композиция моделей
697+
698+
Модели можно вкладывать друг в друга. При уничтожении родительской модели все эффекты из вложенных моделей автоматически очищаются:
699+
700+
```js
701+
const TodoItemModel = createModel((text) => {
702+
const completed = signal(false);
703+
704+
return {
705+
text,
706+
completed,
707+
toggle() {
708+
completed.value = !completed.value;
709+
}
710+
};
711+
});
712+
713+
const TodoListModel = createModel(() => {
714+
const items = signal([]);
715+
716+
return {
717+
items,
718+
addTodo(text) {
719+
const todo = new TodoItemModel(text);
720+
items.value = [...items.value, todo];
721+
},
722+
removeTodo(todo) {
723+
items.value = items.value.filter(t => t !== todo);
724+
todo[Symbol.dispose]();
725+
}
726+
};
727+
});
728+
729+
const todoList = new TodoListModel();
730+
todoList.addTodo('Купить продукты');
731+
todoList.addTodo('Выгулять собаку');
732+
733+
// Уничтожение родительской модели также очищает все эффекты вложенных моделей
734+
todoList[Symbol.dispose]();
735+
```
736+
737+
### action(fn)
738+
739+
Функция `action(fn)` оборачивает функцию для выполнения в пакетном и неотслеживаемом контексте. Это полезно, когда нужно создать самостоятельные действия вне модели:
740+
741+
```js
742+
import { signal, action } from '@preact/signals';
743+
744+
const count = signal(0);
745+
746+
const incrementBy = action((amount) => {
747+
count.value += amount;
748+
});
749+
750+
incrementBy(5); // Пакетное обновление
751+
```
752+
753+
### useModel(modelOrFactory)
754+
755+
Хук `useModel` доступен как в пакете `@preact/signals`, так и в `@preact/signals-react`. Он отвечает за создание экземпляра модели при первом рендере, сохранение того же экземпляра при последующих перерисовках и автоматическое уничтожение модели при размонтировании компонента.
756+
757+
```jsx
758+
import { signal, createModel } from '@preact/signals';
759+
import { useModel } from '@preact/signals';
760+
761+
const CounterModel = createModel(() => ({
762+
count: signal(0),
763+
increment() {
764+
this.count.value++;
765+
}
766+
}));
767+
768+
function Counter() {
769+
const model = useModel(CounterModel);
770+
771+
return (
772+
<button onClick={() => model.increment()}>
773+
Счётчик: {model.count}
774+
</button>
775+
);
776+
}
777+
```
778+
779+
Для моделей, которым требуются аргументы конструктора, оберните создание экземпляра в фабричную функцию:
780+
781+
```jsx
782+
const CounterModel = createModel((initialCount) => ({
783+
count: signal(initialCount),
784+
increment() {
785+
this.count.value++;
786+
}
787+
}));
788+
789+
function Counter({ initialValue }) {
790+
// Используйте фабричную функцию для передачи аргументов
791+
const model = useModel(() => new CounterModel(initialValue));
792+
793+
return (
794+
<button onClick={() => model.increment()}>
795+
Счётчик: {model.count}
796+
</button>
797+
);
798+
}
799+
```
800+
801+
### Рекомендуемые паттерны
802+
803+
#### Явный паттерн ReadonlySignal
804+
805+
Для лучшей инкапсуляции объявляйте интерфейс вашей модели явно и используйте `ReadonlySignal` для сигналов, которые должны изменяться только через экшены:
806+
807+
```ts
808+
import { signal, computed, createModel, ReadonlySignal } from '@preact/signals';
809+
810+
interface Counter {
811+
count: ReadonlySignal<number>;
812+
doubled: ReadonlySignal<number>;
813+
increment(): void;
814+
decrement(): void;
815+
}
816+
817+
const CounterModel = createModel<Counter>(() => {
818+
const count = signal(0);
819+
const doubled = computed(() => count.value * 2);
820+
821+
return {
822+
count,
823+
doubled,
824+
increment() {
825+
count.value++;
826+
},
827+
decrement() {
828+
count.value--;
829+
}
830+
};
831+
});
832+
833+
const counter = new CounterModel();
834+
counter.increment(); // OK
835+
counter.count.value = 10; // Ошибка TypeScript: Cannot assign to 'value'
836+
```
837+
838+
#### Пользовательская логика уничтожения
839+
840+
Если вашей модели требуется пользовательская логика очистки, не связанная с сигналами (например, закрытие WebSocket-соединений), используйте эффект без зависимостей, который возвращает функцию очистки:
841+
842+
```js
843+
const WebSocketModel = createModel((url) => {
844+
const messages = signal([]);
845+
const ws = new WebSocket(url);
846+
847+
ws.onmessage = (e) => {
848+
messages.value = [...messages.value, e.data];
849+
};
850+
851+
// Этот эффект выполняется один раз; его очистка запускается при уничтожении
852+
effect(() => {
853+
return () => {
854+
ws.close();
855+
};
856+
});
857+
858+
return {
859+
messages,
860+
send(message) {
861+
ws.send(message);
862+
}
863+
};
864+
});
865+
866+
const chat = new WebSocketModel('wss://example.com/chat');
867+
chat.send('Привет!');
868+
869+
// Закрывает WebSocket-соединение при уничтожении
870+
chat[Symbol.dispose]();
871+
```
872+
873+
Этот паттерн аналогичен `useEffect(() => { return cleanup }, [])` в React и гарантирует, что очистка происходит автоматически при композиции моделей — родительским моделям не нужно знать о функциях уничтожения вложенных моделей.
874+
607875
## Вспомогательные компоненты и хуки
608876

609877
Начиная с версии v2.1.0, пакет `@preact/signals/utils` предоставляет дополнительные вспомогательные компоненты и хуки, упрощающие работу с сигналами.
@@ -693,3 +961,12 @@ function Component() {
693961
);
694962
}
695963
```
964+
965+
## Отладка
966+
967+
Если вы используете Preact Signals в своём приложении, доступны специализированные инструменты для отладки:
968+
969+
- **[Signals Debug](https://github.com/preactjs/signals/blob/main/packages/debug)** — Инструмент разработки, который предоставляет подробный вывод в консоль об обновлениях сигналов, выполнении эффектов и пересчётах вычисляемых значений.
970+
- **[Signals DevTools](https://github.com/preactjs/signals/blob/main/packages/devtools-ui)** — Визуальный интерфейс DevTools для отладки и визуализации Preact Signals в реальном времени. Его можно встроить прямо на страницу для демонстраций или интегрировать в собственные инструменты.
971+
972+
> **Примечание:** Это инструменты, независимые от фреймворка, из библиотеки Signals. Хотя они отлично работают с Preact, они не являются специфичными именно для Preact.

content/ru/guide/v11/debugging.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ render(<App />, document.getElementById('root'));
6060

6161
Убедитесь, что переменная `NODE_ENV` имеет правильное значение в вашем инструменте сборки.
6262

63+
## Отладка сигналов
64+
65+
Если вы используете Preact Signals в своём приложении, доступны специализированные инструменты для отладки:
66+
67+
- **[Signals Debug](https://github.com/preactjs/signals/blob/main/packages/debug)** — Инструмент разработки, который предоставляет подробный вывод в консоль об обновлениях сигналов, выполнении эффектов и пересчётах вычисляемых значений.
68+
- **[Signals DevTools](https://github.com/preactjs/signals/blob/main/packages/devtools-ui)** — Визуальный интерфейс DevTools для отладки и визуализации Preact Signals в реальном времени. Его можно встроить прямо на страницу для демонстраций или интегрировать в собственные инструменты.
69+
70+
> **Примечание:** Это инструменты, независимые от фреймворка, из библиотеки Signals. Хотя они отлично работают с Preact, они не являются специфичными именно для Preact.
71+
6372
## Предупреждения и ошибки отладки
6473

6574
Иногда могут появляться предупреждения или ошибки, когда Preact обнаруживает недействительный код. Их необходимо исправить, чтобы обеспечить безупречную работу приложения.

0 commit comments

Comments
 (0)