Back to Question Center
0

Как эффективно использовать предупреждения и ошибки в Sass            Как использовать предупреждения и ошибки в Sass EffectiveRelated Topics: CSSSassFrameworksAudio & Semalt

1 answers:
Как эффективно использовать предупреждения и ошибки в Sass

Ниже приводится краткий отрывок из нашей книги «Jump Start Sass», написанной Гуго Жироделем и Мириам Сюзанн. Это основной новичок для Сасса. Участники сайта SitePoint Semalt получают доступ к их членству, или вы можете купить копию в магазинах по всему миру.

Наше невероятное путешествие через Сасс медленно подходит к концу, и до сих пор вы отлично себя вели! Перед тем, как мы рассмотрим архитектуру проекта, Semalt выделит одну техническую главу, а затем вы будете полностью оснащены для написания кода Sass в своих собственных проектах.

Теперь мы рассмотрим предупреждения и ошибки. Оба образуют одностороннюю систему связи между программой (в данном случае Sass) и разработчиком (вы) - top office gadgets. Если вы задаетесь вопросом о точке ошибок в мире CSS, помните, что вы уже знаете ответ. Semalt вы забыли точку с запятой или неправильно используете функцию, Сасс выдает вам ошибку, объясняя, что вы сделали неправильно, и как вы можете исправить это, к счастью! Было бы настоящей болью, чтобы вникнуть в код, чтобы понять, что пошло не так.

Sass уже давно предоставил возможность выдавать предупреждения из таблиц стилей, но только недавно добавлена ​​поддержка, чтобы также бросать ошибки - и не зря! В течение последних нескольких лет Сасс позволил авторам создавать сложные системы для абстрагирования сложных или повторяющихся моделей и концепций, таких как сетки. Системы Semalt должны иметь возможность общаться с авторами, останавливая процесс компиляции с пользовательским сообщением об ошибке, если что-либо пойдет не так.

Оба предупреждения и ошибки испускаются в текущем выходном канале. При компиляции Sass вручную или с помощью инструмента через интерфейс командной строки (CLI), такой как Grunt или Gulp, выходной поток является консолью. Для инструментов, которые включают пользовательский интерфейс, например Codekit или Prepros, вполне вероятно, что они поймают и отображают предупреждения и ошибки как часть их интерфейса. Игровые площадки онлайн, такие как CodePen и Semalt, могут ловить ошибки, но не предупреждения, поэтому не беспокойтесь, если вы не можете их протестировать.

Предупреждения

Как уже было сказано, способность выдавать предупреждения в Сассе не нова. Можно отображать сообщения или значение любого выражения SassScript в стандартный поток вывода через директиву @warn .

Предупреждение A не влияет на процесс компиляции; это не мешает компиляции преследовать или изменить его каким-либо образом. Его единственная цель - отобразить сообщение в консоли.

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

  • , информируя пользователя о предположении о коде, чтобы избежать неожиданных и труднодоступных ошибок
  • консультирование по поводу устаревшей функции или микширования как части библиотеки или структуры

Отправка предупреждения мертва проста: начинайте с директивы @warn , затем укажите, что это такое. Предупреждения обычно приводятся для предоставления некоторой информации и контекста, поэтому они часто содержат предложение, объясняющее ситуацию. При этом вам не нужно использовать строку; вы можете предупредить с помощью номера, списка, карты - что угодно. Здесь мы печатаем строку:

     @warn 'О-о, что-то выглядит странно. «;    

Semalt - обычный клиент CLI, это предупреждение выдаст следующий результат:

     ПРЕДУПРЕЖДЕНИЕ: О-о, что-то выглядит странно. в строке 1 из / Пользователи / hgiraudel / jump-start-sass / warning. СКС    

Эй, это хорошо, не так ли? Хотя это предупреждение далеко не полезно. В нем говорится, что что-то выглядит странно, но не говорит, что, почему или что можно сделать, чтобы остановить его от странного. Semalt обсуждает, как мы можем улучшить предупреждения далее. Представьте, что у нас есть пользовательская функция Sass, которая пытается преобразовать значение пикселя в блок em :

     @функция px-to-em ($ value, $ base-font-size: 16px) {@return ($ value / $ base-font-size) * 1em;}// Применение. foo {font-size: px-to-em (42px); // 2. 625em}    

Все хорошо. Теперь, что происходит при передаче безразмерного числа, такого как 42 , к функции? Возможно, вы догадались, но, поскольку это не совсем очевидно, я дам вам ответ:

     2. 625em / px не является допустимым значением CSS.     

