Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   UIjs Альфа 1 (https://javascript.ru/forum/offtopic/59152-uijs-alfa-1-a.html)

Mаxmaxmаximus 29.10.2015 23:02

UIjs Альфа 1
 
Я тут ребят подумал и решил что до юишка будет рендеровой частью изоморфного фреймворка Mega.js по этому она должна уметь рендерить в строку, а для этого ей нужно работать не с реальным дом а с виртуальным. У меня сейчас ассинхронный датабиндинг, что позволяет рисовать огромные коллекции в миллион элементов ассинхронно не тормозя интерфейс, но если бы у меня был виртуальный дом то я например мог бы отрисовать миллион виртуальных элементов а фреймворк бы это учел и понял что браузер столько не потянет и нарисовал бы допустим только тычячу, и вставил бы 2 распорки сверху и снизу, которым бы задал огромную высоту, а когда человек скроллил бы то виртуал дом подрендеривал бы нужное меняя размеры распорок. в общем эти вещи если делать сейчас руками то это мозг взорвется, даже сейчас у меня рендеринг на промисах и их там около квадрилиона создается и код репитера похож на лапшу, приходится учитывать нарисовался уже элемент или еще нет и.т.п. а хочется просто отрисовать типа миллион виртуальных дом элементов а движок уж пусть там сам думает как это нарисовать, я уже молчу что при такой архитекторе он сможет отрендерить все это В СТРОКУ (а значит можно использовать на сервере nodejs в качестве пререндера что круто для поисковиков)


В общем вот текущая архитектура:




А вот рендер 100к элементов, попробуйте писать в инпат во время рендера, ничего не тормозит


<script src='//uijs.ru/ui.js'></script>
<script src='//uijs.ru/observe.js'></script>

<script>
ui.controller('User', function(){

  function createArr(length){
    var arr = []
    while(length--) arr.push(Math.random());
    return arr
  }

 return {
    arr: createArr(100000),
    change: function(){
        this.arr[2] = 'ЗАМЕНА ' + Math.random()
    },
    add: function(){
        this.arr.unshift( 'ВСТАВКА ' + Math.random() )
    }
 }

})
</script>


<div>{{text}}</div>
<input data-model='text' placeholder='Печатай тут пока оно рендерится'>

<hr>
Можно даже <button on-click='User.change()'>изменить</button> или <button on-click='User.add()'>добавить</button> в массив во время рендера и создастся второй поток рендера, у которого приоритет выше потому что изменений меньше ;)

<ul>
    <li data-repeat='val in User.arr'>{{val}}</li>
</ul>



Минус такой архитектуры в том что мы упираемся в браузер, когда количество физических элементов хододит до 50 тысяч браузер начинает тормозить при их вставке. И мы с этим ничего не можем поделать. Но нет смысла рисовать физически все элементы если можно вставить див распорку например которая бы высоту тупо давала для скроллбаров и.т.п. Я к тому что то что на экране нужно рисовать, а то что за пределами экрана не нужно, и если у нас есть виртуальный дом то мы можем все это контролировать. Вот какую архитектуру я буду делать для воторй альфы:



Чем это отличается от реакта? Ну тем что в реакте у нас датабиндинг ручной, нам руками приходится генерировать шаблоны из виртуальных дом в функции render. А у меня действуют все те же "директивы" ангуляра, которые внутри себя ЗНАЮТ как надо лучше биндинг сделать, например репитер делает аррей обсерв (я временно полифил подключил, потом кусок из него встрою). И он знает какие элементы изменились и удалились и тиолько их он изменит в виртуал дом, и это лучше чем реактовский бредовый render который нам ЗАНОГО создаст весь миллиард элементов, пусть и виртуальных.


А вот мой туду лист до завершения первой альфы:


всякие валидаторы на data-model всякие классы там добавлять
при верных данных не верных данных всякое такое прочее, сделать
удобным для использования в кастомных инпатах и сделать удобным
для наследования

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

если несколько одноименных компонентов конструируются на разных уровнях
одного элемента, то при @require() они перекрывают друг друга,
а должны быть каждый на своем... в общем решить эту неопределенность

суспендить еще и события внутри слипинг скоупов

сделать style-prop поддерживающими вендорные префиксы если они есть

SelectionSaver не работает в opera 12

доработать параметры сервиса http такие как таймаут и контент тайп

mouseenter mouseleave не работает в интернет експлорер)

on-wheel не работает в opera 12 (только on-mousewheel)

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

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

сделать нормальную передачу ассинхронки в промисах,
ибо теряется ассинхронный контекст в функциях переданных в then
и вообще решить делать лиасинхронку в промисах, они ж
горячее место в коде теперь ;)



А вот мой лист на сегодня:

сделать анимации в data-if
сделать анимации в data-repeat
доделать data-repeat
настроить чтобы таймер троттлинга очищался по завершению рендеринга


