Pull to refresh

Comments 164

Статья интересная, а подача требует «внезапно» сломать голову.
подача клоунская, портит годную статью.
кажется ты слишком напряжён :-о *массирует плечи* расслабься!
кажется, вы слишком любите говорить от третьего лица, что и превращает годную статью в кукольный театр.

А вообще, очень интересный подход к шаблонам. Фактически как у Резига в результате получаются скомпилированные шаблоны, но в гибче с точки зрения выходных данных
я люблю экспериментировать %-)

и гораздо быстрее, кстати. особенно в хроме, с его прекомпиляцией.
Мне было реально трудно ее читать из-за этих *напрягающих* вставок
Диалоги персонажей в стиле Web 2.0 прямо.
настоящие джедаи делают так:
javascript: document.documentElement.innerHTML= document.documentElement.innerHTML.replace( /\*[а-я].*?[а-я]\*/g, ' ' )
Силы мало в тебе чувствую я. Качаться нужно тебе ещё.
UFO landed and left these words here
никаким, но если очень хочется, то:

TT.template( '{[}{xxx}{]}' )({ '[': '{', ']': '}', xxx: 777 })
экранирование — всегда порно…
а почему не сделать экранирование двойными скобками, например {{{variable}}} выведет {значение}
Парсер пишется один раз, а использается постоянно.
Должно быть легко в использовании, а не написании парсера.
сложный парсер медленнее работает… впрочем, я согласен.
теперь для экранирования достаточно удвоить фигурную скобку
Вычитав еще пару раз драматургический опус статью, мне понравился подход :), спасибо.
UFO landed and left these words here
а как будет понятнее, проще или красивее?
Очень удобно, красиво и уже сравнительно давно изобретено. И оттестировано многими разработчиками.
значит тебе не составит труда переписать мой пример на каждый из них?
Почему нету точек с запятой в конце строк?
Они, конечно, не обязательны, но крайне желательны, и без них невозможно "упаковать" скрипт
м… а зачем его упаковывать в одну строку? х) это же не букмарклет какой-нибудь…
Если поставить галочку возле Shrink variables размер уменьшиться в 1.8 раза.
При том, что всё сворачивается в одну строчку для уменьшения размера почти на 30%
ты предлагаешь добавить 30% семиколонов, чтобы можно было вырезать 30% переводов строк? х) шило на мыло…
Во-первых, есть еще пробелы для форматирования.
Во-вторых, не в каждой строчке надо ставить семиколон.
В-третьих, перевод строк частенько состоит из 2х байт.
1. пробелы можно вырезать независимо от наличия семиколонов
2. как и перенос строки
3. какие проблемы редуцировать перенос строки до 1 символа?
тогда смысл экономить на семиколонах?
потому что перевод строки необходим и достаточен.
Замкнутый круг. Перейдите в начало ветки.
Когда-то прочёл, что если точек с запятыми нет, то некоторые (многие?) движки сначала их предварительно расставляют (выглядит странно), что негативно сказывается на производительности. Или сильнее напрягаются в парсинге (что вполне объяснимо). С теми же последствиями. Зуб за эту информацию не даю, продаю за что купил, но с некоторых пор сменил бесточекасзапяточный :) стиль обратно на классический. Мне не жалко, а шансов нарваться на ошибку парсинга чуть меньше, ну и со скоростью — вдруг не соврали…
разница в скорости незначительна.
никто их при парсинге не расставляет, ибо они являются лишь разделителями операторов
>разница в скорости незначительна.
Я не проверял.
>никто их при парсинге не расставляет, ибо они являются лишь разделителями операторов
Расставляет. Об этом даже есть специальный раздел в стандарте. Automatic Semicolon Insertion называется. Ну, то есть, физически можно не вставлять, но поведение должно соответствовать варианту, как будто вставляется.
это всего-лишь игра слов для простоты понимания.
Это описание поведения интерпретатора. И парсер именно так и работает. Фиг с ней со скоростью, главное тут побочные эффекты.
парсер создаёт дерево инструкций. в этом дереве нет ни семиколонов, ни переводов строк.
??? При чём здесь дерево инструкций? Описано поведение парсера во время парсинга исходного текста.
ECMAscript Language Specification, пункт Automatic Semicolon Insertion.
Там описано как должен вести себя парсер языка ECMAscript. Как ведёт себя парсер из википедии меня совершенно не волнует. Вы полагаете, яваскриптовые движки пишут по википедии, а не по спецификации? Ну-ну.
парсеры пишут по уму. а спецификация описывает лишь эталонную реализацию.
ни один программист не будет писать парсер автоматически вставляющий семиколоны, банально потому, что это медленно и бессмысленно.
Угу, я про это тоже писал. Но анализировать ситуацию всё-равно надо — раз, и спецэффекты всё-равно остаются — два.
не говорите глупостей, я лично собираю все скрипты в один пак, сжимаю. На выброс идет пакованый скрипт + gzip + кэшируется. В итоге клиент получает 57.9 KB вместо 220кб ;)
эм… ну я рад за тебя. а теперь удали все семиколоны и удивись разнице.
чему удивлятся? ошибкам после того как скрипты пройдут через Closure Compiler?
СС настолько тупой, что ломает скрипты?
Семиколоны в некоторых случаях должны быть по стандарту. Если их нет — движок пытается «угадать». Логично предположить, что не всегда он угадает правильно.

