LINUX.ORG.RU

Helios Javascript framework and libraries


0

0

Доброго времени суток.

Хочу рассказать о проекте, над которым я сейчас работаю. За последние шесть месяцев он стал весьма объёмен, и мне уже сложно управиться одному, поэтому я буду рад, если найдутся люди, которым этот проект также окажется интересным, и которые пожелают присоединиться к разработке. С другой стороны, сейчас уже есть что показать.

Проект называется Helios Javascript framework and libraries (http://gna.org/projects/helios/ хотя страница давно не обновлялась). Первый релиз состоялся 14 февраля сего года.

Фреймворк helios предоставляет способ создания приложений написанных на javascript и запускаемых в броузере. Основная вещь, которую делает ядро helios'а --- это управление модулями и их зависимостями. Модуль --- это отдельный .js файл с кодом, который может быть подключен (included) к некоторому другому модулю. Программист начинает код приложения в модуле main.js, к которому он может подключить другие необходимые модули. Ядро helios'а загрузит все требуемые модули в броузер, распарсит их и проинициализирует в порядке зависимостей. В общем, это вполне обычная функциональнасть доступная на большинстве других платформ и отсутствующая в броузерном javascript. Также есть несколько дополнительных фич, таких как динамическая загрузка и выгрузка модулей.

С точки зрения броузера, есть index.html, который ничего не содержит, кроме включения скрипта с ядром helios'а, которое, в свою очередь, подключает модуль main.js и все его зависимости, и, наконец, запускает код.

Всё это дело работает полностью на клиентской стороне (я однажды видел солюшн, который предоставлял такую же функциональность с загруской модулей, используя ajax и таким образом требуя запущенного сервера, здесь не тот случай). Это также означает, что такое приложение может быть загружено в броузер с удалённого http сервера, как и обычная веб-страница.

Основная идея заключается в том, что появляется возможность создавать "богатые" веб-приложения, и при этом клиентский и серверный код оказываются полностью разделены (забудьте про ужасный javascript внутри html внутри php).

Helios поставляется с некоторыми полезными библиотеками, без которых было бы сложно создать приложение. Низкоуровневые библиотеки определяют такие объекты как Signal (реализация паттерна observer) и Property (который хранит значение, предоставляет геттер и сеттер, а так же Signal, посылаемый при изменении значения). Есть также несколько библиотек более высокого уровня, такие как math (расширяет объект Math некоторыми дополнительными объектами), color (предоставляет функции для манипуляций с цветом), canvas (сейчас содержит функции рисования некоторых примитивов, а в будущем будет также обеспечивать совместимость между различными реализациями в броузерах), и, конечно, уже традиционнная для JS фреймворков ;) библиотека под названием anime, которая предоставляет функции для создания различных типов анимации.

Сейчас я работаю над библиотекой виджетов (которая пока называется heliwidgets). На самом деле, остальные библиотеки, упомянутые выше, расширяются по мере необходимости в какой-то функциональности для heliwidgets, поэтому практически каждый объект из других библиотек используется где-то в heliwidgets. На сегодня в heliwidgets уже реализовано несколько стандартных виджетов, в их числе Frame, Button, Label, Glasscase, Table и Selector. Heliwidgets также включает в себя подержку движков (engines), которые осуществляют рендеринг виджетов. Сейчас есть только один движок, который использует canvas для рисования.

Я написал простой калькулятор с использованием heliwidgets для того, чтобы продемонстрировать, как приложение на helios работает и выглядит (на сегодня, оно правильно работает только под firefox, в опере некоторые виджеты рендерятся криво):

http://absens.org/helios/helioscalc/

Чтоб лучше понять, как устроено приложение для helios, я рекомендую ознакомиться с исходным кодом. Это может заинтересовать программистов. Так как пока нет документации по heliwidgets, я написал код для каклькулятора в виде "codecast" (подробно откомментированный код с объяснением библиотечных вызовов), что должно хорошо продемонстрировать основные возможности helios и его библиотек. Вы можете загрузить исходный код калькулятора (запакованного вместе с helios и библиотеками) отсюда:

http://absens.org/helios/helioscalc.tar.gz

Я бы ещё хотел продемонстрировать одну фичу библиотеки heliwidgets под названием свойства стиля (style properties). Она относится к движку (engine), то есть движок предоставляет некоторый граф (зависимостей) из style properties, а программист может переопределить некоторые свойства для каких-нибудь виджетов. Когда некоторое свойство переопределяется для некоторого виджета, все свойства, от него зависимые вычисляются заново, а все дочерние виджеты наследуют эти изменения. Например, изменяя свойство primaryColor виджета rootWidget на #112233, можно перекрасить приложение так:

http://absens.org/helios/helioscalc_dark/

Исходный код фреймворка и библиотек доступен под GPLv3. Если кому-либо проект покажется интересным, пишите на heliosframework в гмейле.

Сайт absens.org к проекту отношения не имеет, просто нужно было где-то выложить :)

Ответ на: комментарий от theos

Продавать нет, спасибо :) я работаю прогером, пока вроде хватает. На счёт придумывания профита я не запаривался, надо подумать. По идее, целевая аудитория - это такие же программисты, которые мб смогут придумать приложение вместе с профитом к нему. У меня просто есть какие-то идеи, которые я нигде до этого не встречал, я их попытался скомпилить в одном проекте и теперь хочу посмотреть что из этого получится. И, да, мне интересно программировать а не заморачивать себе голову коммерциализацией. Тем более что я с трудом себе представляю коммерциализацию моего проекта, едва ли...

xpostman___
() автор топика
Ответ на: комментарий от xpostman___

>Продавать нет, спасибо :)

Эээ. Вы не так поняли, я не о деньгах =) Я всмысле продавать=подавать. То есть о том, как заинтерисовать других людей.

>На счёт придумывания профита я не запаривался

Ээ. Вы предпочитаете сначала сделать, потом придумать кому это надо?

theos ★★★
()
Ответ на: комментарий от xpostman___

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

А какой он, обычный инклуд? В "С" и php — первое, что приходит в голову, — это инструкция, которая копипастит исходник из указанного файла на место вызова. ))

В helios это неплохо иммитируется. Тут модули, при помощи функции инициализации, срут всем своим нутром в глобальное пространство имен, либо в глобальные объекты, до которых способны дотянуться. Тут я поддерживаю антиглобализм. :)

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

> если нужна всего одна функция из модуля, то да, так удобнее. а если больше

очевидно, так:
// -- some_module.js --

// use assync load
preload('desk.js').ready(function() {
    // build environment
    var desk = require('desk.js');

    // return module instance
    return {
        calc: new desk.Calculator(),
        getTax: function(value) {
          return new desk.Money(value).calulate(this.calc);
        }
    }

}
всего один общий идентификатор "'desk'".

Lucky ★★
()

читал-читал коменты, но так и не понял - чем это лучше GWT(+Ext GWT)?

thevery ★★★★
()
Ответ на: комментарий от theos

> Эээ. Вы не так поняли, я не о деньгах =) Я всмысле продавать=подавать. То есть о том, как заинтерисовать других людей.

Не догнал :)

>>На счёт придумывания профита я не запаривался

>Ээ. Вы предпочитаете сначала сделать, потом придумать кому это надо?

Я немножко по-другому рассуждал. Я старался сделать среду, в которой мне было бы удобно работать, старался исключить все недостатки веб-платформы, которые лично мне мешали. Что-то получилось, теперь чтоб вызвать интерес у публики, оказывается :) нужно ей (публике) объяснять, почему им это мб интересно. В общем-то очевидно, конечно. Я подумаю =)

А вообще, какой может быть профит, например, у какого-нибудь компилятора? По идее, его можно использовать для создания приложений. Более узко, имхо, не сказать. Так и тут.

xpostman___
() автор топика
Ответ на: комментарий от Lucky

> Тут я поддерживаю антиглобализм. :)

