Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Snakeskin (https://javascript.ru/forum/project/35057-snakeskin.html)

kobezzza 08.11.2014 18:26

Safort, если не сложно, можешь составить список вопросов, которые возникали у тебя по мере обучения SS, нужно для FAQ

Safort 08.11.2014 18:28

kobezzza,
могу. Хотя большинство из них возникало из-за невнимательного чтения документации)
К какому времени это нужно?

kobezzza 08.11.2014 18:32

Цитата:

Сообщение от Safort (Сообщение 339829)
kobezzza,
могу. Хотя большинство из них возникало из-за невнимательного чтения документации)
К какому времени это нужно?

Ну как сделаешь, так сделаешь, не к спеху:) Я в течении след недели добавлю вопрос-ответы, которые по моему мнению могу вызывать трудности, но моё "имхо" не объективно, наверное.

Safort 08.11.2014 18:44

kobezzza,
Цитата:

Я в течении след недели добавлю вопрос-ответы
Ок, тогда я к этому времени свои сделаю. Может быть раньше.

Цитата:

но моё "имхо" не объективно, наверное.
Конечно нет, ведь ты же автор)

kobezzza 08.11.2014 21:32

Та-да!

Выпустил релиз SS 6.3.0 - https://github.com/kobezzza/Snakeskin/releases

Safort 08.11.2014 23:04

kobezzza,
Цитата:

Скорее всего завтра, не хочу торопиться
Цитата:

Выпустил релиз SS 6.3.0
Хорошо, что не поторопился)

kobezzza 08.11.2014 23:05

Цитата:

Хорошо, что не поторопился)
Невтерпёж было :D

Safort 08.11.2014 23:23

Как я понимаю, при использовании новой версии параметр https://github.com/kobezzza/Snakeski...ompile#exports вообще не нужен?

Обновился. Убрал параметр exports, в роде бы всё норм. Прям годнота)

kobezzza 08.11.2014 23:24

Цитата:

Сообщение от Safort (Сообщение 339896)
Как я понимаю, при использовании новой версии параметр https://github.com/kobezzza/Snakeski...ompile#exports вообще не нужен?

Да, но я его оставил на будующее, вдруг понадобится сделать что-то вроде:

exports = amd или es6-module

***

Блин вот знал, что так будет...карочe, 6.3.1 :-/

Safort 08.11.2014 23:49

kobezzza,
Цитата:

Блин вот знал, что так будет...карочe, 6.3.1
Агррр, как чувствовал!
"Поспешишь - людей насмешишь", особенно когда ночью пишешь)

Я тут пересматриваю свои вопросы и код на форуме по поводу SS. Большинство из них просто потеряли актуальность с выходом последних версий)

kobezzza 08.11.2014 23:54

Цитата:

"Поспешишь - людей насмешишь", особенно когда ночью пишешь)
Это точно :)

kobezzza 09.11.2014 16:49

Выпустил патч 6.3.2

Safort 09.11.2014 18:17

Вложений: 1
kobezzza,
а когда будет патч на патч?

kobezzza 09.11.2014 18:21

Цитата:

kobezzza,
а когда будет патч на патч?
Бывало уже :D

Safort 09.11.2014 21:29

kobezzza,
читаю я себе сейчас доку и вижу новое ишью)
Значит, готовится патч на патч? :)

kobezzza 09.11.2014 22:27

Цитата:

Сообщение от Safort (Сообщение 340065)
kobezzza,
читаю я себе сейчас доку и вижу новое ишью)
Значит, готовится патч на патч? :)

Там какие то мутные баги, сейчас нет времени на них, в конце недели займусь :)

Safort 10.11.2014 20:17

Как я и говорил, многие вопросы/проблемы/неочевидности у меня пропали после выхода последних версий SS. Но немного удалось составить для FAQ'а:

1. как подключить не скомпилированный шаблон на страницу (в формате *.ss)?

2. Можно ли объявлять прототип внутри другого прототипа?
//ответ уже нашёл, но тем не менее)

3. Как вызвать прототип в месте объявления без параметров?
Такого я не нашёл в доке, мб просто проглядел. В результате экспериментов пришёл к такому решению:
{proto my_pro() =>}
//содержание
{/proto}

В роде бы работает, но может есть вариант по лучше?

4. В каких случаях лучше использовать Блоки, а в каких Прототипы?
//желательно с примерами

5. Можно ли вызвать шаблон внутри шаблона?



И два вопроса не для FAQ'а
1.
По этой ссылке:
https://github.com/kobezzza/Snakeski...86%D0%B8%D1%8F

Цитата:

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

2.
Как/можно_ли объявить независимый прототип/блок, который можно использовать в любом шаблоне?

Т.е. что-то типа этого:
{block blockName(arg)}
  Вывод из независимого блока
  {arg}
{block}


{template a()}
  {call blockName('аргумент')}
{/template}

{template b()}
  {call blockName('другой аргумент')}
{/template}

kobezzza 10.11.2014 21:49

Цитата:

1. как подключить не скомпилированный шаблон на страницу (в формате *.ss)?
https://github.com/kobezzza/Snakeski...B5%D1%80%D0%B5

Цитата:

{proto my_pro() =>}
//содержание
{/proto}
Да, мне казалось это очевидно, спс за наводку :)

Цитата:

Можно ли вызвать шаблон внутри шаблона?
Конечно, ты же можешь вызывать любую функцию в шаблоне, а шаблон - это функция, есть даже сахарок для этой задачи: https://github.com/kobezzza/Snakeskin/wiki/call

Цитата:

4. В каких случаях лучше использовать Блоки, а в каких Прототипы?
Тут нужно пояснить: с прототипами всё ясно, но какие блоки ты имешь ввиду: статичные или вызываемые?

Отвечу пока кратко тут: прототипы и вызываемые блоки - это методы шаблона, только прототипы приватные, а блоки - публичные, также у них есть некоторые принципиально архитектурные отличия: прототип обрабатывается на этапе трансляции, блок в рантайме, следовательно: прототип увеличивает время трансляции и размер конечного файла, но выполняется супер быстро (+ оптимизация хвостовой рекурсии), но менее гибкий чем блок, а блок быстрее транслируется и занимает меньше места в конечном файле и более гибкий, но работает медленне и нет оптимизации рекурсии, главное, что нужно знать, что их можно использовать друг с другом, т.е. блок вкладывать в протип и наоборот и получать достоинства обеих реализаций.

Цитата:

Как/можно_ли объявить независимый прототип/блок, который можно использовать в любом шаблоне?
Формально такое сделать нельзя, если ты хочешь заюзать блок или прототип шаблона А в шаблоне Б, то нужно шаблон Б отнаследовать от А и все его методы (а прототипы и блоки фактически таковыми являются) отнаследуются с ним, но то, что хочешь сделать ты делается очень просто: просто общий функционал, который нужен во всех независимых шаблонах выносится в отдельные шаблоны и всё:

/// Независимый блок - это шаблон
{template blockName(arg)}
  {arg}
{/template }

{template a()}
  {call blockName('аргумент')}
{/template}

{template b()}
  {call blockName('другой аргумент')}
{/template}


Вариант наследования более гибкий, т.к. в дочернем шаблоне тот или иной блок или прототип можно переопределить или доопределить с помощью директивы super.

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

- proto base->logo()
   ...

- proto base->icon()
   ... 

- placeholder base()

...

- template button() extends base
   - apply logo()


В моём проекте 3-и уровня супершаблонов, это позволят добится максимального code-reuse и очень просто поддерживать. Вообще ОО-подход - это главная фича SS и сделана лучше всего, поэтому не нужно боятся создавать уровни наследования, т.к. сама либа это пропагандирует.

***

Спасибо за вопросы, распишу ответы в FAQ, приступлю скорее всего с пятницы, т.к. сейчас завал по другим делам.

kobezzza 10.11.2014 22:06

В SS 6.4 появятся анонимные самовызываемые прототипы
https://github.com/kobezzza/Snakeskin/issues/13

Safort 10.11.2014 22:59

kobezzza,
Не-не, это я знаю. Я говорю про подключение шаблона из отдельного файла. Например так:
<script type="text/x-snakeskin-template" id="templates" src="tmp.ss"></script>

Цитата:

Конечно, ты же можешь вызывать любую функцию в шаблоне, а шаблон - это функция, есть даже сахарок для этой задачи: https://github.com/kobezzza/Snakeskin/wiki/call
<script type="text/x-snakeskin-template" id="templates">
    {template blockName(arg)}
      {arg}
    {/template }
     
    {template a()}
      {call blockName('аргумент')}
    {/template}
     
    {template b()}
      {call blockName('другой аргумент')}
    {/template}
  </script>

  <script>
    var tpls = {};
    Snakeskin.compile(document.querySelector('#templates'), { context: tpls });

    var out  = document.querySelector('.messages');
    var name = 'Имя';
    var mess = 'Текст сообщения';

    out.innerHTML = tpls.a({name, mess}) + out.innerHTML;
  </script>


Чот так не получается(
Цитата:

ReferenceError: blockName is not defined
Использую v6.3.0.


Спасибо за пояснение по другим моментам)

kobezzza 10.11.2014 23:34

Не получается, потому что у тебя же нода, а там шаблоны ставятся как свойства объекта exports или заданного context, т.е. нужно явно указывать, но в SS есть предопределенная переменная self, которая ссылается либо на exports, либо на глобальный объект браузера, т.е. нужно написать

{call self.blockName('аргумент')}


При использовании в браузере это можно опустить, но тогда шаблон станет не переносимым.

Цитата:

<script type="text/x-snakeskin-template" id="templates" src="tmp.ss"></script>
Сходить аяксом за текстом и скопилить его :) Пока такой фичи из коробки нет, но добавить кажется, что не сложно, нужно?

Кстати подумал, что надо бы добавить автоинициализацию text/x-snakeskin-template шаблонов.

Цитата:

Использую v6.3.0.
сделай npm up уже :)

