Это руководство по концепциям / введению предназначено для новых пользователей, которые прочитали таблицу модных слов в Основном файле Readme и хотели бы узнать больше, прежде чем следовать Руководству по началу работы.

Содержание

  1. Настройка рабочего
  2. Нет сборок Javascript (режим разработки)
  3. Нет строковых псевдо XML-шаблонов
  4. Виртуальная модель DOM на основе JSON
  5. Деревья компонентов на основе JSON
  6. Объединение деревьев компонентов и VDOM
  7. Что делать дальше?

Настройка рабочего

По умолчанию фреймворк использует 4 потока:

  1. top (Main): создание рабочих, управление реальной DOM, пересылка событий пользовательского интерфейса в приложение.
  2. Приложение: здесь находится большая часть фреймворка и ваших приложений.
  3. Данные: Ответственный за соединения BE
  4. Vdom: преобразование виртуальной DOM в HTML, а также расчет дельта-обновлений

Лучший способ почувствовать сотрудников - это использовать инструменты разработчика Google Chrome (консоль).

Если вы откроете приложение neo.mjs Docs App (или любое другое приложение neo.mjs), вы получите раскрывающееся меню, в котором вы можете выбрать область консоли:

Область по умолчанию (вверху) покажет (консольные) журналы внутри всех потоков.

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

Подсказка. Введите Neo и нажмите Return внутри представления по умолчанию (вверху). Вы увидите части Neo, которые используются внутри основного потока. Neo.component здесь не будет. Теперь используйте раскрывающийся список и переключитесь в поток приложения. Введите Neo и снова нажмите Return. Теперь вы увидите совершенно другую версию объекта пространства имен Neo. Здесь будет существовать Neo.component, и вы можете напрямую использовать такие методы, как Neo.getComponent (‘myId’).

В чем причина использования нескольких потоков?

Как вы знаете, (почти) все компьютеры и мобильные устройства имеют несколько ядер / процессоров. По умолчанию браузеры будут использовать только один из них. Это означает, что в случае, если внутри вашего пользовательского интерфейса приложения много чего происходит, один процессор может вырасти до 100%, ваши анимации будут тормозить или ваш пользовательский интерфейс может даже зависнуть, в то время как другие процессоры простаивают. Чтобы этого не произошло, вы хотите, чтобы основной поток оставался как можно более свободным.

Процитируем Историю neo.mjs:

Если вы посмотрите страницу веб-работников в Википедии, вы найдете следующую цитату:

«Простейшее использование рабочих процессов - выполнение дорогостоящей вычислительной задачи без прерывания работы пользовательского интерфейса».

На данный момент все остальные веб-фреймворки пользовательского интерфейса все еще борются с производительностью, особенно если вы создаете большие приложения. Выполняется множество скрытых фоновых задач, которые могут замедлить вашу красивую анимацию или даже хуже: однопоточные приложения могут иметь утечки памяти, что приводит к зависанию браузера после их использования в течение некоторого времени (либо одно-единственное ядро, которое используется, работает на 100%. или использование памяти становится слишком большим).

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

Поэтому мы задали себе вопрос:
«Что, если бы фреймворк и все создаваемые вами приложения работали бы в отдельном потоке?»

С этой идеей родился проект neo.mjs.

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

Нет сборок Javascript (режим разработки)

Поначалу это, вероятно, звучит по-настоящему олдскульно (до времен ES6 +):

Вы редактируете исходный файл JS, обновляете страницу и сразу получаете свои изменения. Никакого процесса (ов) сборки, никакой замены горячих модулей или чего-то еще.

Цель разработки: Отсутствие транслируемого кода Javascript, по крайней мере, для режима разработки.

В качестве примера давайте быстро взглянем на галерею в приложении Real World версии 2 (ранняя стадия, в процессе).
Это (начало) исходного кода галереи:

Full component.Gallery Source Code

Теперь давайте посмотрим на исходный код внутри браузера:

Внимательно изучите инструменты разработчика Chrome:

  1. Исходный код 1: 1 такой же
  2. Если вы посмотрите на вкладку левой консоли (Страница), вы снова увидите 4 потока. Код галереи находится внутри потока приложения.

Резюме. У цели дизайна, заключающейся в том, чтобы не переносить код Javascript (по крайней мере, на данный момент в режиме разработки), есть несколько плюсов и минусов. neo.mjs - первая инфраструктура пользовательского интерфейса, использующая JS-модули внутри воркеров, которые только что были включены в Google Chrome v80 +.