А еще у меня всякие наследования компонентов, шаблонов и контроллеров, автоматическая очистка мусора, виртуальная файловая система и модульность, даже кофескрипт в {{выражениях}} есть, а так же блекджек и немного шлюх ;)

А о том что БУДЕТ это я уже молчу, там такие нанотехнологии будут что людям и не снились) особенно мне нравится шеред контролелры которые между вкладами работают, и возможност нарисовать триллион значений из базы данных, при том не думая будет оно тормозить или нет) ну это уже в Mega скорее а не в юишке)


п.с. привет матрешка))))))) как там твои сеттеры)?

Decode 30.10.2015 02:33

О_о, возвращение легенды :D

Mаxmaxmаximus 30.10.2015 06:00

Decode, хэх, ну че, крутой у меня фреймворк получается https://github.com/Maxmaxmaximus/ui )?

(Понятно что не круче чем великая функция Class, но все же)

cyber 30.10.2015 10:33

Mаxmaxmаximus, о да, сколько раз ты уже анонсировал свой проект и забивал :lol:

Mаxmaxmаximus 30.10.2015 19:03

cyber, я не забивал, я все время разрабатывал её)

Mаxmaxmаximus 30.10.2015 21:17

Ну что почаны, отключил ассинхронку, щас буду писать виртуальный дом, че думаете, какой api элементам задать, такой же как нативному dom или удобняшнее сделать? типа node.attrs или node.on('click', fucntion(){}) node.copy() ?

Zaveshanie 31.10.2015 01:07

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

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

Иди пиши или лох.

Mаxmaxmаximus 31.10.2015 04:13

Цитата:

Сообщение от Zaveshanie
Иди пиши или лох.

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

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


Mаxmaxmаximus 31.10.2015 04:26

По поводу виртуал дом, кто нибудь когда нибудь делал виртуал дом?

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

И есть второй способ я его только что придумал, есть просто отдно виртуальное дерево, где у каждой ноды есть свойство physical и там либо null либо ссылка на физический обьект, и не нужно ни какой разницы вычислять, если там нет ноды значит нужно её нарисовать, если элемент удаляется из виртуального дерева и в свойстве лежит нода, то и её надо из её родителя надо удалить :thanks:


С другой стороны должна быть гибкость и возможность отрендерить в html строку, но я думаю тут свойство physical не помеха)

Zaveshanie 31.10.2015 13:40

Цитата:

Сообщение от Mаxmaxmаximus
я не прав?

Да, ты не прав. Иди пиши или лох.

Zaveshanie 31.10.2015 13:41

Mаxmaxmаximus,
Ты пилишь свою лажу уже года два и она не вышла в альфу?

Либо доки либо лох.

Zaveshanie 31.10.2015 13:43

И не рисуй от руки свои каракули, воспользуйся каким-нибудь инструментом для рисования схем.

Erolast 31.10.2015 18:20

Цитата:

виртуал дом, кто нибудь когда нибудь делал виртуал дом?
Ребята из React. Их реализация выделена в отдельную библиотеку, я бы предложил попробовать её заюзать: много времени, по идее, сэкономишь.

Mаxmaxmаximus 31.10.2015 22:14

Erolast, так они ж 2 древа делают и сравнивают различия между ними, а когда у тебя миллионы элементов то это ад, а у меня идея с одним деревом, что на счет этого думаешь?

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

и вообще я имею ввиду из вас кто нить делал виртуал дом? может кто советы даст)?

Mаxmaxmаximus 01.11.2015 01:21

О, круто че я придумал, будут виртуальные ноды а для них будет сразу jquery подобная обертка чтобы с коллекциями работать и ноды и сами коллекции будут содержать одни и те же методы и тот же api :dance:

Erolast, понимаешь тепер почему я не использую готовые решения других людей)? В основном потому что это убогое говно ;)

Mаxmaxmаximus 01.11.2015 02:54

черт на практике оказалось что реально 2 дерева куда удобнее)))) в разы просто удобнее в реализации и красивее код

Mаxmaxmаximus 01.11.2015 05:38

нет в итоге оказалось что одно дерево раз в 400 удобнее чем 2) удобнее и сравнения делать и рендерить изменения и наследовать и все такое прочее

Mаxmaxmаximus 01.11.2015 06:54

500 000 вставок клонирований в виртуальный дом




выдают вот такие результаты:



А должно укладываться в 16 миллисекунд минимум. 500 000 к элементов это мой следующий рубеж после сотни. И знаете что это означает? ДА ДА ЭТО означает что виртуал дом будет написан на ASM js, вот и повод новую технологию выучить ;)

Erolast 01.11.2015 07:56

Цитата:

Erolast, так они ж 2 древа делают и сравнивают различия между ними, а когда у тебя миллионы элементов то это ад, а у меня идея с одним деревом, что на счет этого думаешь?
Хз, не занимался таким, просто ссылку подкинул.