Safort 11.11.2014 00:32

kobezzza,
Цитата:

Не получается, потому что у тебя же нода
А вот и нет. Тестирую именно в браузере.

Цитата:

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

Цитата:

Кстати подумал, что надо бы добавить автоинициализацию text/x-snakeskin-template шаблонов.
Но оно же может тормозить если шаблонов будет очень много, не?

Цитата:

сделай npm up уже
Сделал. Просто релизы слишком частые)

kobezzza 11.11.2014 00:39

Цитата:

А вот и нет. Тестирую именно в браузере.
Угу, не внимательно прочитал пост с твоим примером, но там ты явно задаешь контекст ({context: }), а для браузера это не обязательно, но раз задаешь, то тогда обязательно нужно использовать self.

Цитата:

Нужно, но не сильно. Это просто упрощает быстрое тестирование новых фич на коленке.
http://jsfiddle.net/kobezzza/NAPWB/10/

Цитата:

Но оно же может тормозить если шаблонов будет очень много, не?
Ну можно сделать параметр, чтобы отключить эту фичу, а тот кто компилит на клиенте много шаблонов - сам дурак :)

Цитата:

Сделал. Просто релизы слишком частые)
У меня скрипт написан, который раз в определенное время делает сам апдейты и я не парюсь :)

Safort 11.11.2014 00:55

kobezzza,
Цитата:

Угу, не внимательно прочитал пост с твоим примером, но там ты явно задаешь контекст ({context: }), а для браузера это не обязательно, но раз задаешь, то тогда обязательно нужно использовать self.
Чот я уже под ночь плохо соображаю. В общем, чтобы код был везде одинаковым, мне просто нужно убрать задание контекста и всё?)

На локалке удобнее)

Цитата:

Ну можно сделать параметр, чтобы отключить эту фичу, а тот кто компилит на клиенте много шаблонов - сам дурак
Согласен)


Цитата:

У меня скрипт написан, который раз в определенное время делает сам апдейты и я не парюсь
И на продакшене тоже? :D

kobezzza 11.11.2014 10:59

Цитата:

Чот я уже под ночь плохо соображаю. В общем, чтобы код был везде одинаковым, мне просто нужно убрать задание контекста и всё?)
Чтобы везде разбола нужно явно указывать контекст при вызове шаблона:

{call self.blockName()}


Но ты подкинул мне идею, постараюсь упростить этот механизм в SS 6.4

https://github.com/kobezzza/Snakeskin/issues/14

Цитата:

И на продакшене тоже?
Да, semver же, разумеется это касается только патчей :)

Safort 16.11.2014 23:54

Что-то тема затихла.. АП.

kobezzza 18.11.2014 14:29

Приступил к разработке SS 6.4, релиз будет в конце недели.

kobezzza 27.11.2014 12:01

Завтра выкачу релиз SS 6.4, список обновлений:

https://github.com/kobezzza/Snakeski...ISTORY.md#v640

kobezzza 28.11.2014 19:10

Из-за багов релиз перенесён на 1-2 дня :(

Safort 28.11.2014 19:23

kobezzza,
да нифига, ты вместо запиливания кода лайки на гитхабе ставишь :D

Лучше так, чем потом внезапные баги)

kobezzza 28.11.2014 19:31

Цитата:

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

Цитата:

Лучше так, чем потом внезапные баги)
Они всегда будут :)

kobezzza 29.11.2014 12:59

В догонку к планируемому релизу добавил новую фичу: ссылку на активный узел (если renderMode = 'dom')

< .b-foo
	< .&__cell
		? console.log($0) /// <div class="b-foo__cell"> (HTMLDivElement)
		? console.log($0.parentNode) /// <div class="b-foo"> (HTMLDivElement)

	? console.log($0) /// <div class="b-foo"> (HTMLDivElement)

? console.log($0) /// undefined


Таким образом появилась возможность работать с DOM деревом ещё в момент генерации шаблона.

kobezzza 29.11.2014 17:36

Пилю FAQ: https://github.com/kobezzza/Snakeskin/wiki/faq

Завтра закончу и обновлю общую доку.

Релиз также сделаю завтра.

kobezzza 30.11.2014 16:58

Выпустил SS 6.4

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

***

Также обновил доку и доделал FAQ.

Safort 01.12.2014 07:04

kobezzza,
релиз пока не попробовал, но FAQ годный получился)

kobezzza 01.12.2014 17:11

Выпустил традиционный послерелизовый патч :)

kobezzza 08.12.2014 11:22

Выпустил SS v6.5.

Небольшое обновление, помимо фиксов багов добавился новый параметр useStrict (по умолчанию true).

kobezzza 14.12.2014 18:32

Выпустил очередное обновление: 6.5.5

ЗЫ: сёня ревьювил код и офигел от мастштабов до которых разросся SS :)

kobezzza 17.12.2014 02:03

У Snakeskin появился логотип-талисман:



Я назвал его Фрэнк :)

cyber 17.12.2014 13:44

kobezzza, сам рисовал?)


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