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

kobezzza 12.02.2015 07:52

Фух, всё правильно работает :)

В test_html.ss.js нет, т.к. там ты объявил прототип, но нигде не вызывал и сборщик мусора SS декларацию выпилил, т.к. она не нужна оказалась.

А в test.ss.js нет, т.к. ты переопределил родительский для proto des блок и тем самым удалил его декларацию и сборщик мусора SS обнаружил, что на данный прототип нет больше ссылок и удалил его, т.е. это абсолютно правильное поведение, решать это можно двумя способами:

1) Вызов super в родительском блоке

{template main(param) extends html}
    {block body}
        {super}
        <div class="wrap">
                {apply des()}
        </div>
    {/}
{/template}


2) Явное указание использования прототипа

{template main(param) extends html}
    {proto des(des)}
        {super}
    {/}

    {block body}
        <div class="wrap">
                {apply des()}
        </div>
    {/}
{/template}


При таком подходе прототип будет вынесен из body, а body будет перезаписан.

PS: если не сложно, добавь мне в issue заданице описать это поведение в доке, а то у мя ща нет возможности, а если не добавить, то я забуду :)

UPD:
повесил тикет по улучшению доки

Gozar 17.02.2015 11:57

Давно хотел спросить.

Настроен watcher snakeskin в webstorm.

header.ss
тут делаем изменения
header.ss.js меняется, всё ок

html.ss
{include 'header.ss'}
html.ss.js Шаблон не знает об изменениях, все плохо

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

Можно как-то отслеживать изменения в подключаемом файле и пересобирать зависимые от него шаблоны? Может есть команда глобальной пересборки хотябы?

Когда зависимый шаблон 1, то такое поведение терпимо, но когда их 10, это уже напрягает.

kobezzza 17.02.2015 14:30

Это косяк вотчера WS, насколько мне известно, что у этой проблемы нет решения сейчас :(

НО, ты же можешь использовать вместо WS:

1) Встроенный вотчер Snakeskin (--watch в CLI, натрави SS на папку с этим флагом);
2) Вотчер от Gulp или Grunt.

Там таких проблем нет.

Цитата:

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

snakeskin myTpls/ -o '%filePath%.js'


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

https://github.com/kobezzza/Snakeski...0%BE%D0%B5-API

Gozar 17.02.2015 16:44

kobezzza,
Спасибо за ответ. CLI-нул, все пересобралось норм.

А вот такой вопрос. А зачем компилятор пишет в комменты абсолютные пути к шаблонам? Это вроде как плохая практика.

kobezzza 17.02.2015 17:01

Цитата:

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

kobezzza 19.02.2015 11:43

Открыл для себя еще один кейз использования SS :)

Препроцессор для шаблонов под Angular, т.е. на этапе сборки проекта шаблоны компилятся с флагом exec и результатом является уже HTML, с которым работает Angular, а т.к. в SS есть директива {{ }}, то шаблон выглядит естественно и очевидно.

В общем, по мне, супер как удобно! Интересно опробовать такой же кейз для React.

melky 19.02.2015 19:22

Цитата:

Сообщение от kobezzza (Сообщение 357270)
Открыл для себя еще один кейз использования SS :)

Препроцессор для шаблонов под Angular, т.е. на этапе сборки проекта шаблоны компилятся с флагом exec и результатом является уже HTML, с которым работает Angular, а т.к. в SS есть директива {{ }}, то шаблон выглядит естественно и очевидно.

В общем, по мне, супер как удобно! Интересно опробовать такой же кейз для React.

в терминах webpack это называется script-loader ...
имхо, переизобретаешь


но движуха с реактом мне нравится. ты же jsx имел в виду под "реактом" ?

Gozar 19.02.2015 19:44

Цитата:

Сообщение от kobezzza
Интересно опробовать такой же кейз для React.

Я может чего не догоняю, но может подскажите какой в этом смысл?

Как объявлять?:
propTypes: {
   value: React.PropTypes.string.isRequired
}


getInitialState: function () {}


