Статьи

Переход с Ruby Sass на LibSass

Если вы следили за последними крупными анонсами сообщества 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 и обнаружили другие проблемы или некоторые другие синтаксические изменения или обходные пути, пожалуйста, поделитесь ими в комментариях!