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

Safort 15.10.2014 17:14

kobezzza,
у меня тут небольшая проблема, не подскажешь, что за магия творится?)
Решил я использовать уже компилированные SS-файлы в Ноде(вместо живой компиляции).
Итак, действующие лица:
gulpfile.js
/app/views/index.ss
/app/views/index.ss.js
app.js


Сожержимое gulpfile.js:

//...
    gulp.task('views', function() {
      gulp.src([ 'путь_к_исходнику/' + 'index.ss'])
          .pipe(concat('index.ss'))  //на будущее, когда будет много файлов
          .pipe(gulp.dest('app/views'))
          .pipe(snakeskin({ prettyPrint: true }))
          .pipe(gulp.dest('app/views'));
    });
    // ...



Содержимое index.ss (упростил для примера):

{template text(a)}
      {a}
    {end}




Сожержимое app.js:

var tpls = require(__dirname+'/app/views/index.ss.js').init(require('snakeskin'));
console.log(tpls.text('ss.js'));


Запускаю скрипт, а консоль меня посылает
C:\dev\test>node app.js

C:\dev\test\app\views\index.ss.js:7
    var $C = this.$C != null ? this.$C : Snakeskin.Vars.$C,
                                         ^
ReferenceError: Snakeskin is not defined
    at Object.<anonymous> (C:\dev\test\app\views\index.ss.js:7:42
)
    at Object.<anonymous> (C:\dev\test\app\views\index.ss.js:164:
4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (C:\dev\test\app.js:18:12)
    at Module._compile (module.js:456:26)



Но это ещё не всё. В app.js пишу следующее:

var snakeskin = require('snakeskin');
    var tpls = snakeskin.compileFile(__dirname+'/app/views/index.ss');
    console.log(tpls.text('ss'));


Запускаю файл - работает. Но и это ещё не всё, снова пишу:

var tpls = require(__dirname+'/app/views/index.ss.js').init(require('snakeskin'));
    console.log(tpls.text('ss.js'));

Запускаю. И это теперь тоже работает.

Казалось бы, коммунизм наступил всё норм, но нет.
Редачу файл index.ss (или просто жму Ctrl+S в Sublime), Gulp подхватывает изменения, запускаю app.js и снова вылетает ошибка.
И такой баг(?) повторяется только при использовании уже компилированного шаблона, при живой компиляции такой проблемы нет.

Не знаю в чём именно проблема, но раз ошибку выдаёт SS, то решил написать сюда.

kobezzza 15.10.2014 17:23

Цитата:

snakeskin({ prettyPrint: true })

Ты не указал тип экспорта для ноды.

snakeskin({ prettyPrint: true, exports: 'commonJS' })


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

(До версии 6 это делалось с помощью флага .commonJS)

Цитата:

concat('index.ss')

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

https://github.com/kobezzza/Snakeskin/wiki/include

Цитата:

Сообщение от Safort (Сообщение 335737)
Но это ещё не всё. В app.js пишу следующее:

var snakeskin = require('snakeskin');
    var tpls = snakeskin.compileFile(__dirname+'/app/views/index.ss');
    console.log(tpls.text('ss'));


Запускаю файл - работает. Но и это ещё не всё, снова пишу:

var tpls = require(__dirname+'/app/views/index.ss.js').init(require('snakeskin'));
    console.log(tpls.text('ss.js'));

Запускаю. И это теперь тоже работает.

Казалось бы, коммунизм наступил всё норм, но нет.
Редачу файл index.ss (или просто жму Ctrl+S в Sublime), Gulp подхватывает изменения, запускаю app.js и снова вылетает ошибка.
И такой баг(?) повторяется только при использовании уже компилированного шаблона, при живой компиляции такой проблемы нет.

Не знаю в чём именно проблема, но раз ошибку выдаёт SS, то решил написать сюда.

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


PS:
кстати, в SS CLI API есть свой вотчер, но в отличии от того же галпа, он работает с графом отношений файлов, т.е. если обновить, например, файл локализации, который подключён в шаблон, то он перекомпилит его.

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

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

snakeskin ./myTpls/ -o './compile/%file%.js' --watch

kobezzza 15.10.2014 17:55

Цитата:

snakeskin.compileFile(__dirname+'/app/views/index.ss');

На будущее: лучше юзай path.join для конкатенации урлов, это не относится к SS, а вообще, т.к. можно наткнуться на всякие баги.

Safort 15.10.2014 20:35

kobezzza,
Цитата:

Ты не указал тип экспорта для ноды.

snakeskin({ prettyPrint: true, exports: 'commonJS' })
О! Спасибо) Эта шняга решила проблему)