И т.д. и т.п.

У Реакта очень тесно связано объявление компонентов и обработка их поведения. Зачем туда пихать ещё и шаблонизатор, который будет делать что?

kobezzza 19.02.2015 20:54

Цитата:

в терминах webpack это называется script-loader ...
имхо, переизобретаешь
Не понял о чём ты. Как шаблонка Angular никуда не годится, т.е. он занимается data-binding -ом, а SS - это именно шаблонка с умоохренительной системой code-reuse и кучей всякого сахара, а т.к. SS поддерживает синтаксис Angular из коробки, то такой гибрид действительно очень удобен и прост в использовании.

Цитата:

Я может чего не догоняю, но может подскажите какой в этом смысл?
Ну, я ещё даже не изучал вопрос, но мне видется, что Реакт - это скорее шаг назад, чем вперёд, т.к. там мы опять имеем вермишель из JS и разметки, непонятно что с code-reuse и т.д. Надо поизучать вопрос, мб я реализую интеграцию с JSX.

kobezzza 19.02.2015 21:11

var HelloMessage = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});


VS

var HelloMessage = React.createClass({
  render: function() {
    return Snakeskin('myFile');
  }
});


# template HelloMessage()
    #< div
        Hello {this.props.name}


И такой шаблон вернёт шаблон React (в примере использован расширенный синтаксис директив #, чтобы можно было спокойно использовать React {}). В шаблонах SS мы можем юзать наследование, макросы, локализацию, БЭМ и кучу прочих фич и бесшовно интегрировать их с React.

Safort 19.02.2015 22:07

kobezzza,
Цитата:

И такой шаблон вернёт шаблон React (в примере использован расширенный синтаксис директив #, чтобы можно было спокойно использовать React {}). В шаблонах SS мы можем юзать наследование, макросы, локализацию, БЭМ и кучу прочих фич и бесшовно интегрировать их с React.
мы поместили шаблонизатор в шаблонизатор, чтобы ты мог юзать шаблоны во время юзания шаблонов
Довольно интересный вариант, но, как мне кажется лучше собрать больше мнений, мб выяснятся какие-то +/- такого решения. Да-да, я намекаю на статью :)

Gozar 19.02.2015 22:09

kobezzza,
Реакт это не шаблоны, а компоненты. HTML там только в самой начальной точке.

Давай такой пример.
var Btn = React.createClass({
    propTypes: {
      value: React.PropTypes.string.isRequired,
      className: React.PropTypes.string.isRequired
    },
    render: function () {

        return (
            <div className={this.props.className}>{this.props.value}</div>
        )
    }
});

//React.PropTypes.string.isRequired - выдает ошибку, если мы забудем указать свойство


var Board = React.createClass({

    getInitialState: function() {
        return {
            className: "btn",
            value: "Кнопка"
        };
    },

    render: function () {

        return (
	    <Btn className={this.props.className} value={this.state.value} />
            <Btn className="btn-my" value="submit" />
        )
    }
});


Цитата:

Сообщение от Safort
мы поместили шаблонизатор в шаблонизатор, чтобы ты мог юзать шаблоны во время юзания шаблонов

:)

kobezzza 19.02.2015 22:32

Цитата:

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

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

Цитата:

Да-да, я намекаю на статью
Я было взялся переводить всё на инглишь, но внезапный поток дел навалился, 3-ю неделю не продохнуть. А статья в подвешеном виде пока, увы :(

Цитата:

kobezzza,
Реакт это не шаблоны, а компоненты. HTML там только в самой начальной точке.
Это я понимаю, но:

1) Во первых SS может генерить любой текст и он точно также спокойно сгенерит текст с компонентом;

2) Это не только куча фишек, но и разделение сущностей, за которые не нужно платить, т.к. всё делается один раз на этапе сборки проекта.

3) Самое главное - это сейчас ну очень просто реализовать :)

Gozar 19.02.2015 22:52

return Snakeskin('myFile');
Меня пугает до усрачки...

Подключение шаблонизатора мне видится для ... я даже не знаю для чего.