В обычном (сишном) инклуде ведь тоже так. Я продолжил аналогию, дабы не усложнять. От проблем спасают неймспейсы и некоторые соглашения об именовании объектов в подключаемом исходнике. Я старался следовать такому соглашению в либах для гелиоса. При таком подходе проблем с засиранием главного неймспейса не должно появиться, по-крайней мере, я не замечал. А что касается проектирования спецификации намеренно таким образом, чтоб "глупому программисту было сложнее засирать корневой неймспейс", это смысла не имеет, на мой взгляд. Как ни спроектируй язык/либу/спецификацию/фреймворк - всегда найдётся способ писать корявый код, и всегда будут на свете гики, которые так и будут поступать (по неграмотности или же преднамеренно).

>> если нужна всего одна функция из модуля, то да, так удобнее. а если больше

>очевидно, так:

>// -- some_module.js --

> (далее кусок кода)

Вот здесь скажу, что я противник "обскурации" кода. Конечно, спецификация позволяет "извратиться" таким образом, чтоб всё работало. А увидев такой код, приходиться несколько секунд повтыкать в него, пока не сообразишь, что же тут происходит. Вот у Вас пример тривиальный, в том смысле, что возвращаемый объект содержит две переменных - другой объект и функцию из одной строки. А если Вы захотите воспользоваться ещё каким-нибудь воркэраундом уже из другой области, тогда читабельность кода будет падать показательным образом. Хотя, конечно, имея дело с таким приёмом постоянно, можно к нему привыкнуть, но если можно поступить проще, то зачем усложнять?

> читал-читал коменты, но так и не понял - чем это лучше GWT(+Ext GWT)?

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

xpostman___
() автор топика
Ответ на: комментарий от Lucky

Небольшой офтопик

>    // return module instance
>    return {
>        calc: new desk.Calculator(),
>        getTax: function(value) {
>          return new desk.Money(value).calulate(this.calc);
>        }
>    }

Если не ошибаюсь, внутри анонимной функции, которая помещается в слот getTask возвращаемого объекта, идентификатор this ссылается на саму функцию, а не попадает в замыкание. Поправьте меня, если это не так, мне даже интересно :) В качестве солюшна можно сделать так (ещё менее читаемо):

var result = {
    calc: new desk.Calculator()
}

var calc = result.calc;
result.getTax = function( value ) {
    return new desk.Money( value ).calculate( calc );
}

return result;


Тогда локальная переменная calc попадёт в замыкание и будет ссылаться как раз на result.calc, и всё должно заработать.

xpostman___
() автор топика
Ответ на: комментарий от xpostman___

>Мой подход отличается в частности от GWT отсутствием трансляции кода из джавы в JS, вместо этого предлагается писать код непосредственно на JS. Лучше это или хуже - оценит сообщество и покажет время.

однако вы забыли сказать, что при этом ещё теряется вышеозвученное "Рефакторинг, валидация, комплишн". Можно, кстати, даже сравнить размер кода на тот же калькулятор в случае GWT+extGWT vs Helios

thevery ★★★★
()
Ответ на: комментарий от thevery

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

однако я так и не получил ответа на мой вопрос, относительно того, каким образом всё упомянутое теряется в гелиосе. с рефакторингом я не вижу проблем. про валидацию я не очень понимаю, что имеется в виду в данном контексте. вопрос комплишна решается генерацией тегфайла, нет?

> Можно, кстати, даже сравнить размер кода на тот же калькулятор в случае GWT+extGWT vs Helios

да, это было бы интересно, это поможет найти кривые места в апи, если они есть. хотя это скорее вопрос не helios vs gwt, а JS vs Java имхо.

xpostman___
() автор топика
Ответ на: комментарий от xpostman___

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

В языке типа джаваскрпит нельзя полностью вывести типы за исключением тривиальных случаев => невозможно всё перечисленное (включая рефакторинг). Твоя библиотека - не тривиальный случай, потому при использовании её и не будет всего перечисленного.

>не helios vs gwt, а JS vs Java