Именно поэтому надо их ставить везде. А убирать, для компенсации, переносы строк ;-)
должны быть они лишь в цикле for. в остальных случаях перевод строки делает их использование бессмысленным.
Вот пример. Падает с ошибкой из-за пропущенной ;.

<script>
var a = 5
(true)
</script>

Интерпретатор трактует это как вызов функции 5(true). Так что ставьте везде семиколоны ;-)
<script>
var a = 5
(condition? obj1: obj2).callSomeFunc()
</script>

Тоже самое. Пример, более близкий к жизни, коли вам так угодно.

Если следующая строка с точки зрения синтаксиса может быть продолжением предыдущей — она станет продолжением предыдущей. Если не может — будет автоматически вставлен семиколон.
а это говнокод :-Р надо писать так:
var a= 5
var obj= condition? obj1: obj2
obj.callSomeFunc()
Ну говнокод это или нет — вопрос отдельный, другое дело что это конкретный, реальный пример когда точки с запятыми нужны. Сколько таких примеров можно при желании найти еще и где они всплывут — науке не известно. Именно по этому я считаю, что точки с запятыми надо ставить всегда.
науке всё прекрасно известно :-Р именно поэтому у меня никогда из-за этого проблем не возникало.
такое ощущение, что статью написал педофил )))
каждый думает в меру своей испорченности ;-)
олдфаги помнят зачин «здравствуй дружочек» и одобряют топик
У меня при чтении возникло ощущение, что статью пишет анимешник. Я укрепился в этом мнении, когда дочитал до ника автора =)
все анимешники немного того х)
А… но всё равно, я вчера был поражён от того, сколько там музыки. Охренеть! Сколько труда потребовалось чтобы всё это собрать!
Нужно отобрать у автора как можно больше ЛСД.
не получится — я уже всё скурил %-)
так вот почему так плохо торкает! :-о
И Смешно и поучительно одновременно
Жаль, а ведь, наверное, что–то интересное написано. Ведь правда? *обнимаю в охапку и плачу*
А чем отличается объявление:

TT.html= function( tpl )…

от:

TT.html.encoder= new function( )…

С какой целью в одном имеется оператор new, а в другом нет?
new используется для создания дополнительного скопа, куда помещаются статические переменные, необходимые для определяемой функции
1) скоп — что это?
2) чем переменная в функции без new будет отличаться от функции с new?

Да и вообще, можешь рассказать об этом подробнее?
А то я даже вопросов пока сформулировать не могу толком =)
Не проще было написать что var x = new function(){}; равносильно var x = (function(){})();.
и тогда бы он спросил, что такое (function(){})()? х)
Такой вариант, по моим наблюдениям, встречается чаще.
То есть, в этом случае функция не только объявляется, но и выполняется, при этом её результат пишетя в x?
Или, другими словами, в x пишется не функция, а результат функции?
а зачем кстати новый скоуп для TT.template, почему было searcher просто внутрь не положить?
чтобы не создавать его заново при каждом создании темплейта.
в первом случае просто определяется анонимная функция, а во втором случае, благодаря оператору new она еще и вызывается, что приводит к созданию нового объекта вызова, в который попадают все определяемые внутри переменные
м… надо будет выпустить аудиокнигу %-)
фильм. тогда не будет этих вставок, за которыми теряется весь смысл текста.
ага и обязательно тетю асю с 3м размером: Р
только чтобы третий размер не отвлекал куда больше, чем вставки в тексте..:)
Материал довольно интересен. То есть его можно кушать и нахваливать. Антураж весь вот этот лично для меня портит впечатление. То есть по итогам оценка — 0.
Но тут я вспоминаю слово «порева», меня передергивает еще разок и ставлю минус.
ви таки порноненавистник? х)
Таки нет, но есть вещи уместные и неуместные.
Нет, просто я во всем люблю красоту. Можно сделать узбекский орнамент на ковровой рамке у портрета Путину или там украсить свой автомобиль лошадиным хвостом. Главное при этом остроумие, оригинальность изобретательность и пр.