Плюсы:

  1. Вы получаете непревзойденный опыт отладки, так как вы можете отлаживать реальный код
    (не нужны исходные карты, нет вмешательства в веб-пакеты и т. Д.)
  2. Браузеры могут кэшировать JS-модули, и нативная упаковка находится в разработке.
  3. Ваша кодовая база является модульной

Минусы:

  1. neo.mjs не использует TypeScript (вы можете сделать это для своего собственного кода приложения, если хотите использовать процесс сборки)
  2. Firefox и Safari пока не поддерживают JS-модули внутри воркеров, поэтому режим разработки работает только в Chrome v80 +. Конечно, версии dist (dev и prod) также отлично работают в FF и Safari.
  3. Некоторые зависимости npm не могут быть легко использованы, поскольку они не используют правильный синтаксис импорта ES6 (например, отсутствующие имена файлов)

Нет строковых псевдо XML-шаблонов

Один пример с React Website:

Все видели такой код на основе шаблонов, и ... он должен исчезнуть!

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

Я думаю об этом как о сравнении XML с API на основе JSON. К настоящему времени JSON почти заменил все API, основанные на XML, и не зря.

Итак, в чем проблема со строковыми шаблонами?

Я мог бы, наверное, написать об этом небольшую книгу, но если говорить кратко:

  1. Не следует смешивать разметку с переменными или даже методами JS.
  2. Вы можете получить проблемы с областью видимости с методами, определенными внутри шаблонов
  3. Вся концепция определения веб-компонентов, которые затем используются в качестве строковой разметки, которая контролирует создание соответствующих экземпляров JS, ужасна (например, для их повторного использования)
  4. Вам необходимо проанализировать эти шаблоны, например при изменении переменной или в случае, если вы хотите сравнить два состояния компонентов, чтобы получить дельта-обновления. Это медленно!
  5. Честно говоря: для тривиальных компонентов это можно сделать во время сборки (например, Svelte). Однако чем сложнее становятся компоненты, тем меньше в этом смысла (слишком много вариантов, представьте neo.mjs Helix в качестве шаблона)
  6. Вы не можете динамически изменять структуры шаблонов, за исключением использования шаблонов Factory / Composition.

Итак, какая альтернатива?

Виртуальная модель DOM на основе JSON

Давайте посмотрим на component.Button:

_vdom: {
    tag: 'button',
    cn : [
        {tag: 'span', cls: ['neo-button-glyph']},
        {tag: 'span', cls: ['neo-button-text']}
    ]
}

Определение HTML-разметки через JSON (если быть точным, вложенные объекты JS и массивы) может выглядеть немного менее компактным, но преимущества очевидны: манипулировать объектами JS с помощью JS максимально просто.

Вам не нужно что-то вроде:
<tpl for="listItems"><subitem></subitem></tpl>, но вы можете использовать настоящий цикл JS for.

Вам не нужно вставлять переменные в фигурные скобки.

Не нужно смешивать код разметки с методами JS.

Чтобы лучше понять идею, давайте рассмотрим более сложный пример:
component.DateSelector

При создании нового компонента вы сначала определите «скелет vdom», чтобы покрыть статические части.

Впоследствии вы можете манипулировать им или улучшать его по своему усмотрению:

Взгляните на Учебное пособие Virtual DOM & Virtual Nodes в приложении neo.mjs Docs App для получения дополнительной информации.

Деревья компонентов на основе JSON

Как и виртуальная модель DOM, деревья компонентов также основаны на JSON.

В качестве примера рассмотрим MainContainer приложения Docs.

Динамически генерировать или изменять эти деревья компонентов с помощью JS очень просто. Контейнеры также предоставляют вам некоторые удобные методы, такие как add (), insert (), remove () и т. Д. Взглянув на раздел API в приложении neo.mjs Docs App, вам поможет.

Объединение деревьев компонентов и VDOM

Поскольку оба дерева определены как JSON, вы можете легко их смешивать.
Пример: RealWorld2 App HomeContainer

Что делать дальше?

  1. Если вам нравятся концепции neo.mjs и вы хотели бы увидеть больше в будущем, мы приветствуем добавление звезды github в этот репозиторий.
  2. Взгляните на Онлайн-примеры (рабочий стол).
  3. Следуйте Руководству по началу работы, чтобы локально запустить фреймворк и примеры.
  4. Проекты с открытым исходным кодом полагаются на вашу помощь, ознакомьтесь с Руководством по участию.
  5. neo.mjs все еще нуждается в спонсорах для ускорения разработки: Страница спонсоров

Вы также можете найти это руководство внутри репо:

Https://github.com/neomjs/neo/blob/dev/.github/CONCEPT.md

Спасибо за чтение и отзывы,
Тобиас