Рассказ три дерева читать

Eliace 24 октября 2021 в 11:52 на дворе октябрь, в npm залита новая версия фреймворка chorda 3.0. можно, наконец, устроиться


eliace

На дворе октябрь, в npm залита новая версия фреймворка Chorda 3.0. Можно, наконец, устроиться поудобнее за чашечкой кофе и подвести некоторые итоги

Про сам фреймворк можно почитать здесь, посмотреть тут и пощупать там

В прошлый раз я рассказывал о дизайн-функции, чертежах и построении API компонентов, а в этот раз попробую заинтересовать вас некоторыми очевидными решениями и не очень очевидными следствиями, которые появились во время работы с Chorda

Очевидные решения

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

Расширение библиотечных компонентов

Начну с декларативного подхода и примесей — краеугольного камня Chorda. Для наглядности нам понадобится немного кода.

Создадим простой компонент на JSX (React) с кнопкой и текстом. Задача: при клике по кнопке меняется текст

const MyComponent = () => {

	const [data, changeData] = useState('')

	const hahdleClick = (e) => {
		changeData('Hello')
	}

	return <div>
  	<button onClick={handleClick}>Click me</button>
  	<p>{data}</p>
	</div>

}

// вот так выглядит применение компонента
<MyComponent/>

Сделаем похожий функционал, используя чертеж Chorda

// вырожденная дизайн-функция
const MyComponent = () => {
    return {
        templates: {
            button: {
                tag: 'button',
                text: 'Click me',
                events: {
                    // обработка событий VDOM
                    $dom: {
                        click: (evt, {data}) => {
                            data.$value = 'Hello'
                        }
                    }
                }
            },
            text: {
                tag: 'p',
                reactions: {
                    // реакции компонента на изменение переменной скоупа
                    data: v => patch({text: v})
                }
            }
        },
        initials: {
            // инициализация переменной в скоупе
            data: () => observable('')
        }
    }
}

// создаем чертеж
MyComponent()

Ну, все. Расходимся, ребята. Очевидно же, что шаблонный синтаксис намного проще и понятнее.

Но

Давайте посмотрим, что происходит с нашим JSX компонентом дальше. Итак, мы выполнили задачу, и теперь передаем наши наработки коллеге, скажем, в составе корпоративной или публичной библиотеки. Через некоторое время от коллеги приходит просьба: хочу, чтобы компонент можно было стилизовать. Не вопрос. Самый простой и быстрый способ это сделать — дать возможность управлять классом корневого компонента через пропсы.

Поехали

// Придется залезть в библиотеку (!) и сделать пару правок

const MyComponent = (props) => {

    const {rootClassName} = props

    /* Тут ничего не меняется. Пропускаем */

    return <div className={rootClassName}>
        <button onClick={handleClick}>Click me</button>
        <p>{data}</p>
    </div>
}

// рендерим
<MyComponent rootClassName="custom" />

Отлично!

Тем временем в Chorda

// Менять оригинальный чертеж необходимости нет

// В месте применения создадим примесь
mix(MyComponent(), {
    css: 'custom',
})

Естественно, стилизацией обычно дело не заканчивается. Чем дальше, тем больше хотелок и тем больше пропсов нам понадобится добавить.

На самом деле подобные извращения следует пресекать в зародыше, и сразу предоставлять возможность потребителю «слотировать» вложенные компоненты. Однако, в нашем примере компоненты оказались жестко связаны state-параметром data. Просто так вытащить их не получится, поэтому посмотрим, во что может превратиться реализация с пропсами

const MyComponent = (props) => {

    const {rootProps, buttonProps, text: MyText} = props

    /* тут ничего не меняется */

    return <div {...rootProps} >
        <button onClick={handleClick} {...buttonProps} >Click me</button>
        <MyText>{data}</MyText>
    </div>
}

<MyComponent 
    rootProps={{className: 'custom'}} 
    buttonProps={{className: 'custom-button'}}
    text={props => <p className="custom-text">{props.children}</p>}
    />

В ситуации с чертежом без особых именений

// Расширяем примесь
mix(MyComponent(), {
    css: 'custom',
    templates: {
        button: {
            css: 'custom-button'
        },
        text: {
            css: 'custom-text'
        }
    }
})

Для React типовое решение проблемы это вынесение состояния из компонента. Получившийся «глупый» компонент уже не будет иметь внутри сильной связи и позволит легко «слотировать» вложения. Но здесь есть подводный камень. Архитектура такая штука, что если где-то убыло, то где-то прибыло. Выбрасывая сложность из наших компонентов мы ее копим в другом месте, а именно там, где компонент будет применяться