А зачем тебе такая большая производительность-то?) Не запаришься это дело реализовывать?

Mаxmaxmаximus 01.11.2015 16:08

Цитата:

Сообщение от Erolast
А зачем тебе такая большая производительность-то?)

Ну потому что на промисах если я рендерю массив в 500 000 элементов то он рендерится по кусочкам и это не тормозит, но код такой писать очень неудобно, а мне хотелось бы мгновенно создать 500 000 виртуал дом элементов, и чтобы они там сами себе тихо отрендеривались, если этот процесс занимает больше чем кадр (16мс) то дело не годится. Я думаю сделать какое то api чтобы дать возможность писать компоненты на asm (я правда не знаю требуется ли для этого особое api), тогда я напишу на с++ горячие компоненты типа репитера и виртуал дом, ну и рендера и промисов.

Mаxmaxmаximus 02.11.2015 01:23

о прикольно тут прям с дом можно работать http://kripken.github.io/emscripten-...5.h.html#mouse ) походу пасоны придется переписывать юишку на плюсах)) было бы неплохо. ведь тогда когда я начну делать фреймворк Mega где юишка будет просто движком для рендера, можно будет скомпилировать нативный модуль для nodejs из плюсов и будет работать молниеносно.

Я вижу в этом единственный минус, оверхед в размере библиотеки (там примерно +400кб сверху идет всяких эмуляторов но наверное это можно отключить все) и второй минус это все таки сложность поддержки, мало людей знают С++ (да я и сам часа 4 назад не знал лол)

Mаxmaxmаximus 02.11.2015 01:34

А нет, в режиме дикой оптимизации он файлик мелкий генерирует, 150 кб оверхеда который сжимается винраром до 40кб

Mаxmaxmаximus 02.11.2015 02:02

Нуу, вот эт по мне)





я вообще задержки не вижу, нажимаю f5 и мгновенно выводится привет мир)

Mаxmaxmаximus 02.11.2015 02:16

Во нашел, двустороннее связование!!!

Вот так и буду псиать классы виртуал дом на плюсах, а для юишки придумаю красивое api http://kripken.github.io/emscripten-...nd.html#embind

Mаxmaxmаximus 02.11.2015 05:43

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

Учитывая какое в С++ мощное наследование а я его активно использую в юишке, то это будет мега эпик.



С другой стороны у меня в юишке УЖЕ была виртуальная файловая система, ну если точнее то просто эмуляция нодовского require и там можно было подключать "нутро" юишки, например класс EventEmitter и наследоваться от него, тут же подобное провернуть не получится, теперь нутро будет прочно закрыто от пользователей. Получается что мне придется писать ядро на плюсах а пользовательскую библиотеку на яваскрипте, но некоторые куски пользовательской библиотеки используются в ядре например промисы или EventEmitter, и они должны быть быстрые как и само ядро, но так же должны быть и доступны пользователям для наследования. И тут встает делема. На чем их псиать? На плюсах или на яваскрипте?

Mаxmaxmаximus 09.11.2015 09:31

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

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

Mаxmaxmаximus 22.11.2015 11:47

лол текстовый файл с багами все пополняется и пополняется


needReplace off создает изолированный скоуп, но иногда это не нужно

движок IE и EDGE при парсинге функций не выдает ошибку если функцция
имеет некорректное присваивание типа (ава) = val, так что надо подобное
руками отслеживать и ставить выражениям setter = null

удалять EveentEmitter обрабоичики после разрушения Async scope

не работает ui-transclude и data-if на одной ноде
внутри темплейтов компонентов

багует data-if, не всегда воссаздает элементы если в выражении
цепочка prop.prop.prop

в выражениях нельзя сделать (exp).func() точка не имеет основания,
а должна

всякие валидаторы на data-model всякие классы там добавлять
при верных данных не верных данных всякое такое прочее, сделать
удобным для использования в кастомных инпатах и сделать удобным
для наследования

репитер бывает если принимает тот такой же по структуре массив,
но другой факически обьект, то calсSplices при вычислении
говорит что весь массив надо перерисовать.

доделать получение exp paths сервисе parse для stringExp

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

если несколько одноименных компонентов конструируются на разных уровнях
одного элемента, то при @require() они перекрывают друг друга,
а должны быть каждый на своем... в общем решить эту неопределенность

сделать style-prop поддерживающими вендорные префиксы если они есть

SelectionSaver не работает в opera 12

доработать параметры сервиса http такие как таймаут и контент тайп

mouseenter mouseleave не работает в интернет експлорер)

on-wheel не работает в opera 12 (только on-mousewheel)

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

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

сделать нормальную передачу ассинхронки в промисах,
ибо теряется ассинхронный контекст в функциях переданных в then
и вообще решить делать лиасинхронку в промисах, они ж
горячее место в коде теперь ;)


Часовой пояс GMT +3, время: 03:28.