Цитата:

Сообщение от kobezzza
сгенерит текст с компонентом

Эм, а
value: React.PropTypes.string.isRequired,
он тоже сгенерит?

kobezzza 19.02.2015 23:04

Цитата:

return Snakeskin('myFile');
Ну многих и шаблоны пугают до усрачки, я в этом не вижу ничего плохого, мы просто кидаем линк на файл SS (который например лежит рядышком в папочке) и после трансляции этот вызов будет заменён на родной для React и усё.

Цитата:

Подключение шаблонизатора мне видится для ... я даже не знаю для чего.
В SS есть встроенная локализация на уровне синтаксиса, поддержка БЭМ как в Stylus, короткий синтаксис аля Jade или HAML и т.д. Расценивать это нужно только как сахар.

Цитата:

Эм, а
value: React.PropTypes.string.isRequired,
он тоже сгенерит?
Ну, я имел ввиду генерить только то, что как то связано с разметкой, но вообще - да, SS может сгенерить что угодно, включая другой шаблон для SS :)

Вот например шаблон, генерирующий JS:

#{template foo()}

    function some() {
        return #{1 + 2};
    }

    var a = {
        bar: "#{'ffffuuuuuu'}"
    };

#{/}


***

Вот ещё пример похожей схемы: Stylus и Rework, первый юзается для трансляции .styl в .css, а второй для .css в .сss (полифилы и т.д.)

Gozar 19.02.2015 23:22

Хотел много чего написать, но напишу только одно. Не жалко времени, пофикси пересборку шаблонов, если возможно.
Цитата:

Сообщение от Gozar
Я тут попробовал объявить 2 прототипа, а затем вызвать их из унаследовавшего шаблона, не вышло, они даже не скомпилились в родительском.

Цитата:

Сообщение от kobezzza
В test_html.ss.js нет, т.к. там ты объявил прототип, но нигде не вызывал и сборщик мусора SS декларацию выпилил, т.к. она не нужна оказалась.

Это конечно круто, но нифига не прикольно. Мне приходиться пересобирать все шаблоны через CLI, вместо того, чтобы сборщик при сборке проверил используется ли прототип в шаблонах где-то ещё и пересобрал шаблоны.

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

kobezzza 19.02.2015 23:28

Стоп, я тебя не понял, какая бага?

Цитата:

В test_html.ss.js нет, т.к. там ты объявил прототип, но нигде не вызывал и сборщик мусора SS декларацию выпилил, т.к. она не нужна оказалась.
Это объяснения я писал для случая, когда ты умышленно уничтожаешь унаследованный прототип в родительском блоке и это абсолютно нормальное и логично поведение и я показал, как можно этого избежать: просто использовать super или явно вынести прототип за пределы родительского блока в родительском или дочернем шаблоне.

Я объяснил ситуацию, привёл примеры и решения, что ты ещё хочешь то?

{template base()}
  {block bar}
    {proto e()}
        1
    {/}
  {/}
{/}

{template child() extends base}
  {block bar}
    fffffuuuu
  {/}
{/}


Неужели ты не видишь, что в дочернем шаблоне ты переопределил блок bar и всё его старое содержимое было законно уничтожено.
Если ты хочешь доопределить - то просто используй super

{template child() extends base}
  {block bar}
     {super}
     fffffuuuu
  {/}
{/}


Это самый логичный способ.

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

{template child() extends base}
  {proto e()}
    {super}
  {/}

  {block bar}
     fffffuuuu
  {/}
{/}


Здесь ты переопределил блок bar, но также явно вынес прототип.

Цитата:

Если это критическая бага шаблонки, то вопрос снимается. Просто не понимаю, зачем нужен вотчер, если приходиться пересобирать все вручную.
Причём тут вотчер? Я совсем потерял нить твоего вопроса.

Gozar 19.02.2015 23:35

Тьфу, не то, мозг отрубается...

http://javascript.ru/forum/project/3...tml#post356968

А если у меня шаблоны разбросаны по разным папкам?