Стоит признать, с примесями тоже не все так гладко. Чтобы сделать хорошо расширяемый компонент, его необходимо сильно декомпозировать, а это напрямую влияет на производительность и восприятие кода в целом (по второму пункту полезно почитать о причинах появления setup во Vue 3)

Так к чему все это сравнение? Тот же React может предложить много вариантов и подходов для расширения функционала, один экзотичнее другого. Chorda же предлагает один путь (на самом деле нет), что на мой взгляд экономит на выборе уйму времени

Этот компонент мне не подходит

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

Тогда на выбор:

1. Делаем форк, вносим в него правки. Делаем PR в репо библиотеки. Пока ждем влития, пользуемся форком

2. Делаем свой компонент. Используем его вместо библиотечного. Ждем новой версии библиотеки

3. (для обладателей особого дара убеждения) Объясняем автору библиотеки в чем он не прав и почему он должен внести нужные вам правки как можно скорее. Профит!

4. Забиваем

Если вы используете Chorda, то у вас появляется еще один вариант: подмешать свой функционал к чужому компоненту. В этом случае компонент как-бы продолжает оставаться частью оригинальной библиотеки, но в то же время содержит нужные вам изменения

Mount или не Mount?

Наверно, правильнее этот вопрос надо задать так: в какой момент должна начинаться обработка бизнес задач?

Хорошо проиллюстрирует мою мысль пример с загрузкой данных в store приложении при открытии страницы. Как правило, загрузка выполняется по событию монтирования узла виртуального DOM, что есть странно — зачем что-то добавлять в DOM, если данных еще нет? Почему бы нам сначала не загрузить данные, а потом решать — рендерить что-то или нет. Тут ситуацию немного спасает Suspense и понятие асинхронных компонентов, когда у каждого из них есть своя отложенная задача и, соответственно, отложенная отрисовка

Мне же больше нравится вариант, когда загрузка вообще никак не связана с рендерингом. В Chorda бизнес-логика находится на уровне дерева компонентов, а результаты выполнения бизнес-задач влияют только на store/state, не касаясь отрисовки напрямую

Все мы вместе и каждый сам по себе

В Chorda состояние компонента определяется скоупом (что-то вроде локального store). Компонент видит только свой скоуп и работает только с ним, считая, что вокруг никого нет. Это позволяет спокойно выполнять смешивание, не опасаясь сломать жесткие связи между компонентами

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

Здесь мы подходим к такой штуке, как конвейер обработки (вычисление-патч-отрисовка). Он, как и любое другое значение, попадает к компонентам через скоуп, и его, так же как и любое другое значение, можно настроить локально. К примеру, стратегия базового конвейера дает построение дерева компонентов в ширину с удержанием задач отрисовки до окончания обработки всех патчей. Если для вашего компонента или блока компонентов такое решение не подходит, вы можете подключить к ним свой кастомный конвейер

Неочевидные следствия

А вот некоторые моменты не являлись изначальной целью, но проявились по мере развития фреймворка

Встраивание в существующие проекты

Реализация виртуального DOM не входит в состав Chorda, т.к. разработка еще одного нового отрисовщика не решала моих проблем. Поэтому я собирался использовать какой-нибудь из уже существующих. Для того, чтобы попробовать Chorda в деле, я собрался переписать с нуля пару домашних React-проектов. Но приступив, почти сразу понял, что это совсем не обязательно. Можно постепенно заменять отдельные компоненты, подключив правильный рендерер, и так потихоньку съесть всего слона целиком.

Интересный вопрос: если фреймворк использует React, то можно ли сказать, что приложение, которое использует данный фреймворк, написано на React?

Загружаем и работаем

Сомнительное следствие конечно, но для некоторых может оказаться чрезвычайно важным. Создание компонентов и отрисовка присходят в runtime, без этапа транспиляции. Подключив ядро Chorda и рендерер, можно сразу писать код, который тут же будет исполняться в браузере.

Правда вот, SSR превратился в нетривиальную задачу

Поведенческие компоненты

Тут скорее интересное наблюдение. Раньше я сталкивался только с таким подходом к «глупым» компонентам: есть простой компонент без логики работы, который знает как ему рисоваться, затем поверх него создается «умный» компонент, который включает в себя «глупый», добавляя некоторое поведение.

