TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

69
Stylelint: Как и зачем линтить CSS Андрей Ситник, Злые марсиане 1

Transcript of TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Page 1: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Stylelint:Как и зачем линтить CSSАндрей Ситник,Злые марсиане

1

Page 2: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

2

Page 3: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Наш опенсорс

3

Page 4: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

История человечества

10К40К250К

4

Page 5: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

5

Page 6: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Неолитическая революция

6

Page 7: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

7

Page 8: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

История линтеров

8

Page 9: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Исходный код

Парсер

Анализ

Списокошибок

Линтер

9

Page 10: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

1978 — первый линтер Lint

10

Page 11: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

1995 — JavaScript

// true

1 == "1"

// забыт var

count = 1

11

Page 12: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

ЛинтерыCoffeeScript или

12

Page 13: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

CoffeeScript :-(

13

Page 14: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Эволюция линтеров

JSLint JSHint ESLint→ →

14

Page 15: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

ESLint: белый список

module.exports = {

'rules': {

'space-before-function-paren': [2],

'no-shadow-restricted-names': [2],

'computed-property-spacing': [2],

'no-empty-character-class': [2],

'no-irregular-whitespace': [2],

'no-unexpected-multiline': [2],

'no-multiple-empty-lines': [2],

'no-constant-condition': [2],

15

Page 16: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

ESLint: модульностьИсходный код

Парсер

Плагин 1

Список ошибок

16

Плагин 2

Page 17: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

ESLint: автоисправление

if(foo) {

bar()}

if (foo) {

bar();

}

eslint --fix *.js

17

Page 18: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Популярные зависимости

1. mocha2. chai3. lodash4. grunt5. gulp6. eslint7. babel-preset-es20158. request9. async

10. shouldИсточник: https://gist.github.com/feross/e0882df2fe673d6ce064

18

Page 19: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

ЛинтерыCSS

19

Page 20: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Поддержка синтаксисов

SCSS

CSSLint

SCSS Lint

CSSComb

CSS Less

20

Page 21: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Функции

Белыйсписок

CSSLint

SCSS Lint

CSSComb

Модульность Исправление

21

Page 22: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Количество правил

CSSLint

SCSS Lint

CSSComb

38

26

62

22

Page 23: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

23

Page 24: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Stylelint

24

Page 25: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Исходный код

Парсер

Плагин 1

Список ошибок

Плагин 2

25

Модульность

Page 26: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

26

Page 27: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Единый фреймворк

Полифилы

Минификация Линтинг

Примеси Изоляция

27

Page 28: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Сменные парсеры

CSS

SCSS Less

SugarSS Битый CSS

28

Page 29: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Правило — плагин PostCSS

const ruleName = "comment-no-empty"

(root, result) => {

root.walkComments(comment => {

if ( comment.text && comment.text.length === 0 ) {

report({ … })

}

}

}

29

Page 30: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Белый список правил

module.exports = {

'rules': {

'at-rule-name-case': 'lower',

'at-rule-semicolon-newline-after': 'always',

'block-closing-brace-newline-after': 'always',

'color-hex-case': 'lower',

'color-hex-length': 'short',

'color-hex-length': 'short',

'color-no-invalid-hex': true,

'indentation': 2,

30

Page 31: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Исправление

.foo {

color:black}

.foo {

color:black;

}

stylefmt *.css

31

Page 32: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

postcss-browser-reporter

32

Page 33: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

SCSS

CSSLint

SCSS Lint

CSSComb

CSS Less

Stylelint

33

Page 34: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Белыйсписок

CSSLint

SCSS Lint

CSSComb

Модульность Исправление

Stylelint

34

Page 35: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

CSSLint

SCSS Lint

CSSComb

38

26

62

Stylelint 168

Легко писать новые правила

35

Page 36: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Пользователи Stylelint

36

Page 37: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Популярность

37

Page 38: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Зачем линтить

38

Page 39: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Cеньор

39

Юниор

Код-ревью

Page 40: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

40

CеньорЮниор

1. Автоматическое код-ревью

Stylelint

Page 41: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

«Я понимаю,что ты думаешь …,

но …»

41

Page 42: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

2. Критика роботов приятнее

42

Page 43: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

3. Обмен практиками

module.exports = {

'extend': 'stylelint-config-wordpress'

}

43

Page 44: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

4. Поиск ошибок

'color-no-invalid-hex',

'function-linear-gradient-no-nonstandard-direction',

'time-no-imperceptible',

'property-no-unknown',

'property-no-vendor-prefix',

'declaration-block-no-duplicate-properties',

'declaration-block-no-ignored-properties',

'declaration-block-no-shorthand-property-overrides',

'selector-class-pattern',

'selector-max-compound-selectors',

'selector-pseudo-element-no-unknown',

'selector-type-no-unknown',

'media-feature-no-missing-punctuation',

'no-unsupported-browser-features',

'no-unknown-animations',

'no-indistinguishable-colors',

'no-descending-specificity',

'no-browser-hacks'

44

Page 45: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

no-descending-speci�city

#container .foo {

top: 10px;

}

.foo {

/* Expected selector .foo come before #container .foo */

top: 0;

}

45

Page 46: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

no-unsupported-browser-features

.foo {

opacity: 1;

/* Features like this, which is unsupported in IE 8 */

}

46

Page 47: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

declaration-block-no-ignored-properties

.foo {

display: inline;

width: 100px;

/* Unexpected width with display: inline */

}

47

Page 48: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

declaration-block-no-shorthand-property-overrides

.foo {

margin-top: 10px;

margin: 0 auto;

/* Unexpected shorthand margin after margin-top */

}

48

Page 49: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

no-indistinguishable-colors

.foo {

color: black;

}

.bar {

background: #010101;

/* Unexpected indistinguishable colors #010101 and black */

}

49

Page 50: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Как линтить

50

Page 51: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

1. Линтер в текстовом редакторе

51

Page 52: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

2. lint-staged — перед коммитом

"scripts": {

"lint-staged": "lint-staged",

},

"lint-staged": {

"*.css": "stylelint"

},

"pre-commit": ["lint-staged"]

52

Page 53: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

3. Линтер в CI

53

Page 54: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

4. Начните с популярного

module.exports = {

'extend': 'stylelint-config-standard'

}

54

Page 55: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

55

Page 56: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

5. Добавляйте плагины

module.exports = {

'plugins': [

'stylelint-scss'

],

'rules': {

'scss/selector-no-redundant-nesting-selector': true

}

}

56

Page 57: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

dustinspecker/awesome-eslint

57

Page 58: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

6. Линтер — стайл-гайд

«В стайл-гайде не должнобыть правил, которые

нельзя описать валгоритме»

58

Page 59: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

7. Делайте исключения

.foo.is-started {

/* stylelint-disable no-unknown-animations */

/* Animation will be generated in JS*/

animation-name: js-generated-path;

}

59

Page 60: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

stylelint-disable-reason

.foo.is-started {

/* stylelint-disable no-unknown-animations */

animation-name: js-generated-path;

/* Expected comment reason after `stylelint-disable` comment */

}

60

Page 61: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

8. Пишите свои правила

import { utils } from "stylelint"

export const ruleName = namespace("ИМЯ")

export const messages = utils.ruleMessages(ruleName, {

expected: "ТЕКСТ ОШИБКИ",

})

export default function () {

return (root, result) => {

/* ЛОГИКА */

}

}

61

Page 62: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Повторы цветов — в переменные

colors = { }

return (root, result) => {

root.walkDecls(decl => {

decl.value.match(/#[0-9a-f]{3,6}/, color => {

if ( colors[color] ) {

utils.report({ … })

} else {

colors[color] = true

}

})

})

}

62

Page 63: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Правила Фейсбука

slow-css-properties

filters-with-svg-files

use-variables

mobile-flexbox

63

Page 64: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

9. Ошибка 2 раза — в правило

64

Page 65: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

10. Линтите всё

gulp.task('default', ['lint',

'test',

'all-translated',

'spell-check',

'security-audit',

'file-size'])

65

Page 66: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

postcss-sorting

div {

-moz-box-sizing: border-box;

width: 100%;

box-sizing: border-box;

position: absolute;

-webkit-box-sizing: border-box;

}

div {

position: absolute;

-webkit-box-sizing: border-box;

-moz-box-sizing: border-box;

box-sizing: border-box;

width: 100%;

}

66

Page 67: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

yaspeller

$ yaspeller /home/ai/Dev/postcss/README.md

✗ /home/ai/Dev/postcss/README.md 453 ms

-----

Typos: 1

1. transorming (suggest: transforming, transporting)

-----

67

Page 68: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Node Security Platform

> nsp check

(+) 1 vulnerabilities found

┌───────────────┬───────────────────────────────────────────────────────┐

│ │ ReDoS via long string of semicolons │

├───────────────┼───────────────────────────────────────────────────────┤

│ Name │ tough-cookie │

├───────────────┼───────────────────────────────────────────────────────┤

│ Installed │ 2.2.2 │

├───────────────┼───────────────────────────────────────────────────────┤

│ Vulnerable │ >=0.9.7 <=2.2.2 │

├───────────────┼───────────────────────────────────────────────────────┤

│ Patched │ >=2.3.0 │

├───────────────┼───────────────────────────────────────────────────────┤

│ Path │ my-test-project@undefined > [email protected] > requ… │

├───────────────┼───────────────────────────────────────────────────────┤

│ More Info │ https://nodesecurity.io/advisories/130 │

└───────────────┴───────────────────────────────────────────────────────┘

68

Page 69: TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.

Ссылки

stylelint.io

@stylelint

@postcss

evl.ms/chronicles69