Первая средняя статья. Второй день обучения горит…

Быстрый фон:

Я родом из C/Go. Бэкэнд. Самые мрачные области оптимизации ЦП, настраиваемые двоичные форматы, встраивание нейронных сетей в серверы и прочее дерьмо.

Я всегда хотел изучить javascript. Шутки в сторону. У меня есть. Но затем я выполняю обещания и обещаю себе никогда больше не пытаться изучать JS. Итак, круг Дхармы повторяется. Мы здесь.

Почему Лит?

Раньше зажигал, был Полимер. Polymer был веб-платформой Google для использования веб-компонентов. Веб-компоненты представляют собой аккуратно связанные фрагменты кода, которые позволяют вызывающей стороне ссылаться на компонент, как на любой другой стандартный тег HTML. Веб-компоненты имеют собственный стиль, логику и свойства, что позволяет соединять компоненты по модульному принципу. За исключением того, что в то время веб-компоненты не полностью поддерживались в нескольких браузерах. В то же время полифиллы максимально точно имитируют недостающие возможности браузера. Polymer создал фреймворк для создания хорошо связанных компонентов и полифиллов для поддержки браузеров.

Но

Полимер был не совсем простым. Кроме того, в это время появился React, и было не так уж важно использовать полифиллы для будущего веб-стандарта, который еще не был принят.

Перенесемся вперед по трем основным версиям Polymer и некоторым значительным обновлениям браузера.

(2019–02–05) Лит родился.

lit-html — это крошечная (чуть более 3 КБ в комплекте, минимизированная и сжатая gzip) и быстрая библиотека JavaScript для шаблонов HTML. lit-html хорошо работает с подходами функционального программирования, позволяя вам декларативно выразить пользовательский интерфейс вашего приложения в зависимости от его состояния.

Эффективно. lit-html работает молниеносно. Когда данные изменяются, lit-html не нужно выполнять какие-либо изменения; вместо этого он запоминает, где вы вставляли выражения в свой шаблон, и обновляет только эти динамические части.

Выразительный. lit-html предоставляет вам всю мощь JavaScript, декларативного пользовательского интерфейса и шаблонов функционального программирования. Выражения в шаблоне lit-html — это просто JavaScript, поэтому вам не нужно изучать специальный синтаксис, и в вашем распоряжении вся выразительность языка. lit-html изначально поддерживает множество типов значений: строки, узлы DOM, массивы и многое другое. Шаблоны сами по себе являются значениями, которые можно вычислять, передавать в функции и из них, а также вкладывать друг в друга.

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

- https://www.polymer-project.org/blog/2019-02-05-lit-element-and-lit-html-release

LitElement использует lit-html для рендеринга компонентов и добавляет API для объявления реактивных свойств и атрибутов. Элементы обновляются автоматически при изменении их свойств. И они обновляются быстро, без различий.

- https://www.polymer-project.org/blog/2019-02-05-lit-element-and-lit-html-release

Хорошо, разве это не звучит сексуально? Ну я укусил. Я решил, что освещено хорошо.

1 день:

Хорошо, я не писал статью для этого, но в основном долго боролся с NPM. Также узнал об этом приятном инструменте под названием:

@open-wc


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

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

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

День 2

Я интересуюсь криптой уже около 3-4 лет. У меня есть MetaMask в моем браузере, и мне просто интересно, насколько сложно будет сделать компонент, который подключается к сети Ethereum.

npm init @open-wc

Я начал с самого простого шаблона веб-компонента.

open-wc создает все это дерьмо, но все, что нас сейчас волнует, это DayTwo.js.

Первым делом я добавил в рендер элементы mwc-formfield/mwc-checkbox. Внутри ${} я выполняю некоторый код JS. Синтаксис ${} освещен html.

После запуска «npm run start» я вижу что-то похожее на это (я установил свой флажок).

import { html, css, LitElement } from 'lit-element';
import '@material/mwc-button'
import '@material/mwc-checkbox'
import '@material/mwc-formfield'

Кстати, импортировать материальные веб-компоненты очень просто, просто установите их с помощью npm и импортируйте :)

Следующее, что я сделал, это создал простую mwc-кнопку.

<mwc-button raised ?disabled=${!this.ethereumSupport} @click=${this.__enableEthereum}>Enable Ethereum</mwc-button>

Еще раз я стилизовал его. Чтобы стилизовать компоненты материала, я просто добавил пользовательские свойства mdc CSS. Документы здесь: (https://www.npmjs.com/package/@material/mwc-checkbox)

Ладно, милая. Теперь у меня есть эта сексуальная зеленая пуговица.

Но что, если я нажму на нее?

Для кнопки был зарегистрирован обработчик кликов, который вызывает this.__enableEthereum. Я думаю, это какой-то синтаксис LitElement.

@click=${this.__enableEthereum}

Сначала я заложил всю логику включения эфириума в этот метод. Но

await ethereum.enable():

должен работать в асинхронной функции, а обработчик кликов не может быть асинхронным (я понятия не имею, почему, если вы знаете, скажите мне, пожалуйста!)

В этих методах мы устанавливаем свойства (this.account или this.networkID). Свойства в основном хранят данные, которые автоматически повторно отображают часть веб-страницы при изменении данных.

Свойства типизируются и инициализируются в конструкторе.

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

Ладно, на этом я закончил. Я доволен тем, что построил. Но я решил пойти немного дальше, потому что узнал, что MetaMask будет переключаться на события для отлова изменений (смена аккаунтов, сетей, цепочек и т.д.). Я понятия не имел, как обрабатывать события в LitElement, но, видимо, вы можете зарегистрировать свои события в конструкторе или в методах firstUpdated. Это сработало для меня:

Теперь я мог реагировать на изменения, происходящие в MetaMask.

И последнее замечание: ethereum.autoRefreshOnNetworkChange испортил мои обновления свойств. Отключение этого (в будущем оно будет отключено по умолчанию) все исправило.

Увидимся завтра за графиками…

твиттер: https://twitter.com/sbsends