Прочитать рассказ про осень

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
    })
}

Что в итоге?

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

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

Использован учебник «Русский язык» 4 класс, 1 часть, Канакина, Горецкий, упражнение 11 страница 12, вторая половина.

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

Темы для сочинения:

  1. Приметы золотой осени.
  2. Как красива осенняя берёзка!
  3. Осенний карнавал на лесной полянке.
  4. Осень — моё любимое время года.
  5. О чём шептались осенние листья?
  6. Разговор ёжика и зайца.
  7. Забавы осеннего ветра.
  8. Самое интересное событие моих летних каникул.

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

Сочинение-сказка на тему «О чём шептались осенние листья» для 4 класса

Пришла осень. Листья на деревьях забеспокоились. Они вдруг стали жёлтыми, рыжими, багряными. Неожиданные перемены пугали листья. Они не знали, что и подумать.

— Как вы думаете, это с нами надолго? — робко спросил порыжевший листик тополя.

— А что не так? — удивились багряные листья рябины. — Нам очень нравится наш новый цвет!

— А мне как-то не по себе, — признался жёлтый берёзовый лист. — Кажется, что впереди нас ждут большие перемены.

Листья помолчали, провожая взглядом стаю перелётных птиц.

— Вот тоже новость, — сказал тополиный. — Летят они и летят. Куда? Зачем?

— А что не так? — удивились рябиновые. — Может у них дела.

— А мне как-то не по себе, — признался берёзовый. — Летать опасно, куда надежней на ветке.

Тополиный лист проводил взглядом стаю и сказал:

— Вот ещё новость. Вам не кажется, что наши деревья стали к нам равнодушными? Какими-то бессочными.

— А что не так? — засмеялись рябиновые. — Мы и без соков прекрасно выглядим.

— А мне как-то не по себе. — добавил берёзовый. — Кажется, что я усыхаю.

Но тут подул ветерок и прервал разговор осенних листьев. Все они сорвались и куда-то полетели.

Сочинение-сказка на тему «Разговор ёжика и зайчика» для 4 класса

Пришла осень. Встретились в лесу зайчик и ёжик и разговорились.

— Что-ты, ёжик, зачастил яблоки и грибы таскать. Не боишься надорваться? — спросил зайчик.

— Своя ноша не тянет, — рассудительно ответил ёж. — Зато зимой голодать не придётся.

— Что это за зима? — удивился зайчик.

— Э-э, брат, да ты же весенний! — сказал ёж. — Ты ведь ни одной зимы ещё и не видел!.

Зайчику показалось, что ёжик смеётся над ним, и он обиделся.

— Ну и не видел! — сказал он. — То же мне потеря. Не видел и не надо!

— Не видел, а придётся! — внезапно стал суровым ёж. — И скажу тебе, зайчик, зима это такая штука…

Он замолчал, пытаясь придумать объяснение, что же такое зима.

— Какая такая? — насмешливо спросил зайчик.

— Она такая… Холодная! — выпалил ёж. — И снега белого вокруг много. А травы и листвы нет. И кушать почти нечего.

— Не может быть! — не поверил зайчик. — Это как так, снега? На белом же меня видно будет. Любая лиса найдёт!

— Ну, не всё так плохо. — успокоил его ёж.- Скоро твоя шубка тоже белой станет. Она зимой у всех зайцев белеет. И никто тебя на снегу не заметит.

— Ах, страхи какие! — запричитал зайчик. — Побегу-ка я к маме, попрошу, чтобы она зиму отменила.

Зайчик убежал, а ёж посмотрел ему вслед и дальше потащил добытое в саду яблоко.

Сочинение-сказка на тему «Забавы осеннего ветра» для 4 класса

В то тихое ясное утро где-то высоко в горах родился ветерок. Он покрутился вокруг заснеженной вершины, посдувал снежинки со скал и решил спуститься к земле.

Ветерок стремительно бросился вниз и вскоре оказался в прекрасной золотой роще. Он пронёсся по лесным тропам, срывая с деревьев листья и закружил их в воздушном танце. Это так понравилось ветерку, что он стал специально срывать листья, по одиночке и охапками, и разбрасывать их в разные стороны. Листья летели, падали на землю, выкладывали причудливые узоры.

А ветер поднялся чуть выше и стал раскачивать макушки высоких деревьев, сгоняя с них перепуганных ворон.

— Кар! Кар! — кричали вороны. — Берегись! Осенний ветер забавляется!

Так ветерок узнал, что он не простой, а осенний. Это его не обрадовало и не расстроило. Он просто продолжил забавляться.

Ветерок вылетел из леса и спустился к озеру. По поверхности воды пошла рябь. Ветер подул сильнее и на воде вздыбились волны. 

-Ах, как чудесно! — вскричал ветерок. — Как я люблю играть!

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

А беззаботный ветерок играл в лесах, на полях и на озёрах, и ему было хорошо.

Сочинение-рассказ «Самое интересное событие моих летних каникул» для 4 класса

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

Одним из самых интересных событий лета стала поездка на Телецкое озеро, которое находится в живописном месте Алтая.

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

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

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

Зато в такой воде водилось много рыбы и папа почти сразу засел с удочкой на берегу.

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

Оно казалось зелёным бриллиантом из-за отражавшихся в нём деревьев, и было удивительно сказочным. 

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

1

  • Прочитайте шотландскую сказку лучшие друзья навек выберите из слов напечатанных в скобках те которые
  • Прочитайте цитаты из школьных сочинений найдите ошибки и объясните чем они обусловлены когда то
  • Прочитать в продолжении романа как пишется
  • Прочитать живая шляпа рассказ носова
  • Прочитанный как пишется и почему