Search
Write a publication
Pull to refresh

Comments 26

UFO landed and left these words here
OP говорит о многострочных строковых литералах. Но ваша штука очень прикольная!
У этого способа есть единственное ограничение: нельзя употреблять в такой последовательности вот эти 2 символа */ — в принципе у всех скриптовых heredoc есть такие ограничения.

/* *\/ */
собственно да, достаточно ввести две escape-последовательности:
\/ и \\
А если при сжатии скриптов оптимизатор выкинет все комментарии? Не годно для production уровня.
Там уже написали, что можно использовать такие /** */ комменты. Их минимизаторы (оптимизаторы?) не выкидывают.
Еще как выкидывают, смотрите «таблетку» ниже:
Если используется Google Closure Compiler, то спасет директива @preserve:
/**
@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() не валидна.
Еще раз, я отвечал на конкретный вопрос:
Регулярки в 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(и доп запрос на сервер слать). Причем тогда мне нужно будет делать перехват вывода. Мне этот метод показался панацеей в моем случае.

Если у него есть проблемы я бы хотел знать о них.
Ну, во-первых, это хак. Изящный и, кстати, давно известный, но всё-таки хак.
И, кстати, помнится, то ли в старом файрфоксе, то ли в старом ИЕ комменты вырезались. На современных браузерах всё работает ок, но нет никакой гарантии, что так будет вечно. В спецификации английским по белому написано, что результат 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 режиме выдаст ошибку.
Видел подобную штуку в марте этого года очень понравилась идея multiline template через комментарии и анонимную функцию. Их реализация мне нравится больше.

Про то термин «heredoc» слышу впервые — спасибо.
Странно, что никто не вспомнил про coffeescript
html = """
       <strong>
         cup of coffeescript
       </strong>
       """
будет оттранслировано в
var html;

html = "<strong>\n  cup of coffeescript\n</strong>";

Это что же, только ради многострочности на кофескрипт переходить?
Sign up to leave a comment.

Articles