Кстати, ещё лучше не с джава, а с groovy - там всё это можно, но код будет заметно компактнее. (оно позволяет инициализацию в стиле JSON при статической типизации). И если проигрыша почти не будет (а вариант груви думаю даже будет короче) - вариант когда нет всех перечисленных бонусов не имеет профита.

theos ★★★
()
Ответ на: комментарий от theos

> В языке типа джаваскрпит нельзя полностью вывести типы за исключением тривиальных случаев => невозможно всё перечисленное (включая рефакторинг).

То есть, это недостаток языка? Выходит, по-вашему, мне ничего не остаётся, кроме как забить на проект? :)

xpostman___
() автор топика
Ответ на: комментарий от xpostman___

> Выходит, по-вашему, мне ничего не остаётся, кроме как забить на проект? :)

Да, это недостаток любого языка с динамической типизацией.

Нет, я предлагаю путь LOP, и либо писать на MPSе, либо генерить, например, из груви.

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

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

theos ★★★
()
Ответ на: комментарий от xpostman___

>Выходит, по-вашему, мне ничего не остаётся, кроме как забить на проект? :)

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

theos ★★★
()
Ответ на: комментарий от xpostman___

ответили выше: js - динамический язык.

в случае GWT, кстати, ещё и серверсайд-методы вызывать удобнее.

thevery ★★★★
()
Ответ на: комментарий от theos

>Ну, проектов на питоне и раби с тойже проблемой дофига, и люди вроде терпят.

люди вон и на перле пишут, и jruby пилят... ;)

thevery ★★★★
()
Ответ на: комментарий от thevery

>jruby пилят... ;)

Это потому что java как язык слишком бедный. была бы она как Java FX Script | Groove - не нужно было бы =)

theos ★★★
()
Ответ на: комментарий от theos

дык я клоню к тому, что при наличии groovy jruby - ненужен ;)

thevery ★★★★
()
Ответ на: комментарий от theos

Почитал про разные штуки, и, в частности, наткнулся на проект под названием qooxdoo (http://qooxdoo.org/), его для создания клиентской части использует упомянутый Вами Eclipse RAP. Странно, что я его раньше не заметил, поскольку он очень похож на то, чем занимаюсь я :) Отсюда в голову приходит мысль ещё одного профита для гелиоса - точно так же генрить в него код из любимой всеми нафиченной джавы :) хотя, мне эта идея, почему-то не нравится.

Почитал так же про декомпозицию, валидацию и комплишн: понятия мне оказались знакомы, но я особо не пользовался фичами IDE, которые это упрощают. Наверное, из-за того, что я не профессионал, а может, потому что мне более по душе емакс и консоль нежели чем Visual Studio или маковский XCode (с другими IDE пока не имел дела, к сожалению).

Вот я приведу некоторый юзкейс про рефакторинг, поправьте меня плз, если я неправильно понял суть вещей. Например, я меняю интерфейс некоторого класса (для JS - объекта, там нет классов). Умная IDE прямо в исходниках, где этот интерфейс юзается, подсветит мне и скажет, что он изменился, соответственно, вызов мне тоже нужно передлать. Для JS, умная IDE не может делать никаких предположений относительно интерфейса объекта, т.к. он может меняться в рантайме, и вызов может быть и валидный. Но ведь если я меняю что-то в интерфейсе (скажем, метод переименовал), разве я не должен буду и в том и в другом случае пробежать поиском по всем исходникам проекта, найти старый вызов и переправить его? Или в первом случае умная IDE сделает это сама?

xpostman___
() автор топика
Ответ на: комментарий от xpostman___

> найти старый вызов и переправить его? Это будет не так просто - это ещё один минус. мне моя иде сразу показывает где есипользуется метод, поле или ещё что. А у вас кроме лексического поиска ничего не будет. а то что два метода называются одинаково, ещё совсем не значит, что это методы одного класса.

>нежели чем Visual Studio

Visual Studio на фоне IDEA, Eclipse выглядит как Notepad.exe ;) Вы не знаете что даёт качественная ИДЕ если их не видели. После них обоих я (для разработки на С++, Java) смотрю на вим как на <нужно подставить>

theos ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.