Можно ли оставить комментарий внутри шаблона-шаблона es6?

Скажем, у нас есть многострочный шаблон шаблона es6 для описания, например. некоторые параметры URL для запроса:

const fields = `
    id,
    message,
    created_time,
    permalink_url,
    type
`;

Есть ли способ иметь комментарии внутри этого шаблона Template-String? Как:

const fields = `
    // post id
    id,
    // post status/message
    message,
    // .....
    created_time,
    permalink_url,
    type
`;

Ответ 1

Нет.

Этот синтаксис действителен, но просто вернет строку, содержащую \n// post id\nid, вместо удаления комментариев и создания строки без них.

Если вы посмотрите на §11.8.6 спецификации, вы увидите, что единственным маркером, распознанным между разделителями обратного отсчета, является TemplateCharacters, который принимает escape-последовательности, разрывы строк и обычные символы. В §A.1, SourceCharacter определяется как любая точка Unicode (кроме тех, которые исключены в 11.8.6).

Ответ 2

Вариант 1: интерполяция

Мы можем создать блоки интерполяции, которые возвращают пустую строку, и встроить в них комментарии.

const fields = '
  id, ${ /* post id */'' }
  message, ${ /* post status/message */'' }
  created_time,
  permalink_url,
  type
';

console.log(fields);

Ответ 3

Я знаю, что это старый ответ, но, видя ответы выше, я чувствую себя обязанным ответить и на чистый вопрос, а затем ответить на вопрос духа задающего.

Можете ли вы использовать комментарии в шаблонных литеральных строках?

Да. Да, ты можешь. Но это не красиво.

const fields = '
    id, ${/* post ID */''}
    message, ${/* post/status message */''}
    created_time, ${/*... */''}
    permalink_url,
    type
';

Обратите внимание, что вы должны поместить '' (пустую строку) в фигурные скобки ${ }, чтобы в Javascript было выражение для вставки. Невыполнение этого приведет к ошибке во время выполнения. Кавычки могут находиться вне комментария.

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

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

Строка в примере выше будет немного странной и потенциально бесполезной для того, что вы ищете, однако, будет начальный разрыв строки, дополнительный пробел между запятой и комментарием, а также дополнительный финал Разрыв строки. Удаление этого ненужного места может быть небольшим ударом по производительности. Вы можете использовать регулярные выражения для этого, для скорости и эффективности, хотя... об этом ниже...

.

Теперь, чтобы ответить на вопрос:

Как написать строку списка, разделенную запятыми, с комментариями к каждой строке?

const fields = [
    "id", // post ID
    "message", // post/status message
    "created_time", //...
    "permalink_url",
    "type"
].join(",\n");

Присоединение к массиву - это один из способов... (как предложено @jared-smith)

Однако в этом случае вы создаете массив, а затем сразу отбрасываете организованные данные, когда вы только назначаете возвращаемое значение функции join(). Кроме того, вы создаете указатель памяти для каждой строки в массиве, который не будет собирать мусор до конца области видимости. В этом случае может оказаться более полезным захватить массив, присоединяясь на лету, как того требует использование, или использовать литерал шаблона и по-разному комментировать вашу реализацию, например, стиль ghostDoc.

Кажется, вы используете литералы шаблонов только для того, чтобы удовлетворить желание не иметь кавычек в каждой строке, сводя к минимуму когнитивный диссонанс между параметрами запроса 'string', когда они выглядят в url и коде. Вы должны знать, что это сохраняет разрывы строк, и я сомневаюсь, что вы этого хотите. Рассмотрим вместо этого:

/****************
 * Fields:
 *   id : post ID
 *   message : post/status message
 *   created_time : some other comment...
 */
const fields = '
    id,
    message,
    created_time,
    permalink_uri,
    type
'.replace(/\s/g,'');

Использует регулярное выражение для фильтрации всего пробела, сохраняя список читаемым и переставляемым. Все, что делает литерал регулярного выражения, захватывает пробел, а затем метод замены заменяет захваченный текст на '' (g в конце просто говорит регулярному выражению не останавливаться при первом найденном совпадении, в данном случае, первый символ новой строки.)

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

const fields = '
    id, // post ID
    message, // post/status message
    created_time, // ...
    permalink_uri,
    type
'.replace(/\s+\/\/.*\*\/\n/g,'').replace(/\s/g,'');

Это первое регулярное выражение найдет и заменит пустой строкой ('') все экземпляры: один или несколько пробельных символов, которые предшествуют двойной косой черте (каждая косая черта экранируется обратной косой чертой), за которой следуют пробельные символы и символ новой строки, Если вы хотите использовать комментарии /* multiline */, это регулярное выражение становится немного более сложным, вам нужно добавить еще один .replace() в конце:

.replace(/\/\*.*\*\//g,'')

Это регулярное выражение может появиться только после того, как вы удалите новые строки \n, иначе регулярное выражение не будет соответствовать комментарию, который теперь не является многострочным. Это будет выглядеть примерно так:

const fields = '
    id, // post ID
    message, /* post/
                status message */
    created_time, // ...
    permalink_uri,
    type
'.replace(/\s+\/\/.*\n/g,'').replace(/\s/g,'').replace(/\/\*.*\*\//g,'');

Все вышеперечисленное приведет к этой строке:

"id,message,created_time,permalink_uri,type"

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

Я постараюсь поднять https://jsperf.com/ позже. Мне сейчас очень любопытно!

Ответ 4

Просто не используйте строки шаблонов:

const fields = [
    'id',  // comment blah blah
    'message',
    'created_time',
    'permalink_url',
    'type'
].join(',');

Вы платите стоимость вызова массива и метода при инициализации (если JIT недостаточно умен, чтобы полностью оптимизировать его.

Как указано ssube, результирующая строка не сохранит разрывы строк или пробелы. Это зависит от того, насколько это важно, вы можете вручную добавить '' и '\n', если это необходимо, или решить, что вам действительно не нужны встроенные комментарии, которые плохо.

UPDATE

Обратите внимание, что сохранение программных данных в строках обычно считается плохая идея: вместо этого сохраните их как именованные vars или свойства объекта. Поскольку ваш комментарий отражает ваше простое преобразование кучки вещей в строка запроса url:

const makeQueryString = (url, data) => {
  return url + '?' + Object.keys(data)
    .map(k => `${k}=${encodeURIComponent(data[k))})
    .join('&');
};

let qs = makeQueryString(url, {
  id: 3,
  message: 'blah blah',
  // etc.
});

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