이 블로그 포스트는 Stylelint
의 버전 V14
에 대해 설명하고 있습니다. 만약 Stylelint
의 V15
에 대해 알고 싶은 분들은 다음 블로그 포스트의 링크를 참고해 주시기 바랍니다.
목차
개요
웹 개발을 하면, 웹의 스타일을 관리하기 위해 CSS(Cascading Style Sheets)를 사용하게 됩니다. 이번 블로그 포스트에서는 Stylelint
를 사용하여 CSS, SCSS, CSS-in-JS의 코드 스타일을 검사해 보도록 하겠습니다.
여기서 소개한 소스코드는 아래에 링크를 통해 확인할 수 있습니다.
Node 설치
Stylelint
를 사용하기 위해서는 Node
를 설치할 필요가 있습니다. 각각의 OS에 맞게 Node를 설치합니다.
macOS
Homebrew
는 맥에서 패키지를 설치하고 관리할 수 있는 맥용 패키지 관리자입니다. Homebrew를 통해 맥에 필요한 패키지를 간단하게 설치할 수 있다. 다음 명령어를 실행하여 Homebrew
를 설치합니다.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
설치가 완료되었다면, 다음 명령어를 실행하여 잘 설치되었는지 확인합니다.
brew --version
만약 버전이 표시되지 않는다면, 터미널을 종료하고, 다시 실행시킵니다. 이미 Homebrew가 설치된 분들은 다음 명령어를 실행하여 Node
를 설치합니다.
brew install node
Windows
윈도우에는 Chocolatey
라는 패키지 매니저를 사용합니다. 관리자 권한으로 실행된 명령어 프롬프트
또는 파워쉘
을 열고 다음 명령어를 실행하여 Chocolatey
를 설치합니다.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
설치가 완료되었다면, 다음 명령어를 실행하여, 설치가 잘 되었는지 확인합니다.
choco –version
Chocolatey의 버전이 표시되지 않는다면, 명령어 프롬프트 또는 파워쉘을 종료하고 다시 실행시킵니다. Chocolatey가 설치되었다면, 다음 명령어를 실행하여 Node
를 설치합니다.
choco install -y nodejs.install
CSS를 위한 Stylelint
CSS
파일을 검사하기 위해 Stylelint
를 설치하고 사용하는 방법에 대해서 살펴보도록 하겠습니다.
CSS를 위한 Stylelint의 package.json 생성
Stylelint
는 Node 개발 환경에서 동작합니다. 따라서 노드 패키지를 관리하기 위해 package.json
파일을 생성할 필요가 있습니다. 다음 명령어를 사용하여 package.json
파일을 생성합니다.
npm init
명령어를 실행하면 다음과 같이 여러 질문들이 나옵니다. 특별히 변경하고 싶은 내용이 없다면 모든 질문에 Enter
키를 입력합니다.
package name: (stylelint-example)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
그럼 다음과 같이 package.json
파일이 생성되는 것을 확인할 수 있습니다.
{
"name": "stylelint-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
CSS를 위한 Stylelint 설치
Stylelint
를 사용하여 CSS
를 검사하고 싶으신 분들은 다음 명령어를 사용하여 Stylelint
와 추가로 필요한 라이브러리를 설치합니다.
npm install --save-dev stylelint stylelint-config-standard stylelint-config-prettier
CSS를 위한 Stylelint 설정
이렇게 설치한 Stylelint
를 사용하기 위해 .stylelintrc.json
파일을 생성하고 다음과 같이 수정할 필요가 있습니다.
{
"extends": ["stylelint-config-standard", "stylelint-config-prettier"]
}
CSS를 위한 Stylelint 실행 스크립트
Stylelint
를 사용하여 모든 CSS
파일을 검사하기 위해 package.json
파일을 다음과 같이 수정합니다.
{
...
"scripts": {
"lint:css": "stylelint --ignore-path .gitignore '**/*.css'",
},
...
}
--ignore-path
에 .gitignore
파일을 설정하여 불필요한 파일들을 검사하지 않도록 하였습니다.
CSS를 위한 Stylelint 실행
다음으로 Stylelint
가 잘 실행되는지 확인하기 위해 test.css
파일을 생성하고 다음과 같이 수정합니다.
h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}
그런 다음, 다음 명령어를 실행하여, Stylelint
가 잘 실행되는지 확인해 봅니다.
npm run lint:css
Stylelint
가 잘 설치되고 설정되었다면, 다음과 같은 경고를 확인할 수 있습니다.
test.css
2:3 ✖ Unexpected longhand value '0 0 1rem 0' instead of '0 0 1rem' shorthand-property-no-redundant-values
test.css
파일을 다음과 같이 수정하고, Stylelint
를 실행하면, 문제가 해결되는 것을 확인할 수 있습니다.
h2 {
margin: 0 0 1rem;
font-size: 1.5rem;
}
SCSS를 위한 Stylelint
SCSS
파일을 검사하기 위해 Stylelint
를 설치하고 사용하는 방법에 대해서 살펴보도록 하겠습니다.
SCSS를 위한 Stylelint의 package.json 생성
Stylelint
는 Node 개발 환경에서 동작합니다. 따라서 노드 패키지를 관리하기 위해 package.json
파일을 생성할 필요가 있습니다. 다음 명령어를 사용하여 package.json
파일을 생성합니다.
npm init
명령어를 실행하면 다음과 같이 여러 질문들이 나옵니다. 특별히 변경하고 싶은 내용이 없다면 모든 질문에 Enter
키를 입력합니다.
package name: (stylelint-example)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
그럼 다음과 같이 package.json
파일이 생성되는 것을 확인할 수 있습니다.
{
"name": "stylelint-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
SCSS를 위한 Stylelint 설치
Stylelint
를 사용하여 SCSS
를 검사하고 싶으신 분들은 다음 명령어를 사용하여 Stylelint
와 추가로 필요한 라이브러리를 설치합니다.
npm install --save-dev stylelint stylelint-config-standard-scss stylelint-config-prettier-scss
SCSS를 위한 Stylelint 설정
이렇게 설치한 Stylelint
를 사용하기 위해 .stylelintrc.json
파일을 생성하고 다음과 같이 수정할 필요가 있습니다.
{
"extends": ["stylelint-config-standard-scss", "stylelint-config-prettier-scss"]
}
SCSS를 위한 Stylelint 실행 스크립트
Stylelint
를 사용하여 모든 SCSS
파일을 검사하기 위해 package.json
파일을 다음과 같이 수정합니다.
{
...
"scripts": {
"lint:css": "stylelint --ignore-path .gitignore '**/*.scss'",
},
...
}
--ignore-path
에 .gitignore
파일을 설정하여 불필요한 파일들을 검사하지 않도록 하였습니다.
SCSS를 위한 Stylelint 실행
다음으로 Stylelint
가 잘 실행되는지 확인하기 위해 test.scss
파일을 생성하고 다음과 같이 수정합니다.
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
그런 다음, 다음 명령어를 실행하여, Stylelint
가 잘 실행되는지 확인해 봅니다.
npm run lint:css
Stylelint
가 잘 설치되고 설정되었다면, 다음과 같은 경고를 확인할 수 있습니다.
test.scss
1:14 ✖ Expected "Helvetica" to be "helvetica" value-keyword-case
test.scss
파일을 다음과 같이 수정하고, Stylelint
를 실행하면, 문제가 해결되는 것을 확인할 수 있습니다.
$font-stack: helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
CSS-in-JS를 위한 Stylelint
저는 주로 React
를 사용하여 개발을 하고 있으며 MUI
와 CSS-in-JS
라이브러리인 Emotion
을 사용하여 스타일링을 하고 있습니다.
Stylelint
를 사용하여 CSS-in-JS
의 스타일을 검사하는 방법에 대해서 살펴보도록 하겠습니다.
프로젝트 준비
Stylelint
를 사용하여 CSS-in-JS
의 스타일 검사를 하기 위해 CRA(create-react-app)
를 사용하여 샘플 프로젝트를 생성해 보도록 하겠습니다. CRA
를 설치하거나 CRA
를 사용하여 React 프로젝트를 생성하는 방법에 대한 자세한 내용은 이전 블로그를 참고하시기 바랍니다.
다음 명령어를 사용하여 React 프로젝트를 생성합니다.
npx create-react-app stylelint-example --template typescript
다음 명령어를 사용하여 Emotion
과 MUI
를 설치합니다.
npm install --save @mui/material @emotion/react @emotion/styled
그리고 CSS-in-JS
를 사용하여 스타일링을 하기 위해, ./src/App.tsx
파일을 열고 다음과 같이 수정합니다.
import styled from '@emotion/styled';
const Title = styled.h2`
margin: 0 0 1rem 0;
font-size: 1.5rem;
`;
function App() {
return (
<div>
<Title>Learn React</Title>
</div>
);
}
export default App;
CSS-in-JS를 위한 Stylelint 설치
Stylelint
를 사용하여 CSS-in-JS
를 검사하고 싶으신 분들은 다음 명령어를 사용하여 Stylelint
와 추가로 필요한 라이브러리를 설치합니다.
npm install --save-dev stylelint stylelint-config-standard stylelint-config-prettier postcss postcss-syntax @stylelint/postcss-css-in-js
CSS-in-JS를 위한 Stylelint 설정
이렇게 설치한 Stylelint
를 사용하기 위해 .stylelintrc.json
파일을 생성하고 다음과 같이 수정할 필요가 있습니다.
{
"extends": ["stylelint-config-standard", "stylelint-config-prettier"],
"overrides": [
{
"files": ["**/*.tsx"],
"customSyntax": "@stylelint/postcss-css-in-js"
}
],
"rules": {
"function-no-unknown": [true, { "ignoreFunctions": ["/\\${/"] }]
}
}
CSS-in-JS를 위한 Stylelint 실행 스크립트
Stylelint
를 사용하여 모든 CSS-in-JS
파일을 검사하기 위해 package.json
파일을 다음과 같이 수정합니다.
{
...
"scripts": {
"lint:css": "stylelint --ignore-path .gitignore '**/*.(css|tsx)'"
},
...
}
--ignore-path
에 .gitignore
파일을 설정하여 불필요한 파일들을 검사하지 않도록 하였습니다.
CSS-in-JS를 위한 Stylelint 실행
이제, 다음 명령어를 실행하여, Stylelint
가 잘 실행되는지 확인해 봅니다.
npm run lint:css
Stylelint
가 잘 설치되고 설정되었다면, 다음과 같은 경고를 확인할 수 있습니다.
src/App.css
1:1 ✖ Expected class selector to be kebab-case selector-class-pattern
5:1 ✖ Expected class selector to be kebab-case selector-class-pattern
11:3 ✖ Expected class selector to be kebab-case selector-class-pattern
16:1 ✖ Expected class selector to be kebab-case selector-class-pattern
27:1 ✖ Expected class selector to be kebab-case selector-class-pattern
31:12 ✖ Expected keyframe name to be kebab-case keyframes-name-pattern
35:3 ✖ Expected empty line before rule rule-empty-line-before
src/App.tsx
4:3 ✖ Unexpected longhand value '0 0 1rem 0' instead of '0 0 1rem' shorthand-property-no-redundant-values
src/index.css
3:64 ✖ Unexpected quotes around "Roboto" font-family-name-quotes
3:74 ✖ Unexpected quotes around "Oxygen" font-family-name-quotes
4:6 ✖ Unexpected quotes around "Ubuntu" font-family-name-quotes
4:16 ✖ Unexpected quotes around "Cantarell" font-family-name-quotes
다른 파일들에도 문제가 검출되지만 우리가 수정한 ./src/App.tsx
파일에서 Stylelint
로 CSS
를 검출했을 때와 동일한 에러가 발생하는 것을 확인할 수 있습니다. 이를 통해, 우리가 설정한 내용이 잘 적용되는 것을 확인할 수 있습니다.
./src/App.tsx
파일을 다음과 같이 수정하고, Stylelint
를 실행하면, 해당 파일의 문제가 해결되는 것을 확인할 수 있습니다.
import styled from '@emotion/styled';
const Title = styled.h2`
margin: 0 0 1rem;
font-size: 1.5rem;
`;
function App() {
return (
<div>
<Title>Learn React</Title>
</div>
);
}
export default App;
TypeError: Cannot read properties of undefined (reading ‘stringify’) 에러
최근 Stylelint
의 버전을 14.9.1
에서 14.14.0
으로 올리면서 다음과 같은 에러가 발생하였습니다.
TypeError: Cannot read properties of undefined (reading 'stringify')
at Function.stringify (/node_modules/postcss-syntax/stringify.js:8:38)
at MapGenerator.generate (/node_modules/stylelint/node_modules/postcss/lib/map-generator.js:328:12)
at LazyResult.stringify (/node_modules/stylelint/node_modules/postcss/lib/lazy-result.js:277:20)
at LazyResult.runAsync (/node_modules/stylelint/node_modules/postcss/lib/lazy-result.js:443:17)
at LazyResult.async (/node_modules/stylelint/node_modules/postcss/lib/lazy-result.js:221:30)
at LazyResult.then (/node_modules/stylelint/node_modules/postcss/lib/lazy-result.js:206:17)
이 에러를 수정하기 위해서는 다음 명령어를 실행하여 postcss
을 설치할 필요가 있습니다.
npm install --save-dev postcss
이렇게 postcss
을 설치한 후, Stylelint
를 실행하면 에러가 수정된 것을 확인할 수 있습니다.
완료
이것으로 Stylelint
를 사용하여 CSS/SCSS와 같은 스타일 파일의 내용을 검사하는 방법에 대해서 알아보았습니다. 또한, styled-components
/Emotion
과 같은 CSS-in-JS
스타일도 검사하는 방법에 대해서 살펴보았습니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.