Comments 26
JavaScript пишется слитно.
var test = function ( data ) {
/** @params {string} data */
};
console.log(test.__doc__); // @params {string} data
github.com/monolithed/__doc__/
У этого способа есть единственное ограничение: нельзя употреблять в такой последовательности вот эти 2 символа */ — в принципе у всех скриптовых heredoc есть такие ограничения.
/* *\/ */
А если при сжатии скриптов оптимизатор выкинет все комментарии? Не годно для production уровня.
Там уже написали, что можно использовать такие /** */ комменты. Их минимизаторы (оптимизаторы?) не выкидывают.
Если используется Google Closure Compiler, то спасет директива @preserve:
В UglifyJS немного иной подход:
/**
@preserve
......
*/
В UglifyJS немного иной подход:
/*!
....
*/
Простите, но
/regexp/.exec(fn.toString())
— это вообще в принципе не продакшн.Регулярки в JS настолько медленные?
Дело в другом:
var foo = function () {
/* foo */
};
foo.toString(); // "function () { /* foo */ }"
var foo = function () {
/* foo */
};
foo.bind(null).toString(); // "function () { [native code] }"
Зачем кому-то в здравом уме писать
var hered0c = heredoc(function () {/*
Меня нет
Совсем нет
Полностью - до конца!
Меня никогда не было и не будет.
И не спрашивайте на форумах где я,
Там меня всегда бьют и обижают потом!
Они не понимают меня и не знают где я... © HEREDOC
*/}.bind(null));
?Вы не обратили внимание, что я отвечал на другой вопрос?
В контексте поста ваш пример не имеет смысла, а значит ваша претензия к
fn.toString()
не валидна.Еще раз, я отвечал на конкретный вопрос:
Зачем вы пытаетесь это связывать с чем-то другим, я честно не понимаю.
А если мы уже говорим о Here docs, то в тех же PHP, Perl, Bash, Ruby и т.д. можно использовать еще языковые конструкции, например интерполяцию:
И по хорошему, такой функционал можно было бы и поддержать.
Правда сейчас это уже не имеет никакого смысла, т.к. в ES6 есть Quasi-Literals с нормальными полифилами.
Регулярки в JS настолько медленные?
Зачем вы пытаетесь это связывать с чем-то другим, я честно не понимаю.
А если мы уже говорим о Here docs, то в тех же PHP, Perl, Bash, Ruby и т.д. можно использовать еще языковые конструкции, например интерполяцию:
my $name = "Vasya";
print <<"END";
Hello $name,
Have a nice day!
END
И по хорошему, такой функционал можно было бы и поддержать.
Правда сейчас это уже не имеет никакого смысла, т.к. в ES6 есть Quasi-Literals с нормальными полифилами.
> /regexp/.exec(fn.toString()) — это вообще в принципе не продакшн.
Не могли бы вы пальцем ткнуть к чему это относиться? Я не силен в JS. Сам использую grunt, проверил работоспостобность — все работает. Но суть не в этом. В статичном JS файле в принципе я тоже не вижу необходимости использовать такой подход.
У меня ситуация другая. Получаю через AJAX переменные(html) и команды на JS. И мне в итоге либо регулярку ставить на стороне сервера и превращать html в однострочыний или добавлять слеши или использовать xml(и доп запрос на сервер слать). Причем тогда мне нужно будет делать перехват вывода. Мне этот метод показался панацеей в моем случае.
Если у него есть проблемы я бы хотел знать о них.
Не могли бы вы пальцем ткнуть к чему это относиться? Я не силен в JS. Сам использую grunt, проверил работоспостобность — все работает. Но суть не в этом. В статичном JS файле в принципе я тоже не вижу необходимости использовать такой подход.
У меня ситуация другая. Получаю через AJAX переменные(html) и команды на JS. И мне в итоге либо регулярку ставить на стороне сервера и превращать html в однострочыний или добавлять слеши или использовать xml(и доп запрос на сервер слать). Причем тогда мне нужно будет делать перехват вывода. Мне этот метод показался панацеей в моем случае.
Если у него есть проблемы я бы хотел знать о них.
Ну, во-первых, это хак. Изящный и, кстати, давно известный, но всё-таки хак.
И, кстати, помнится, то ли в старом файрфоксе, то ли в старом ИЕ комменты вырезались. На современных браузерах всё работает ок, но нет никакой гарантии, что так будет вечно. В спецификации английским по белому написано, что результат
Во-вторых, производительность. В то время, как люди меняю на jsperf микросекунды, тут накладные расходы на вызов функции и регулярку вообще не считаются.
Варианты выхода из ситуации:
Если вам нужно на стороне сервера сгенерировать что-либо в нотации JavaScript, можно использовать JSON. Даже само его название, «JavaScript Object Notation» как бы намекает. Тем более, поддерка на серверной стороне широчайшая — от PHP до Erlang,
Можно использовать экранирование символа переноса строки:
(Во, даже хабрапарсер правильно подсветил код!) Но предупреждаю, в спецификации про этот способ ни слова, опять-таки, 100% совместимость никто не гарантирует.
Вариант три: в ES6 уже есть поддержка строк с переносами. Вполне возможно, какой-нибудь Traceur это уже умеет.
И, кстати, помнится, то ли в старом файрфоксе, то ли в старом ИЕ комменты вырезались. На современных браузерах всё работает ок, но нет никакой гарантии, что так будет вечно. В спецификации английским по белому написано, что результат
Function.prototype.toString
— implementation specific.Во-вторых, производительность. В то время, как люди меняю на jsperf микросекунды, тут накладные расходы на вызов функции и регулярку вообще не считаются.
Варианты выхода из ситуации:
Если вам нужно на стороне сервера сгенерировать что-либо в нотации JavaScript, можно использовать JSON. Даже само его название, «JavaScript Object Notation» как бы намекает. Тем более, поддерка на серверной стороне широчайшая — от PHP до Erlang,
Можно использовать экранирование символа переноса строки:
var myVar = "foo\
bar\
baz";
(Во, даже хабрапарсер правильно подсветил код!) Но предупреждаю, в спецификации про этот способ ни слова, опять-таки, 100% совместимость никто не гарантирует.
Вариант три: в ES6 уже есть поддержка строк с переносами. Вполне возможно, какой-нибудь Traceur это уже умеет.
Ага, в спеке ES3 вот даже как:
«A line terminator character cannot appear in a string literal, except as part of a LineContinuation to produce the empty character sequence. The correct way to cause a line terminator character to be part of the String value of a string literal is to use an escape sequence such as \n or \u000A.»
И Google Closure Compiler в advanced режиме выдаст ошибку.
«A line terminator character cannot appear in a string literal, except as part of a LineContinuation to produce the empty character sequence. The correct way to cause a line terminator character to be part of the String value of a string literal is to use an escape sequence such as \n or \u000A.»
И Google Closure Compiler в advanced режиме выдаст ошибку.
Видел подобную штуку в марте этого года очень понравилась идея multiline template через комментарии и анонимную функцию. Их реализация мне нравится больше.
Про то термин «heredoc» слышу впервые — спасибо.
Про то термин «heredoc» слышу впервые — спасибо.
Странно, что никто не вспомнил про coffeescript
html = """
<strong>
cup of coffeescript
</strong>
"""
будет оттранслировано вvar html;
html = "<strong>\n cup of coffeescript\n</strong>";
А чем это отличается от github.com/sindresorhus/multiline?
Sign up to leave a comment.
Где же ты? Heredoc из JavaScript