Обзор возможностей

Одной из самых интересных особенностей препроцессора Less является то, что его создатели предусмотрели возможность исполнения JavaScript-кода в less-файлах. Казалось бы, это весомое преимущество и полная свобода действий, но не всё так просто.

Во-первых, JavaScript-код может быть лишь частью операции присвоения (переменные, свойства). Это означает, что введённая строка, содержащая JavaScript-код, будет интерпретироваться компилятором и обрабатываться.

Во-вторых, компилятор накладывает сразу несколько ограничений:

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

Отсюда следует самое главное ограничение — результатом интерпретации выражения всегда будет строка.

Это очень сильно ограничивает возможность использования столь диковинной для CSS-препроцессора функции.

Так как же намекнуть компилятору о том, что перед ним не просто строка, содержащая JavaScript-код, а строка, которую следует интерпретировать? — очень просто:

@js: `выражение`;

Иногда может понадобиться избавиться от обрамляющих кавычек. Для этого применяется ранее рассмотренная тильда (~), позволяющая экранировать содержимое строки:

@js: ~`выражение`;

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

Замечание

Не используйте точку с запятой перед закрывающим апострофом. В противном случае вы получите ошибку интерпретации.

Простейшие выражения

Простейшими, интерпретируемыми выражениями могут быть любые инструкции. Ниже я предлагаю рассмотреть некоторые из возможных JavaScript-инструкций, которые вы можете использовать в компиляторе Less.

Для начала компилятор может просто вернуть число или, допустим, массив:

.test-js {
  content: `1`;
  content: `[1, 2, 3]`;
}

// После компиляции
.test-js {
  content: 1;
  content: 1, 2, 3;
}

Заметьте, что массив был возвращён как строка, о чём и говорилось в самом начале.

Теперь посмотрим на то, что компилятор умеет складывать числа и даже считать математические функции:

.test-js {
  content: `1 + 6 + Math.cos(1)`;
}

// После компиляции
.test-js {
  content: 7.54030231;
}

Помимо каких-либо арифметических операций можно обращаться к методам Node.js, если вы компилируете код под этой платформой:

.test-js {
  content: `process.platform`;
}

Так как моей основной платформой пока ещё является Windows, то результат можно легко предугадать:

.test-js {
  content: "win32";
}

Однако, никто не запрещает использовать JavaScript на полную в разумных пределах. В следующем примере выводится информация об используемой памяти процессом Node.js в байтах:

.test-js {
  content: `JSON.stringify(process.memoryUsage())`;
}

// Компилируется в
.test-js {
  content: "{"rss":23982080,"heapTotal":15454976,"heapUsed":8824096}";
}

Для особых ценителей уточню, что использовать require() здесь нельзя, поэтому поднять веб-сервер в less-файле нельзя. Зато можно писать функции:

.test-js {
  content: `(function() {
    var a = 2;
    var b = Math.pow(a, 4);

    return a + b;
  })()`;
}

Результатом работы этого выражения будет число 18 (a = 2, b = 16), как несложно догадаться, преобразованное к строке:

.test-js {
  content: 18;
}

results matching ""

    No results matching ""