Двухпоточный интерфейсный фреймворк: Voe.js

внешний фреймворк
Двухпоточный интерфейсный фреймворк: Voe.js

halo, всем привет, меня зовут 132, всем уже давно не дешево!

В последнее время я был очень занят в классе, и у меня очень мало времени для написания кода::>_<:: voe>

Взглянув на API, на первый взгляд кажется, что API похоже на фард, как будто еще один кросс-энд фреймворк апплета написан?

Но нет...

voe — это низкоуровневая структура апплета.

Это означает, что он реализует двойной поток апплета, использует «песочницу» для изоляции веб-среды и защищает возможности dom.

Далее мы представим основные идеи в сочетании с апплетом WeChat:

Цель

Абсолютный контроль означает, что пользователь не может управлять домом, не может использовать веб-API, не может использовать полный jsx и html, не может... Во всяком случае, ничего!

Точно так же, как роль sm, s имеет абсолютный контроль и злоупотребление m, а m может только подчиняться приказам и злоупотреблять

Поэтому я называю двухпотоковую архитектуру апплета, также известную как[Архитектура ведущий-ведомый]

песочница

dom нельзя манипулировать в апплете не потому, что он блокирует dom API или блокирует событие, это нецелесообразно делать

Все ищут недомовую среду как песочницу, типа v8, типа worker, типа нативную, типа wasm

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

voe использует web worker в качестве песочницы

Почему бы не использовать v8 или родной?

Это сугубо личный выбор, не выбирать v8 или натив следует, но лично я предпочитаю первое, вычислительная мощность веб-воркеров лучше, чем v8 или натив по умолчанию (тот же аппаратный уровень), но у v8 тоже есть преимущества, например, узел может использовать файлы cookie, а затем имеет расширенный API

Разделить кадр на два разных потока

Суть в том, как организовать работу фреймворка в два потока?

Есть несколько принципов:

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

Итак, получается вот так:

Затем возникает трудность, пропасть между песочницей и основным потоком возникает из-за элемента dom и функции события, которые нельзя передать

Я ломал голову и нашел полное решение

Сохраните то, что нельзя передать в свой поток, и постройте карту, передайте индекс в другой поток.

Например, события доставляются так:

let handlers = new WeakSet()
  if (props) {
    for (const k in props) {
      if (k[0] === 'o' && k[1] === 'n') {
        let e = props[k]
        let id = handlers.size + 1
        handlers.set({ id: e })
        props[k] = id      
      }
    }
  }

Сохраните событие в карте, а затем передайте идентификатор в основной поток.Когда событие основного потока срабатывает, возвращайте параметры идентификатора и события рабочему потоку.

for (const k in props) {
    if (k[0] === 'o' && k[1] === 'n') {
      let id = props[k]
      props[k] = event => {
        // 不能传太多,此处省略对事件的简化操作
        worker.postMessage({
          type: EVENT,
          event,
          id
        })
      }
    }
}

Затем в воркере по индексной карте находим соответствующее событие и запускаем его

Да, верно, этот метод всемогущ, как и наш метод diff

Поскольку diff не может передать dom, мы передаем индекс dom

if (oldVNode ==null||oldVNode.type!==newVNode.type) {    
  parent.insertBefore(createNode(newVNode), node)
}

Например, в этом методе и родитель, и узел являются элементами dom, которые нельзя передать, мы просто передаем их индекс, может быть так:

[ [0,'insertBefore',1] ]

дом такой:

<div id="root" index="0">
  <ul index="1">
    <li index="2" />
    <li index="3" />
  </ul>
</div>

Если мы хотим удалить узел с индексом 3 в это время, соответствующая сгенерированная структура должна быть такой:

[ [1,'removeChild',3] ]

Sting не впечатляет, мы успешно нашли идею, которая может реализовать разные алгоритмы diff.

Знаешь, апплет WeChat не нашел похожей идеи, у них diff это еще древний deep traversal virtual-dom, а производительность кода оставляет желать лучшего...

Точно так же мы можем передать параметры функции основного потока основному потоку в рабочем потоке.

Например, если мы имитируем метод предупреждения, мы можем сделать это:

function alert(text){
  postMessage({
    name:'alert',
    text
  })
}

Затем основной поток получает параметры и выполняет

worker.onmessage = {data} => window[data.name](data.text)

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

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

vue 3

Давайте кратко поговорим здесь о vue 3. Ну, как видите, имя и API voe похожи на vue 3. На самом деле, я скопировал ядро ​​vue 3, включая сбор зависимостей, отзывчивость, обновление состояния, комбинированную функцию. …

Это всего лишь вопрос удобства.На самом деле, по сравнению с основной идеей ​voe, API ничто.

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

Поэтому я думаю, что API vue 3 достаточно прост, чтобы ослабить API.

Просто скопировал...

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

Двойной поток против асинхронного рендеринга

Не по теме, вы все должны знать фреймворк fre.js, который я написал ранее, и вы также должны иметь некоторое представление о механизмах асинхронного рендеринга, таких как параллельный (разрез времени) и приостановка.

Теперь я здесь, чтобы снова заняться веб-воркерами, потому что их идеи похожи, а сценарии одинаковы.

  1. Разбивка по времени заключается в использовании задач макросов для помещения задач с низким приоритетом, таких как diff, в очередь задач макросов, что имитирует двойные потоки и не блокирует пользовательский интерфейс.
  2. Двойная многопоточность — это использование веб-воркеров для выполнения задач высокой вычислительной мощности, таких как diff, в воркеры, чтобы не блокировать рендеринг пользовательского интерфейса основного потока.

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

Жаль, что спрос на такого рода сцену слишком мал, поэтому команды preact и vue высказались, мол, не хотят и не надо это делать ::>_<::>

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

Суммировать

Уф~ Наконец-то я закончил писать, я пишу в Наггетс, это должно быть долго

Наконец, поместите github voe:

github.com/132yse/voe

Добро пожаловать, чтобы подписаться и звездить!

Кроме того, была создана фронт-группа для обмена различными новыми идеями: 813783512