Цитата:
Цитата:
{template Widget.prototype.tpl()} hello {this|bind 'name'} {end} Widget.prototype.foo = function () { this.name = 'Вася' // шаблон сам сделает обновление }; Snakeskin.Filters.bind = function () { // Тут для this.что-то создаётся set и get методы }; |
Вставка текста и парсинг его браузером быстрее, чем создание DOM элементов
Да нифига подобного. Предположим что есть таблица из 1000 строк, в модели добавилась только одна строка. Шаблонизатор заточенный под клиент(reactive к примеру) добавит только одну строку, шаблонизатор кобеззы выплюнет 1001. Что касается разовой генерации html то вот замеры скорости. innerHtml разве что в IE предпочтителен. |
Цитата:
Но вообще твой позыв я услышал, я добавлю механизм из коробки, но он будет опциональным. ЗЫ: Ребят, отдельная просьба, если вы юзаете мои разработки, то не молчите, т.к. иначе я веду разработку только с оглядкой на свои требования. Вот например огромное спасибо melky за интеграцию Snakeskin с Express: сейчас она выглядит неуклюже, но мы обсудили пути улучшения и уже совсем скоро этих проблем не будет. |
Цитата:
Цитата:
Цитата:
|
будет зааппенден к остальным
Интересно где ты будешь искать эти остальные :) И как удаление gпары строк будешь отрабатывать? что шаблонизатор выплюнет в этом случае ? |
Цитата:
{template Widget.prototype.tplRow(params)} ... {/} {template Widget.prototype.tpl(list)} <div class="foo"> {forEach list => el} {call this.tplRow(el)} {/} </div> {/} Widget.prototype.appendRow = function (params) { this.find('.foo').append(this.tplRow(params)); } |
Ты же блин в конец просто вставил, об этом речи не идет
Задача звучала примерно так между 13м и14м появило 10 новых элементов, а начиная с 112, 20 элементов исчезли. Неужели не ясно в чем заключается ограничение шаблонизатора :( |
Цитата:
атрибуты, классы, делегирование, т.е. проблемы тут нет, просто другой подход к организации кода. Цитата:
Посмотри тот же нокаут, где все биндинги описываются как дата-атрибуты, а в качестве шаблонки юзается простой jQ template, который тоже плюётся текстом и не про какие биндинги не знает :) Тут уже какой подход больше по душе. |
Цитата:
Цитата:
Но по итогу на reactive решение обговоренной задачи уместится в несколько строчек. {{#superheroes:num}} <tr> <td>{{ num + 1 }}</td> <td><a href='{{info}}'>{{name}}</a></td> </tr> {{/superheroes}} И здесь уже есть все, и удаление строк и добавление в любое место произвольного количества, и любая комбинация из удалений, изменения, и добавлений. А на snakeskin нужен бубен, цикл там есть но он абсолютно бесполезен для поставленной задачи. Собственно я уже забыл о чем спорю и зачем )))) |
Но суть твоей мысли я понял, понашмякать виджетов использующих низкоуровневый шаблонизатор snakeskin а дальше собирать интерфейс из виджетов реализовав биндинг силами виджета. Здесь все нормально я делаю все тоже самое.
При использовании snakeskin все вопросы по быстродействию переносятся с шаблонизатора на разработчика виджета. Последний момент и является камнем приткновения так как я считаю что производительность это забота шаблонизатора (по образцу react и reactive) а не разработчика виджета. |
DjDiablo, всё так, но я создал в голове фоновый процесс о внедрении своего механизма биндинга, посмотрим что выйдет.
UPD: внимательно взвесив все за и против, решил, что в планируемый релиз это не войдёт, но сделаю небольшую заготовку на будущее. |
Чёто я профакапил планируемые сроки, теперь на следующей недели планирую закончить :)
Кстати, уже добавил фичу для локализации: {template foo()} `hello friend`! {end} Тоже самое, что и {template foo()} {i18n('hello friend')}! {end} А если для метода compile задать параметр language, то замена будет сделана на этапе трансляции: {template foo()} `hello friend`! {end} Snakeslin.compile(..., {language: {'hello friend': 'привет друг'}}) |
Цитата:
|
Цитата:
ЗЫ: я решил проблему соответствия файла шаблона с скомпилированным файлом, так что можно будет делать умный кеш :) ЗЫЗЫ: таки будет Snakeskin 4, а не Snakeskin 3.4, т.к. было внесено 2 ломающих изменения: 1) Изменён синтаксис директивы attr Раньше было <div {attr 'class', 'foo bar'} {attr '-bar', 'foo'} Стало <div {attr 'class' => 'foo', 'bar'; '-bar' => 'foo'} Т.е. новый синтаксис позволяет в одной директивы задавать много атрибутов, а также множество значений для одного атрибута, которые будут соединены через пробел. 2) Изменение работы модификатора контекста @ внутри with блока Раньше было {with foo} {a + @bar} /// foo.a + bar {/} Стало {with foo} {@a + bar} /// foo.a + bar {/} Т.е. теперь если у идентификатора нет модификатора контекста, то он считается глобальным, а раньше было наоборот. Это нововведение было сделано, чтобы стал доступен следующий синтаксис: {with foo} {@['a']} /// foo['a'] {@[1 + 'bar']} /// foo[1 + 'bar'] и т.д. {/} |
неплохо! годные изменения.
Холовейчук, как мы знаем, ушел из ноды - фич для Jade от новых мейнтейнеров не дождемся) дьякую некий список вопросов : 1. что делать с переменными, переданными в шаблон (я передавал их как глобальные)? 2. как задать layout для шаблона? 3. что насчёт сахарку для директив ангуляра (тут сам не додумал, но, возможно, как-то писать без префикса "ng" или группировать их)? |
Цитата:
{template foo(@params)} /// @params - это сахарная форма для with params {@foo} /// params.foo {/} Если пользователь решит задать дополнительные параметры для шаблона, то они просто будут передаваться как последующие, т.е. {template foo(@params, some1, some2)} {@foo + some1 + some2} {/} Это на мой взгляд самое лучшее решение проблемы. Цитата:
//#include ./file1.ss //#include ./file2.ss Но есть задумка интегрировать include как директиву, тогда можно будет делать так: {for var i = 0; i < 10; i++} {include './file' + i + '.ss'} {/} Цитата:
|
отлично )
ещё одна деталь как перевести *.ss сразу в *.html, минуя *.ss.js ? есть ли какое-то особое имя у template, которое отличается от остальных тем, что именно оно будет запускаться при переводе *.ss в *.html ? |
Цитата:
Цитата:
ЗЫ: сделал директиву include, теперь можно делать, например, так: {fs = require('fs')} {forEach @fs.readdirSync('...') => el} {include el} {/} {template foo()} ... {/} или тоже самое в новом синтаксисе :) - fs = require('fs') - forEach @fs.readdirSync('...') => el - include el - template foo() ... Директива работает только на этапе трансляции, также есть защита от дублирования файлов, т.е. если много раз написать include одного файла, то подключится он только один раз. Директиву можно юзать только вне тела шаблона. |
Цитата:
а новый синтаксис можно уже юзать? будут ли какие ошибки, если попробовать подсветку Jade на файле Snakeskin ? можно ли делать ss файл без записей template? как бы получится неявное оборачивание в template, который будет переводить в html |
Цитата:
Цитата:
*** Когда буду обновлять доку, то сниму пару роликов про главные фичи, такие как наследование, прототипы и т.д. |
Сейчас подумал, что можно сделать маску для имени шаблона, будет как раз компромисс.
base.ss {template %filename%()} ... {/} profile.ss {include 'base.ss'} {template %fileName%() extends base} ... {/} Т.е. %fileName% будет реплейсится на имя файла. |
Фак, похоже придётся опять на наделю релиз перенести, завтра уезжаю в Мск, иду на свадьбу гулять, наверн дня на 3-4 выпаду :)
|
Цитата:
|
Цитата:
|
Сейчас продумываю такую концепцию, как вызываемые блоки:
{template foo()} {forEach arr => el} {block elem(el)} ... {/} {/} {/} Конструкция с block будет отрендерена как if (!foo.elem) { foo.elem = function (el) { ... }; } foo.elem(el); Т.е. создаётся функция, которая сохраняется как свойство функции-шаблона. Это решает проблему, когда нужно создать подшаблон, который должен иметь доступ к переменным замыкания главного шаблона и быть доступен для повторного вызова "вне шаблона", т.е. из JS, но в тоже время будет являться структурной единицей Snakeskin, т.е. можно явно переопределять в дочернем шаблоне и использовать директиву super. |
Добавил поддержку генераторов.
{template *foo(data)} <div class="bar"> {forEach data => el} {apply row(el)} {yield} {/} </div> {/} Директива yield будет отрендерена как yeild __RESULT__; __RESULT__ = ''; т.е. каждый "тик" (вызов next) будет возвращать кусок отрендеренного шаблона. Зачем я это добавил: у меня в проекте есть места, где данные из БД возвращаются асинхронными чанками из разных сегментов и сейчас мне приходится ждать пока появятся все данные, затем выполнить шаблон (который вернёт огромную строку, и также может надолго залочить поток, т.к. внутри большой цикл) и уже потом отправлять клиенту. С использованием генератора можно очень легко преобразовать шаблон, чтобы он также возвращал чанки по фрагментам данных, которые приходят из БД и сразу же отправлял их клиенту. В данной схеме нету опасности залочить поток и с точки зрения конечной производительности наблюдается реальный профит. Также генераторы позволят легко "дробить" тяжёлый шаблон на куски с помощью setImmediate, чтобы не лочить поток. ЗЫ: напоминаю, что пока, чтобы юзать генераторы в ноде, то нужно запускать её с флагом --harmony. |
Чего то ппц затянулся этот релиз :(
Сегодня заканчиваю активную разработку, завтра финальный review и тесты и начинаю работать над докой. ЗЫ: самое глобальное обновление за всю историю проекта, количество коммитов почти равно общему количеству коммитов всех предыдущих версий :) Собственная кодовая база увеличилась на 3к строк кода (8.2к), а с учётом сторонних либ почти 14к (а ведь первая версия была примерно 400 строк :D), жесть в общем :) Но полученным результатом я очень доволен и наверное даже горжусь, пускай это звучит громко, но Snakeskin 4 будет объективно самым продвинутым "классическим" (т.е. без привязки к определённой технологии или окружению) шаблонным движком из существующих для JS. |
Цитата:
а вот я будто в астрале пребываю) |
Алилуйя, я закончил фазу активной разработки. Теперь приступаю к обновлению доки и выкатываю релиз :)
|
Добавлю сюда тоже, релизная версия видео-мана по настройке вотчеров.
Планирую также снять видео по основам и по наследованию, а остальное будет только в текстовом виде в вики, которая уже пилится :) |
kobezzza,
статья из первого поста не доступна ;( |
Цитата:
Дело в том, что там была статья про версию 1, которая вышла 1.5 года назад и статья была удалена, т.к. сильно устарела. Сейчас идёт работа над документацией к готовящейся версии Snakeskin 4 (которая уже по сути готова и находится в стадии RC), т.е. закончу доку и релизю. *** Решил разбить ман по основам Snakeskin на части: 1) http://www.youtube.com/watch?v=wVt_L...ature=youtu.be 2) http://www.youtube.com/watch?v=tFJVP...ature=youtu.be |
kobezzza,
как я понимаю, Змеешкур изначально был для личных целей, а теперь ты решил не только пустить его в паблик, но и создавать коммьюнити и т.д? |
Цитата:
Когда я закончил работу над версией 1, то я как обычно написал здесь и на хабре и переключился на другие проекты, но время от времени скапливал хотелки и постепенно реализовывал в новых версиях, ну и баги фиксил. К сожалению, у меня нет времени на полноценное продвижение, т.к. я занят своим основным проектом, но с другой стороны я терпеть не могу не доделанные вещи, поэтому всегда довожу начатое до конца, т.е. либа должна не только работать, но и иметь доку с описанием, тесты и т.д. Честно говоря, я думал предложить кому-нибудь с форума помочь мне с продвижением, т.е. писать статьи, улучшать доку, а если было бы желание, то и вносить изменения в код, но сомневаюсь, что кто согласиться, т.к. у всех свои дела и заботы. Но с другой стороны - участие в проектах с кодовой базой 12к+ и количеством коммитов 1к+ может быть хорошим плюсом в портфолио :) |
Цитата:
|
kobezzza,
я бы хотел поучаствовать в развитии такого прожекта, но я прям вообще нуб в JS, особенно если сравнивать с таким яндексовским монстреллой как ты) |
Цитата:
Также, если человек хорошо проявится себя, то сможет получить мою личную рекомендацию, т.е. вы можете в своём резюме при устройстве на работу написать это и если мне позвонит HR / манагер и т.д., то я это подтвержу. Парочка человек, которые помогали мне в своё время так получили хорошую работу с хорошим ЗП :) Цитата:
|
<флейм>
Цитата:
</флейм> |
kobezzza, и между тем, ты ни разу ещё не написал roadway проекта - то, к чему он идёт
|
Цитата:
Хотя конечно, я бы мог писать roadmap при начале работы над новой версией. |
Часовой пояс GMT +3, время: 01:57. |