Так вот в Chorda (из-за того, что можно легко менять порядок смешивания) у меня появился набор компонентов, в которых есть только поведение без правил отрисовки (обычно это набор стандартных реакций). И получилось, что, наоборот, уже к поведению начинает примешиваться способ отображения

Как это может выглядеть:

export default () => {
    // поведенческий компонент Text
    return Text({
        as: Paragraph, // "глупый" компонент Paragraph
        text$: $ => $.user.name
    })
}

Что в итоге?

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

Если фреймворк вас заинтересовал, или у вас есть предложения по его развитию — всегда пожалуйста.

Перевоплощаемся в сказочных персонажей, готовим их любимые блюда и играем в игру «Угадай концовку».

Новогодние каникулы — прекрасное время для того, чтобы отдохнуть в кругу семьи. А еще для того, чтобы прочитать все, что давно откладывалось, напомнить детям, что книга лучше гаджета, показать подросткам, какую пользу и удовольствие приносит литература, а малышей начать учить читать самостоятельно. Как сделать все это и вдобавок отлично повеселиться — рассказывают сотрудники шести московских библиотек.

Family books и книжные фанты

Советует Марина Соломонова, заместитель директора по библиотечно-информационному обслуживанию Центральной городской детской библиотеки имени А.П. Гайдара

Рассказ три дерева читать

— Если не знаете, чем заняться на каникулах, попробуйте организовать у себя дома акцию family books. Для этого каждый член семьи должен выбрать книгу на определенную тему, например про художников. Допустим, мама возьмет биографию Микеланджело Буонаротти, а ребенок — книжку «Мальчик, которого укусил Пикассо» Энтони Пенроуза. Во время чтения и после обсудите произведения, обменяйтесь эмоциями. Мы в библиотеке однажды тоже проводили такую акцию — всем очень понравилось, особенно подросткам.

Еще один интересный вид времяпрепровождения — попробовать рассказать о книге, уложившись в 30 секунд или минуту, не пересказывая сюжет. Потом все голосуют, чей рассказ оказался точнее. Победителю можно вручить приз — что-то вкусное. Еще обязательно попробуйте поиграть в книжные фанты. Они отлично сочиняются даже по энциклопедиям. Очень смешные получаются задания, например про динозавров — изобразить, как они ходят, рычат, летают.

Кроме того, советую почитать по ролям. Если ваш ребенок еще не очень хорошо читает, эта игра ему очень поможет — проверено. Каждый пишет на листочке роль — можно персонажа из книги, а можно из жизни. Внимание: выбирайте персонажей, которых интересно изображать, пусть это будет, допустим, уставший продавец в супермаркете в час пик или самый строгий учитель в школе. Книгу для чтения тоже можно выбрать любую — хоть справочник по математике. Участники вытягивают роли и в течение минуты читают книгу в соответствии с ними.

Если ребенок — фантазер, поиграйте с ним в сочинение сказок по методике Джанни Родари. Его приемами пользуются и многие современные сценаристы. Возьмите любую сказку и постарайтесь придумать, что было с героями дальше, или сказку «наоборот». Что было бы, если бы Красная Шапочка была злой, а волк — добрым? А если бы Белоснежка отправилась не к семи гномам, а к семи великанам?

«Угадай концовку» и чтение вслух

Советует Анна Августиновская, библиотекарь 1-й категории библиотеки № 68

IMG 5445 foto anni avgystinovskoiJPG

— Я предлагаю поиграть в «Угадай концовку», которая очень хорошо развивает фантазию. Сначала все вместе прочитайте рассказ, с которым не знаком ни один из членов семьи, а потом по очереди предлагайте свою концовку. И обязательно назначьте приз — либо за самый необычный финал, либо за финал, наиболее приближенный к авторскому.

Дети, особенно младшеклассники, очень любят читать вместе с родителями. Каникулы — отличный повод устроиться вместе на диване и почитать друг другу какую-нибудь новую интересную книгу. Лично я рекомендую «Я не люблю Новый год» Ирины Зартайской. Это история о девочке, которая терпеть не может новогодние елки и подарки. Но однажды с ней происходит кое-что неожиданное, действительно волшебное.

Капсула времени и настольная игра

Советует Ольга Зайцева, библиотекарь 1-й категории библиотеки № 172

Рассказ три дерева читать

— Дома на каникулах можно устроить книжную вечеринку. Пусть каждый возьмет свою любимую книгу. Потом прочтите любимые отрывки вслух — это невероятно сближает. А еще вы можете записать чтение на диктофон, сделать собственную аудиокнигу, а потом выложить ее на своих страницах в социальных сетях. Кстати, предложите запись и вашей районной библиотеке — уверена, ее сотрудники с радостью опубликуют ваш труд на своих страницах. Мы, например, всегда открыты для такого сотрудничества.