kobezzza 19.02.2015 23:36

Цитата:

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

kobezzza 19.02.2015 23:46

Цитата:

Сообщение от Gozar (Сообщение 357378)
Тьфу, не то, мозг отрубается...

http://javascript.ru/forum/project/3...tml#post356968

А если у меня шаблоны разбросаны по разным папкам?

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

Я уже описывал решения проблемы, но ок, опишу ещё раз:

Решение 1: если ты хочешь как и раньше юзать вотчер WebStorm, то зайди в его настройки и просто задай вместо компиляции файла - компиляцию папки, например,

snakeskin myTpls/ -o '%filePath%.js'


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

Решение 2: В CLI Snakeskin есть свой вотчер, который никак не связан с WebStorm и который знает про граф отношений. Для этого нужно убить вотчер в WebStorm и запустить из консольки SS с флагом --watch.

Решение 3: Использовать вместо вотчера WebStorm вотчер gulp ил grunt - он просто при любом изменении будет перекомпиливать все шаблоны, т.к. решение похоже на пункт 1.

Что тебе удобней - выбирай сам.

Gozar 20.02.2015 00:03

Цитата:

Сообщение от kobezzza
Решение 1: если ты хочешь

Цитата:

Сообщение от Gozar
А если у меня шаблоны разбросаны по разным папкам?

В моих глазах ты предлагаешь три решения на выбор: Костыль, палка для ходьбы и кресло каталка, а хочется бегать :)

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

Gozar 20.02.2015 00:07

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

kobezzza 20.02.2015 00:12

Цитата:

В моих глазах ты предлагаешь три решения на выбор: Костыль, палка для ходьбы и кресло каталка, а хочется ходить
Забыл сказать, что в первом случае ты можешь указать папку - корень проекта ./ (в настройках вотчера) и это будет универсальным решением без оговорок. К сожалению, как я уже говорил, это проблема WebStorm и с ней можно столкнуться много где, хоть в том же Stylus при сборке файлов.

Про сторонние вотчеры: во многих IDE нет вотчеров, поэтому есть сторонние, включая решение из коробки.

***

Я лично уже давно не юзаю вотчеры, а просто запускаю gulp сборку по хоткею: почему я так делаю? Хз, я пришёл к выводу, что мне так удобнее.

Цитата:

Опиши проблему в wiki, люди хотя бы не будут материть тебя. Это реальный геморр выбора вывод ошибок в консоль шторма и запуск отдельного вотчера из консоли. Может тебе так не кажется, но это так.
Вот это дельное замечание, но лучше бы ты влепил мне го в issue на гитхаб. И, кстати, у меня вроде как вики открытая для всех, т.е. ты можешь сам можешь вносить правки и т.д., но я не настаиваю :)

kobezzza 20.02.2015 00:14

Цитата:

Сообщение от Gozar (Сообщение 357385)
У меня открыто обычно штук 5-6 консолей и там что-нибудь да выводится, переключаться в этом хороводе не очень удобно.

Я понимаю, поэтому думаю, что тебе подойдёт решение с перенастройкой вотчера на сборку папки (ещё раз повторюсь, что SS не будет компилить файлы без явной нужды, т.к. там умная система кеша), а в качестве папке можешь указать корень проекта ./ и всё будет ок работать.

Цитата:

А если у меня шаблоны разбросаны по разным папкам?
Не беда, укажи родительскую для всех них папку, например корень проекта. Т.е. SS рекурсивно гуляет по папкам вниз и ищет шаблоны.

Gozar 20.02.2015 00:18

Цитата:

Сообщение от kobezzza
snakeskin myTpls/ -o '%filePath%.js'

Вотчер прописанн в шторме:
snakeskin ./server/tpl/ -o %filePath%.js
SnakeskinError: text can't be used in the global space, file: , line: 1


В консоли шторма отрабатывает нормально.

kobezzza 20.02.2015 00:20

Цитата:

%filePath%.js
В скобки возьми, '%filePath%.js'

Gozar 20.02.2015 00:25