Цитата:

PS: кстати, в SS CLI API есть свой вотчер
Попробовал. Теперь у меня в папке проекта папка с именем '. и я не могу её удалить =__=


Цитата:

На будущее: лучше юзай path.join для конкатенации урлов, это не относится к SS, а вообще, т.к. можно наткнуться на всякие баги.
Спасибо за совет)

Safort 15.10.2014 20:56

kobezzza,
у меня проблема за проблемой :D

Разбросал файлы так:

Галп
//...
gulp.task('views', function() {
  gulp.src([path.join(paths.src.views, 'index.ss')])
      .pipe(snakeskin({ prettyPrint: true, exports: 'commonJS' }))
      .pipe(gulp.dest('app/views'));
});
//...


index.ss
{include 'main.ss'}
{include 'article.ss'}


main.ss
{template main.home(articles)}
<!DOCTYPE html>
<html>
  ///всякий html...

   {block content}
     {forEach articles => article}

      ///всякий html...
     
     {/forEach}
   {/block}
 </section>
 
  ///всякий html...
</html>
{end}


article.ss
{template article(data) extends main.home}
  <!DOCTYPE html>
  <html>
    ///всякий html

    {block content}
      ///всякий html
    {/block}

    ///всякий html
  </html>
{end}


Вотчер галпа следит за изменениями всех *.ss и вызывает SS при оных.
Проблема: изменяю шаблон > сохраняю его > перезапускаю app.js но изменений на странице не видно(так же как и ошибок).
Перезапускаю сам Галп, потом app.js и только тогда изменения видны.
SS по какой-то причине не подхватывает изменения в подключаемых шаблонах. Скорее всего я не так их подключил.

kobezzza 16.10.2014 00:41

Не совсем понятно, если я правильно тебя понял, то ситуация такая: есть файл А в него включается файл Б, и при обновлении файла Б ничего не происходит. Если это так, то это вина галпа, т.к. он не знает про граф отношений и тут нужен --watch SS, т.к. он обновляет файлы в таком случае.

ЗЫ: если можешь, то запиши видео с работой, чтобы было проще понять.

Safort 16.10.2014 09:48

kobezzza,
Цитата:

Не совсем понятно, если я правильно тебя понял, то ситуация такая: есть файл А в него включается файл Б, и при обновлении файла Б ничего не происходит.
Да, всё правильно. Есть файл index.ss, который инклудит в себя main.ss и article.ss.

Цитата:

Если это так, то это вина галпа, т.к. он не знает про граф отношений и тут нужен --watch SS, т.к. он обновляет файлы в таком случае.
Так ведь Галпу не нужно знать какие файлы куда включаются, он мониторит изменения всех нужных *.ss-файлов, запускает
gulp.task('views', function() {
  gulp.src([path.join(paths.src.views, 'index.ss')])
      .pipe(snakeskin({ prettyPrint: true, exports: 'commonJS' }))
      .pipe(gulp.dest('app/views'));
});


который отдаёт index.ss СнэйкСкину, и СС уже смотрит на содержимое и подключает указанные инклуды. По моей логике так должно быть. Или я ошибаюсь?

Цитата:

ЗЫ: если можешь, то запиши видео с работой, чтобы было проще понять.
Если сегодня к вечеру не удастся решить проблему, то запишу)

kobezzza 16.10.2014 10:59

Кажется понял в чём дело, задай параметр

{ prettyPrint: true, exports: 'commonJS', cache: false }


Если поможет, то я потом обновлю плагины: сделаю этот параметр по умолчанию отключённым.

Safort 16.10.2014 16:57

kobezzza,
да, это оно. Спасибо ещё раз, теперь проблем нет)

kobezzza 21.10.2014 15:00

Выпустил патчи для плагинов Grunt и Gulp.

***

По поводу ошибки с
Цитата:

Попробовал. Теперь у меня в папке проекта папка с именем '. и я не могу её удалить =__=
Скорее всего ты пользовался командной оболочкой Windows, а там для обозначения строк нужно писать "", а я привёл пример в Bash, от сюда и проблема :)

snakeskin ./myTpls/ -o "./compile/%file%.js" --watch


Что касается URL, то можно юзать любую нотацию, т.к. в CLI она приводится к единому виду.

Safort 21.10.2014 20:01

kobezzza,
Цитата:

Выпустил патчи для плагинов Grunt и Gulp.
Как я понимаю, там теперь кэш сброшен по умолчанию и если я уже прописал
{ prettyPrint: true, exports: 'commonJS', cache: false }
то обновляться не обязательно?

Цитата:

Скорее всего ты пользовался командной оболочкой Windows, а там для обозначения строк нужно писать "", а я привёл пример в Bash, от сюда и проблема
Что интересно, так это как винда разрешила создать такую папку, но удалить - нет?



Мб в название темы добавить "SnakeSkin", чтобы сразу было понятно про что она?

kobezzza 21.10.2014 20:40

Цитата:

то обновляться не обязательно?
В принципе, да.

Цитата:

Что интересно, так это как винда разрешила создать такую папку, но удалить - нет?
Мистика :)

Цитата:

Мб в название темы добавить "SnakeSkin", чтобы сразу было понятно про что она?
Не получается :(

kobezzza 22.10.2014 11:52

Выпустил патч SS 6.0.4.

kobezzza 22.10.2014 19:12

Начал потихоньку пилить общую статью для хабры:
https://github.com/kobezzza/kobezzza...r/snakeskin.md

Буду рад критики, т.к. писатель я тот ещё :)

Safort 22.10.2014 20:34

kobezzza,
да её даже не обязательно писать, просто собрать куски доков в один и всё :D
Пока всё годно, но если статья планируется большой, то можно куда-нибудь в начало поместить "Содержание".

kobezzza 23.10.2014 14:04

Обновил плагины для grunt и gulp - была исправлена ошибка при работе в режиме exec.

kobezzza 23.10.2014 16:05

Выпустил патч SS 6.0.6

kobezzza 23.10.2014 18:57

Выпустил SS 6.1.3

Добавлена поддержка масок для include

- include '/tpls/**/*.ss'

kobezzza 05.11.2014 22:36

Выпустил большой патч SS 6.2.0.

Safort 06.11.2014 00:21

На этой странице https://github.com/kobezzza/Snakeski...%D 0%B8%D1%8F
обнаружил ссылку ведущую на 404
https://github.com/kobezzza/Snakeski...in.live.min.js

kobezzza 06.11.2014 00:33

Спасибо, забыл обновить: я поменял папку сборки с build на dist, как принято в bower пакетах

Safort 06.11.2014 02:05

kobezzza,
а можно нубский вопрос? Как использовать скомпилированные шаблоны на клиенте? :D
В доке примера не нашёл. Подключаю так:
<script src="/snakeskin.live.min.js"></script>
<script src="/index.ss.js" type="text/x-snakeskin-template"></script>

Но функции из шаблона не доступны глобально.

kobezzza 06.11.2014 08:34

Ты наверное устал :)

Кто же подключает JS файл с таким типом type="text/x-snakeskin-template", не мудрено, что не работает, т.к. браузер просто игнорирует это.

Делай так:

<script src="/snakeskin.live.min.js"></script>
<script src="/index.ss.js"></script>


text/x-snakeskin-template нужен, если ты описываешь инлайн шаблоны

<script src="/snakeskin.live.min.js"></script>
<script type="text/x-snakeskin-template">
- template foo()
    ...
</script>

Safort 06.11.2014 08:47

kobezzza,
Цитата:

Ты наверное устал
ога(

Цитата:

Кто же подключает JS файл с таким типом type="text/x-snakeskin-template", не мудрено, что не работает, т.к. браузер просто игнорирует это.
Я сначала подключал как надо, но вылетает ошибка
ReferenceError: global is not defined

ведущая к 5-й строке index.ss.js
var Snakeskin = global.Snakeskin;

kobezzza 06.11.2014 08:52

Ты уверен, что у тебя не exports = 'commonJS' экспорт?

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

Цитата:

Я сначала подключал как надо, но вылетает ошибка
ReferenceError: global is not defined
Хотя к твоей проблеме это отношения не имеет, но это микроошибочка, исправлю потом :)

Safort 06.11.2014 09:12

kobezzza,
он самый
.pipe(snakeskin({ prettyPrint: true, exports: 'commonJS', cache: false }))


Вот блин, я то думал его так можно использовать)
Получается, нужно в двух "форматах" экспортировать файлы, чтобы оно везде работало(?) Сейчас так сделал - всё работает.
Сейчас глянул в доку к плагину, как я понимаю, параметр exec это прошлый cache?

//Мб лучше описать параметр exports в доке?

kobezzza 06.11.2014 09:22

Цитата:

Вот блин, я то думал его так можно использовать)
Получается, нужно в двух "форматах" экспортировать файлы, чтобы оно везде работало(?)
В принципе можно сделать рабочим commonJS для браузера, но там нужно будет делать дополнительные инициализации, я добавлю это в следующий релиз.

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

Цитата:

Сейчас глянул в доку к плагину, как я понимаю, параметр exec это прошлый cache?
Нет, параметр exec означает, что скомпилиный шаблон нужно немедленно выполнить и в качестве результата у тебя уже будет html, а не JS, это нужно для статической генерации сайтов.

Параметры tpl и data также относятся к exec.

Цитата:

//Мб лучше описать параметр exports в доке?
Дык, https://github.com/kobezzza/Snakeski...ompile#exports

***

Кстати, задавай вопросы лучше в issue на гитхаб, вдруг у кого ещё такие проблемы будут, а так типо FAQ будет.

Safort 06.11.2014 09:34

kobezzza,
Цитата:

Нет, параметр exec означает, что скомпилиный шаблон нужно немедленно выполнить и в качестве результата у тебя уже будет html, а не JS, это нужно для статической генерации сайтов.
Я точно устал..

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

Цитата:

Кстати, задавай вопросы лучше в issue на гитхаб, вдруг у кого ещё такие проблемы будут, а так типо FAQ будет.
и позориться ещё и на англ. сегмент?!Я пока почти не умею в Гитхаб ;( Как начну его использовать, так сразу)


Спасибо, в очередной раз)

kobezzza 06.11.2014 09:35

Цитата:

Моя плохая привычка - чтобы посмотреть доки, лезу на страницу галп-плагину, а не к самому модулю)
Дык, https://github.com/kobezzza/gulp-sna...82%D1%80%D1%8B (параметры - это ссылка) :)

Safort 06.11.2014 09:38

kobezzza,
так там же не все параметры, того же commonJS нету. Или я уже того, и не вижу его.. *ушёл спать*

kobezzza 06.11.2014 09:43

Цитата:

Сообщение от Safort (Сообщение 339318)
kobezzza,
так там же не все параметры, того же commonJS нету. Или я уже того, и не вижу его.. *ушёл спать*

Все, это ссылка на основную страницу SS.

commonJS (параметр) был удалён в версии 6, а вместо него добавлен exports и он там есть, будь внимательнее :)

kobezzza 06.11.2014 13:09

Формирую список фич для SS 6.3.0

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

Safort 06.11.2014 16:51

kobezzza,
Цитата:

Все, это ссылка на основную страницу SS.
ступил, думал мы про страницу галп-плагина говорим(забыл про твоё примечание в скобках).



Судя по наличию gulpfile.js в репо, ты всё таки перешёл с Гранта на Галп)

kobezzza 06.11.2014 16:54

Цитата:

Судя по наличию gulpfile.js в репо, ты всё таки перешёл с Гранта на Галп)
Да, перешёл на тёмную сторону :D

Safort 06.11.2014 16:58

kobezzza,
а как же декларативный подход Гранта, который тебе удобнее и всё такое?) Всё таки реклама тут и годные статьи на Хабре сломили твою волю!

Цитата:

Да, перешёл на модную сторону
fix

kobezzza 06.11.2014 17:21

Цитата:

kobezzza,
а как же декларативный подход Гранта, который тебе удобнее и всё такое?) Всё таки реклама тут и годные статьи на Хабре сломили твою волю!
25-й кадр :D

kobezzza 08.11.2014 14:54

Почти закончил работу над 6.3.0 - идёт тестирование.

Пример 2-х новых фич: интерполяция тега и липкие ссылки

- forEach data => @el, i, data, isFirst
	< li.b-item
		< a.&__link[.&_active_#{isFirst}] href = #{@href}
			{@label}


Первая ячейка отрендерится как:

<li class="b-item">
    <a class="b-item__link b-item__link_active_true" href="...">...</a>
</li>


Это просто офигенно удобно :)

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

***

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

Safort 08.11.2014 15:11

kobezzza,
Цитата:

Также был разработан универсальный формат экспорта, теперь нет необходимости компилить шаблоны отдельно для ноды и браузера.
Когда. Будет. Релиз?

kobezzza 08.11.2014 15:13

Цитата:

Сообщение от Safort (Сообщение 339776)
kobezzza,

Когда. Будет. Релиз?

Скорее всего завтра, не хочу торопиться, чтобы потом штамповать хотфиксы, как у меня обычно бывает :)

Safort 08.11.2014 16:42

kobezzza,
ну да, лучше не спешить в этом деле)


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