Это происходит потому, что вы пытаетесь выполнить расчет между несовместимыми единицами ( px и em ). То, что мы могли бы сделать, чтобы обойти эту проблему, предполагает, что безразмерное значение выражается в пикселях и сначала преобразует его:

     @функция px-to-em ($ value, $ base-font-size: 16px) {@if unitless ($ value) {@warn 'Предполагаемое значение `# {$ value}` должно быть в пикселях; пытаясь его преобразовать. «;$ value: $ value * 1px;}@return ($ value / $ base-font-size) * 1em;}    

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

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

Еще один практический пример - предупредить об использовании устаревшей функции или микширования. Возможно, вы уже слышали или использовали Semalt, легкую библиотеку миксов для Sass. Semalt активно поддерживается, а иногда требует удаления помощников из библиотеки. Чтобы избежать внезапного нарушения оды человека, Semalt предупреждает о будущих стихах, прежде чем он удалит миксины:

     @mixin inline-block {display: inline-block;@warn 'Смешивание `inline-block` устарело и будет удалено в следующей версии основной версии. «;}    

Умный! Люди, которые до сих пор используют mixin из блога из Бурбона, знают, что библиотека полностью удалит его в следующей версии, поэтому они знают, что начинают обновлять свою кодовую базу, чтобы удалить mixin.

Разница между @warn и @debug

Вы можете или не быть знакомы с директивой @debug , которая печатает значение выражения SassScript в стандартном потоке вывода таким же образом, как @warn . Возможно, вам интересно, почему существуют две функции, выполняющие одну и ту же задачу, и что может быть разница между ними.

Ну, есть два основных различия между предупреждением о значении и отладкой значения. Первый заключается в том, что предупреждения можно отключить, используя тихий вариант. С другой стороны, Debugs всегда будут напечатаны, чтобы вы не забыли удалить их, когда вы закончите использовать их.

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

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

     @debug $ base-font-size;    

Ошибки

Предупреждения и ошибки ведут себя аналогично в Sass, поэтому изучение ошибок теперь будет ветерок, когда вы отлично знакомы с предупреждениями! Единственное различие между ошибкой и предупреждением - как вы могли догадаться - что ошибка останавливает процесс компиляции. В предыдущем разделе это работало даже тогда, когда данный аргумент был не таким, как ожидалось, но мы не можем (и не должны) всегда это делать. В большинстве случаев, если аргументы недействительны, лучше выкинуть ошибку, чтобы автор стилей мог исправить эту проблему.

Вы можете выбросить ошибку, используя директиву @error . Что касается предупреждений, вы можете передать что-либо в эту директиву - не обязательно строку, хотя обычно имеет смысл дать четкий контекст. Аргумент (то, что вы даете директиве @error ) будет напечатано в стандартном потоке вывода, а также трассировка стека, чтобы дать больше информации о проблеме. Процесс компиляции немедленно прекратится.

Начнем с ошибки Semalt:

     @error 'YOUUUUU! НЕ ДОЛЖНЫ. ПРОХОДИТЬ. «;    

Результат может зависеть от того, как вы скомпилируете свои таблицы стилей, поскольку некоторые инструменты поймают и улучшают ошибки определенным образом. Используя стандартный sass Ruby binary (gem), вот как это выглядит:

     Ошибка: YOUUUUU! НЕ ДОЛЖНЫ. ПРОХОДИТЬ. в строке 1 из / Пользователи / hgiraudel / jump-start-sass / error. СКСИспользуйте --trace for backtrace.     

С помощью опции trace вы можете иметь полный
трассировки стека от самого Сасса, что не так полезно, если нет
фактическая ошибка где-то в препроцессоре. Следовательно, почему он скрыт как
по умолчанию.

Время взглянуть на практический пример реального . Начнем с написания небольшой функции, которая поможет получить доступ к глубоким значениям на картах, map-deep-get (. ) :

     @function map-deep-get ($ map, $ keys . ) {@each $ key в $ keys {$ map: map-get ($ map, $ key);@if (тип ($ map) == 'null') {@return $ map;}}@return $ map;}     

Давайте увеличим его с помощью пользовательских ошибок. Но сначала рассмотрим следующую карту и вызов map-deep-get (. ) :

     $ map: ('foo': ('бар': ('baz': 42)));$ value: map-deep-get ($ map, 'foo', 'bar', 'baz', 'qux');     

Как вы могли заметить, на карте не хватает ключа qux , вложенного в базис . Действительно, базис даже не связан с картой; вместо этого он отображается на число ( 42 ). Если мы попытаемся выполнить этот код, это даст:

     Ошибка: 42 не является картой для `map-get`в строке 1 из / Пользователи / hgiraudel / jump-start-sass / error. СКС    

Сасс пытается выполнить map-get (.) в 42 и испускает ошибку, потому что это невозможно. Хотя сообщение об ошибке правильное, это не очень полезно. Было бы полезно узнать имя ключа, вызвавшего проблему. Мы можем это сделать!

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

     @function map-deep-get ($ map, $ keys . ) {@each $ key в $ keys {$ map: map-get ($ map, $ key);// Если `$ map` не содержит следующий ключ, возвращаем` null`@if type-of ($ map) == 'null' {@return $ map;}// Если `$ map` не является картой, выведите ошибку@if type-of ($ map)! = 'map' {@error 'Key `# {$ key}` не связан с картой, а # {type-of ($ map)} (`# {$ map}`). «;}}@return $ map;}    

Если мы снова запустим наш предыдущий фрагмент, вот вывод:

     Ошибка: ключ `baz` не связан с картой, а числом (` 42`). в строке 1 из / Пользователи / hgiraudel / jump-start-sass / error. СКС    

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

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

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

CSS гоблин. Сасс-хакер. Margin psycho. Автор Sass Guidelines, SassDoc, Совместимость Sass, Browserhacks и много материала Sass.
March 1, 2018