Если вы следили за последними крупными анонсами сообщества Sass, возможно, вы видели огромное объявление LibSass 3.0 на SassConf 2014.
В течение некоторого времени драгоценный камень Sass Ruby получает более продвинутые функции, в то время как LibSass обновлялся не так быстро. Это означает, что многие люди, использующие LibSass для компиляции своего Sass (обычно через node-sass в рабочем процессе Grunt / Gulp), не смогли использовать передовые инструменты Sass, подобные тем, о которых вы читаете здесь, в SitePoint.
Большой анонс состоит в том, что Ruby Sass теперь будет ожидать согласования функций с LibSass , а затем будет поддерживать их на той же скорости, насколько это возможно. LibSass 3.0 уже выпущен, и вы можете интегрировать его в свои бегунки задач с самой последней версией node-sass .
Однако что делает LibSass таким важным? Самое большое преимущество над Ruby Sass в том, что он быстрее — намного быстрее . Если более быстрое время компиляции звучит для вас хорошо, вот хорошее введение в установку LibSass .
В этой статье я буду очень практичен: я поделюсь всеми «хитростями», которые я обнаружил, когда пытался скомпилировать свою библиотеку миксина с LibSass. Хотя LibSass 3.0 близка к Ruby Sass 3.4.6, есть несколько вещей, которые не работают одинаково. Вы можете не сталкиваться со всем этим в своем Sass, но если вы столкнетесь с этими небольшими ошибками, я надеюсь, что этот список поможет вам устранить их.
Примечание: в этой статье «Ruby Sass» всегда относится к 3.4.6, а «LibSass» всегда относится к 3.0.1, если не указано иное.
  Не проверяйте @if not ... 
  В Ruby Sass @if not not index($list, $value) {}  Я использовал это условие в своих проектах Ruby Sass, так как Хьюго предложил, чтобы оно заставило условие оценить истинное логическое значение. 
  Однако в LibSass not  В LibSass вы можете обойти эту проблему, используя одно из следующих: 
 @if index($list, $value) { ... }
@if index($list, $value) != null { ... }
@if index($list, $value) > 0 { ... }
Проверьте это в этой сути Засмейстера .
Следите за своим математическим синтаксисом.
Ruby Sass позволит вам получить следующее:
 $map: (value: 1200px);
.container {
    max-width: map-get($map,value)-1;
}
// Ruby output: 1199px
// LibSass output: 1200px -1
Однако LibSass ожидает, что вы поставите пробел до и после символа минус:
 $map: (value: 1200px);
.container {
    max-width: map-get($map,value) - 1;
}
//output
.container {
  max-width: 1199px; }
Проверьте это в этой сути Засмейстера .
  @error 
  В Ruby Sass @error  Это также позволяет вам интерполировать переменные в полезное сообщение об ошибке. 
  Однако в LibSass строка @error  Поскольку он просто печатается для вывода, он не будет интерполировать переменные, если они находятся внутри кавычек.  Я полагаю, что вы все еще можете использовать директиву @error  Если это так, вы можете обойти проблему интерполяции переменных с конкатенацией строк: 
 $error-text: 'error text';
.at-error {
  color: blue;
  @error 'Error: #{$error-text}.'
  @error 'Error: ' + $error-text + '.';
}
//output:
.at-error {
  color: blue;
  @error 'Error: #{$error-text}.';
  @error 'Error: error text.'; }
Посмотрите на это в действии в этом Сассмейстере .
  ( @warn 
Аккуратные сетки работают; Сьюзи еще не работает.
Не так давно я писал о переходе с Neat на Susy для Sass Grids . Однако, если вы используете LibSass, я призываю вас удержать этот переключатель. Сьюзи еще не работает на LibSass. Однако, несмотря на то, что Susy не работает как есть, вы можете создать свою собственную сеточную систему, используя Su .
Neat , с другой стороны, просто использует переменные для свойств конфигурации: сейчас он отлично работает на LibSass. Посмотрите, как Neat работает на LibSass в этой истории Сассмейстера .
  Функции selector-*()& 
  Если вы один из тех редких людей, которые нашли хороший вариант использования новых selector-  У меня нет обходного пути, чтобы предложить это, кроме как «пересмотреть свою стратегию вложения» (что, вероятно, полностью исключило бы необходимость интерполяции селектора). 
  Директива @at-root 
  Ruby Sass позволяет вам использовать @at-root  Однако LibSass обрабатывает @at-root 
 .at-root-test {
  content: 'parent';
  .nest {
    content: 'child';
    @at-root .selector {
      content: "not nested";
    }
  }
}
//output
.at-root-test {
  content: 'parent'; }
  .at-root-test .nest {
    content: 'child';
    @at-root .selector {
      content: "not nested"; }
 }
Опять же, обходной путь для этого заключается в рефакторинге вашего вложения. Проверьте это в этой сути Засмейстера .
Карты
  Поддержка карт — одна из самых больших функций, добавленных в LibSass 3. Обычные функции карт работают так, как вы ожидаете.  В LibSass 3 вы можете использовать map-keys()map-values()map-has-keys()map-get()map-merge() . 
Карты, как вы уже собрали, в основном находятся на одном уровне между Libsass 3 и Ruby Sass. Наслаждайтесь их использованием!
простираться
  Еще одно важное дополнение к LibSass 3 — поддержка @extend  Я не знаю каких-либо различий между Ruby Sass и LibSass по этому вопросу, но это достаточно существенное обновление, которое стоит упомянуть здесь. 
  Вы можете видеть, как @extend . 
Вывод
Повышение скорости, которое вы получите от перехода на LibSass, огромно. Тем не менее, есть еще несколько областей, в которых функции LibSass не соответствуют функциональности Ruby Sass 3.4+. Если ваша библиотека миксинов зависит от этих специфических функций, пока отложите обновление.
Если вы перешли на LibSass и обнаружили другие проблемы или некоторые другие синтаксические изменения или обходные пути, пожалуйста, поделитесь ими в комментариях!