Человек ведущий себя в разных ситуациях нестандартно может быть яркой личностью а может тупым неадекватом. Оба делают что-то «нескучное» на их субъективный взгляд, а получается по-разному. Андэстэнд?
ты посягаешь на мою индивидуальность! т-т
а кто тебе сказал что ты правильно отличишь яркую личность от тупого неадеквата?
Это субъективные оценки. И здесь никакого «правильно» или «неправильно» быть не может.

Если табуляцию выставить в два пробела — то уже не так страшно.
угу, подсвечиватель невменяемый какой-то >_<
статья и особенно её подача впечатлили. ушло в избранное :)
UFO landed and left these words here
По стилю здорово =) Разбавит немного хабрашаблоны и хабразаискивания. Так держать!
Забавно все это конечно, только зачем что-либо экранировать на стороне JS?
Хм, ну такие вещи вроде-как на стороне сервера делаются, не? (-:
Есть Javascript на стороне сервера ;)
Выглядит зловеще:
.split( '"' ).join( '"' )

Это действительно делает что-то полезное?
материал неплохой, подача, соглашусь, чрез чур юморная. а так я сам нечто подобное использую для всего, что надо «отшаблонизировать»
а черт его знает как оно пишется :)
я в таких случаясь руководствуюсь правилом: как слышится, так и пишется
сколько людей — столько способов решить проблему :)
я, к примеру, когда не уверен — проверяю в словаре

а в данном случае — и слышится, видимо, всем по-разному
мне слышится как раз «чересчур»… ну, может быть, «чирисчур» (безударные «е» звучат как «и»)
Переводы строк уходят в аут после парсинга.
Замените
/(.*?)(\{|\}|$)/g
на
/([\s\S]*?)(\{|\}|$)/g
, чтоли ;)
А еще, возможно, стоит сделать так:
/([\s\S]*?)(\{|\}|$)(?!\2)/g

Тогда решится проблема с экранированием (две скобки == просто скобка):
var template= TT.html( 'По {{fake}} запросу <kbd>{query}</kbd> найдено страниц: {count}' )
var message= template({
    fake: 'этому',
    query: 'Ultimate Answer to the Ultimate Question of Life, The Universe, and Everything',
    count: 42 });
к сожалению, не всё так просто…
TT.template( 'a{{{b}}}c' )({ b: 'd' }) должно преобразовываться в 'a{d}c'
Что-то теперь вообще странно. Выдает на пример
{}Ultimate Answer to the Ultimate Question of Life, The Universe, and Everything{}42{}
Ну… скачал скрипт… searcher такой:
/((?:[^\{\}]|\{\{|\}\})*)(?:\{|$)|([^\{\}]*)(?:\})/g
А я вот, а я, по первым 2 строчкам догадался кто автор! Подход очень интересный, хотя конечно надо еще посмотреть насоклько это грузит браузер, все эти замыкания и прочая ересь.
главное, чтобы где-то в родитетельском scope не попались ссылки на DOM-объекты ;) Ибо ололо.
То есть не будет? Убиваем элемент в дереве, ссылка на него в контексте, залоченном в замыкании остается, вуаля — leak detected. Или я что-то путаю?
а, ты про утечки… им тут не от куда взяться.
тут негде. Это был ответ на
замыкания — это очень быстро
Hi I'm the author of pure.js mentioned above (thanks SMiX for the link).
I read this post through Chrome Translate, so please be nice!

At the beginning of your post, it looks you escapeHTML for security reasons.
I don't think you have to do that. The HTML scripts are not parsed when injected into a node through innerHTML.
Кстати, а почему pipe получает массив? Лучше уж через arguments, тогда более походе на pipe ;)
это практичней, когда надо протягивать массивы через цепочку функций. arguments в массив конвертятся очень накладно.
Про цепочку я что-то не понял, поясните пожалуйста. А насчет конвертации — Array.prototype.slice.call(arguments) работает везде, насколько я помню.
this.createFilter= ТТ.pipe( TT.pipe, TT.binder( this ) )

var filter= this.createFilter([ this.trim, this.escape, this.validate ])

везде кроме ие =(
>>> везде кроме ие =(
Хм. В IE6-8 работает.
Пожалуйста :) Жаль только, что в IE arguments — это вроде как единственное, для чего это работает (в плане того, что с HTMLCollection так уже не поступить)
Only those users with full accounts are able to leave comments. Log in, please.