Могу предложить и мистически-фантазийное времяпрепровождение — гадание по книге. Все очень просто: задаете вопрос, открываете книгу на любой странице, вслепую выбираете строчку и зачитываете ее вслух. Совпадения, которые вы можете встретить относительно вашей ситуации, иногда просто поражают. А если вам попалась непонятная абракадабра вместо ответа, попробуйте ее как-то истолковать всей семьей. Поверьте, будет очень весело.

Попробуйте заложить капсулу времени — отправить самим себе письмо в будущее. Что для этого надо? Саму капсулу можно сделать из чего угодно — это может быть любая банка, коробка и даже стаканчик из-под йогурта, главное — ее украсить. Потом запишите на бумаге и положите внутрь обязательства каждого члена семьи — например, прочесть определенное произведение или количество книг. А через год распечатайте капсулу и проверьте, что из задуманного получилось.

Еще можно создать собственную настольную игру по мотивам книги, сделать кубик и фишки, придумать правила, связанные с сюжетом. Сразу могу подсказать идею для игры по мотивам книги Алана Милна «Винни Пух и все-все-все»: если игрок попадает на клетку, где герой падает с дерева, то он пропускает ход.

Домашний театр и письма героям

Советует Наталья Ключникова, заведующая библиотекой № 138

Рассказ три дерева читать

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

Сейчас, когда мы используем достижения техники во всех сферах своей жизни, совсем забыли о письмах, написанных собственной рукой. Я думаю, очень полезно вспомнить эпистолярный жанр и написать письмо сказочному герою. Обязательно красивым почерком — советую посмотреть вместе какое-нибудь обучающее видео по каллиграфии. Для ребенка, особенно младшего школьника, это то, что надо. Каллиграфия развивает мелкую моторику, творческий потенциал, воспитывает усидчивость.

Театр теней и собственный комикс

Советует Ольга Хлыстова, заведующая библиотекой № 266

Рассказ три дерева читать

— Поделюсь одной очень простой игрой, от которой, поверьте, просто невозможно оторваться. Раскройте книгу и начинайте всей семьей соревноваться — кто за три минуты больше всех найдет слогов «ма», «па» или других. Это, кстати, очень полезно — у детей развивается грамотность. На первый взгляд может показаться, что это развлечение для малышей, но не спешите с выводами. Подростки очень легко включаются в игру, готовы так сидеть подолгу.

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

Но самое интересное, на мой взгляд, — это театр теней. Мы в библиотеке часто его устраиваем и всегда советуем в качестве домашнего досуга. В последний раз мы ставили спектакль по сказке Джулии Дональдсон «Груффало». Все очень просто: делаете из подручных материалов ширму (подойдет простыня), вырезаете фигурки персонажей (их можно нарисовать или распечатать). Направляете из-за ширмы лампу — и готово. Остальное вам подскажет фантазия.

Еда литературных героев и книга как снотворное

Советует Надежда Краснова, ведущий библиотекарь библиотеки № 111

Рассказ три дерева читать

— Вы пробовали когда-нибудь готовить то, что едят литературные герои сказок и рассказов? Уверена, что нет. Мой вам совет: обязательно сделайте это. Когда еще этим заниматься, как не на каникулах?

Попробуйте создать литературное меню на неделю. Например, в понедельник вы готовите мясные тефтели, которые так любил Карлсон из книжки Астрид Линдгрен, а на десерт делаете пирожные наследника Тутти из «Трех толстяков» Юрия Олеши. Во вторник можно прочитать «Арбузный переулок» из «Денискиных рассказов» Виктора Драгунского и пообедать молочной лапшой, а в выходные побаловать себя пончиками с малиновым вареньем, которые обожала Мэри Поппинс.

Еще хочу поделиться с вами полезной информацией. Ученые отметили, что книги улучшают сон и снимают напряжение. Всего шесть минут чтения перед сном сработают лучше, чем чашка травяного чая или расслабляющая музыка, поэтому советую вам заменить гаджеты на литературу. А дети обязательно возьмут с вас пример.

  • Рассказ три брата читать
  • Рассказ только не плачь читать полностью бесплатно без регистрации в хорошем качестве
  • Рассказ толстого орел читать
  • Рассказ только не плачь 2 часть
  • Рассказ толстого лгун читать