Цитата:

Сообщение от kobezzza
В скобки возьми, '%filePath%.js'

Взял, задание повисло. :(

kobezzza 20.02.2015 00:28

Цитата:

Сообщение от Gozar (Сообщение 357393)
Взял, задание повисло. :(

Мои настройки вотчера:

Program: C:\Users\kobez_000\AppData\Roaming\npm\snakeskin.cmd
Arguments: ./server/tpl/ -o %filePath%.js
Working Directory: $FileDir$
Output Path: $FileName$.js


У тебя отличия будут только в Program (думаю понятно почему).

***

Хотя стой, тебе не надо в кавычки брать, у тяж линух, а я для cmd.exe описал, отбой :)

Gozar 20.02.2015 00:31

snakeskin ./server/tpl/ -o '%filePath%.js'
SnakeskinError: text can't be used in the global space, file: , line: 1

kobezzza 20.02.2015 00:34

Цитата:

Сообщение от Gozar (Сообщение 357395)
snakeskin ./server/tpl/ -o '%filePath%.js'
SnakeskinError: text can't be used in the global space, file: , line: 1

Мне кажется мы друг друга не понимаем, ты что пытаешься сделать? Прочитай мой пост выше. Если ты настраиваешь WebStorm то смотри мой конфиг.

kobezzza 20.02.2015 00:42

Получилось? А то я спать хочу :)

Gozar 20.02.2015 00:42

Цитата:

Сообщение от kobezzza
Мне кажется мы друг друга не понимаем

Понимаем. То, что ты говоришь не работает у меня!

kobezzza 20.02.2015 00:44

Цитата:

Сообщение от Gozar (Сообщение 357398)
Понимаем. То, что ты говоришь не работает!

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

Gozar 20.02.2015 00:48

-s $FileName$ -o $FileName$.js --pretty-print
$FileDir$
$FileName$.js

Работает нормально

./server/app/tpl -o %filePath%.js
$FileDir$
$FileName$.js

Не работает (да шаблоны ./server/app/tpl)

-o %filePath%.js
$FileDir$
$FileName$.js

Так зависает (да шаблоны ./server/app/tpl)

kobezzza 20.02.2015 00:53

Мы придурки :)

У нас рабочая директория стоит же

$FileDir$

:D

Вот оно и не работает

Gozar 20.02.2015 00:53

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

Gozar 20.02.2015 00:55

Цитата:

Сообщение от kobezzza
Мы придурки

Ну не знаю, я вроде нормальный. :) Я уже пробовал, еще позавчера, оно зависает.

Gozar 20.02.2015 00:58

Указал полный путь от корня / (вместе с /home/юзер/blabla/..../), завелось. Спасибо что помог. Похоже относительный не понимает совсем ни в каком виде.

Тоже бы в wiki стоило добавить, я полдня убил на переборы, пути подбирал.

Еще раз спасибо, у самого бы фиг терпения хватило на добивание.

kobezzza 20.02.2015 01:00

Цитата:

Сообщение от Gozar (Сообщение 357405)
Указал полный путь от корня /, завелось. Спасибо что помог. Похоже относительный не понимает совсем.

Разобрался, там просто нужно указывать для WebStorm окружение, вот конфиг:

Program: C:\Users\kobez_000\AppData\Roaming\npm\snakeskin.cmd
Arguments: $ProjectFileDir$/server/app/tpl -o %filePath%.js --pretty-print
Working Directory: $FileDir$
Output Path: $FileName$.js


Обрати внимание на $ProjectFileDir$, т.е. нужно было явно сказать WebStorm, что пляшем от корня проекта.

Цитата:

Похоже относительный не понимает совсем ни в каком виде.
Понимает, просто относительный WebStorm высчитывает относительно Working directory, в общем я скинул тебе рабочий конфиг :)

Gozar 20.02.2015 01:03

Цитата:

Сообщение от kobezzza
$ProjectFileDir$/server/app/tpl

Да, да, точно, так тоже завелось :) Жизнь хороша :D


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