컴포넌트와
모듈과
스타일시트
많은 곳에서 사용되는 코드는
누구나 쉽게 고칠 수 있어야 한다고 생각합니다
고치기 어려운 코드?
- 그 코드가 하는 일의 종류가 다양하거나
- 그 코드의 복잡한 내부구조를 이해해야 하거나
- 그 코드를 고쳤더니 다른곳에서 문제가 발생하거나
- 다른 이유도 많이 있겠죠.
그 코드가 사람의 직관대로 작동하지 않는다던지?
예: php, javascript 등으로 작성된 모든 코드
하는 일의 종류가 너무 다양하면
한가지 일만 담당하도록 코드를 쪼개면 됩니다
복잡한 내부구조를 알아야하면
추상화 수준을 쌓아올리면 됩니다
코드를 고쳤을 때
다른 곳에서 문제가 발생하지 않도록 하려면
캡슐화를 하면 됩니다
캡슐화
내부 구현디테일을
외부에서 알 수 없도록 하는 것
내부 구조가 바뀌어도
가져다 사용하는 곳에서는
아무것도 바꿀 필요가 없습니다
내부 구현디테일을 외부에서 알 수 없다면?
(바꿔 말하면)
많은 곳에서 사용되고 있었어도
모든 곳을 일일이 고치지 않으면서
내부 구조를 바꿀 수가 있습니다
깔끔하게 캡슐화된 코드는
인터페이스가 그 자체로 문서의 역할도 합니다
UI 컴포넌트
UI가 캡슐화된 단위
컴포넌트로 만들만한 녀석들:
- button
- toggle
- table
- ...etc
컴포넌트화되지 않은 토글 예시
// toggle을 사용하고싶은 곳에서
<div>
<span class="toggle-wrapper">
<input class="toggle" id="toggle" type="checkbox" checked>
<label class="toggle-inner" for="toggle">
<span class="toggle-text"></span>
</label>
</span>
</div>
// ^ 위와 같은 마크업 구조를 일일이 작성함
// 후에 디자인 변경등의 이슈로 마크업이 바뀌어야 할 때
// toggle을 사용하는 모든 코드가 같이 수정되어야 함
리액트 컴포넌트 예시
// toggle을 사용하고싶은 곳에서
render() {
return <div>
//v v v v v v v v v v v v v v
<Toggle checked={true}/>;
//^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
</div>;
}
// Toggle 내부가 바뀌어도 이 코드는 고칠 필요가 없음
// 게다가 코드가 단순해졌습니다.
// 이 코드가 본래 하고자하는 것에 집중할 수가 있습니다.
// -> 고치는게 쉬워졌습니다.
두부를 리액트 컴포넌트 라이브러리로
만들자는 이야기는
이미 저번에 얘기했죠
제낄게요
모듈
독립적인 기능으로 쪼개진 단위
스타일시트에서 모듈로 만들만한 녀석들:
- color scheme
- grid system
- icons
- ...etc
독립적?
그 자체로 가져다 쓰일 수 있어야 합니다
예를 들자면 mo의 `_colors.scss`는 독립적인 모듈입니다
// 예시) dodo-landing/landing/static/css
// /campaign/paper_coupon.scss 에서 따옴
@import '../../_sass/mo/_colors.scss';
// _colors.scss 하나만 import 하면
$image-path: '/static/images/campaign/';
$background-size-path: '/bower_components/background-size-polyfill/backgroundsize.min.htc';
body.paper-coupon {
.section-cover {
...blabla
// 별 부작용 없이 바로 변수를 가져다 쓸 수 있습니다.
background-color: $grey-3;
}
...blabla
독립적이면 좋은 것
전역변수를 사용하지 않기 때문에
어떤 변수가 어떤 곳에 정의돼있는지
코드를 처음 보는 사람이 쉽게 찾아갈 수 있습니다
왜 쪼개는가
- 의도하지 않은 부수효과를 피할 수 있습니다
- 코드베이스에 익숙하지 않은 사람이
고쳐야할 지점을 쉽게 찾아갈 수 있습니다 - 쪼개진 코드에만 집중할 수 있습니다
쪼개져있으면 사용하는 쪽에서...
의도하지 않은 부수효과?
- scss 에 선언된 변수나 믹스인만 얻고 싶은데
css 셀렉터와 스타일까지 같이 import되면
의도하지 않은 스타일이 dom에 적용됩니다
- import한 scss 파일에 너무 많은 변수가 선언되어있으면
작성중이던 스타일시트와
겹치는 변수명이 생길 가능성이 높아집니다
그런 일이 언제 생기는가
css 파일을 나눠서 컴파일하면 항상 생깁니다
- 랜딩페이지의 종이쿠폰 캠페인 페이지는
메인의 css를 가져다 사용하는데 전용 css파일도 따로 씁니다 - 통합약관페이지는 layout과 content css를 나눠서 사용합니다
예상 문제 시나리오
- `hello.html`에서
- `<link rel="stylesheet" type="text/css" href="a.css">`
- `<link rel="stylesheet" type="text/css" href="b.css">`
- `a.css`에서
- 두부 import
- 스타일 오버라이드
- `b.css`에서
- 스타일 오버라이드 중 두부의 변수(예: `$bg-grey`)가 필요
- 파일의 상단에서 두부 import
- 3.2. 에서 import한 두부가 2.2. 에서 정의한 스타일을 덮어씀
왜 css 파일을 나눠서 컴파일하는가
- 중복되는 코드를 피하고 싶어서
- 첫 페이지만 방문할 사용자에게 모든 페이지의 스타일이
다 들어간 css를 내려주지 않아도 되도록 하기 위해 - 새로 배포된 뒤로 처음 페이지를 방문하는 사용자의
로딩타임을 줄이기 위해 - HTTP/2 에서는 요청당 오버헤드가 적어서
리소스를 쪼개는게 오히려 성능에 도움이 되기 때문에 귀찮아서- ...etc
두부는 많은 곳에서 사용되고 있기 때문에
다양한 요구사항을 가지고 있습니다
그렇기 때문에 다양한 요구사항에
유연하게 대처할 수 있는 구조로 바뀌어야 한다고 생각합니다
두부를 좀 더 고치고 싶어요
대강 이러이러하게
독립적이지 않은 코드를
예를 들자면 두부의 `_variables.scss`는 독립적이지 않습니다
// 가상의 코드
@import 'dooboo/_variables.scss';
body {
background: $bg-grey; // 컴파일 에러
}
// _variables.scss
$bg-grey: $grey-0;
// `$grey-0`이 `_variables.scss`안에 없기 때문
독립적인 코드로
`_variables.scss`안에서 `_colors.scss`를 import 한다면
// `_variables.scss`만 import 하고도
// `$bg-grey`를 사용할 수 있습니다.
@import 'dooboo/_variables.scss';
body {
background: $bg-grey; // 이상없음
}
// _variables.scss
@import 'mo/_colors.scss';
$bg-grey: $grey-0;
// `$grey-0`은 `_colors.scss`에 들어있음
쪼갤 수 있는 것들
`_variables.scss`의 제목 주석들만 모아보았습니다
// Layout
// Grid
// Service color
// Type
// Text color
// General UI
// Checkbox and Radios
// Toggle
// for muenus like "Dropdown menus", "Sidebar menus"
// Sidebar
// Page Header
// Subnav
// Footer
// Buttons
// Label
// Alerts
// Dropdown
// Navbar
// Topnav
// Tables
// Forms
// Modal
// Toast
// Panels
// Hero
// Section
// Transition
// Z-index master list
이런 것들은 별도 파일로 나누고
- Layout
- Grid
- Service color
- Type
- Text color
- General UI
이런것들은 리액트 컴포넌트 코드와
같이 묶어놓으면 좋겠습니다
- Checkbox
- Toggle
- Page Header
- Subnav
- Footer
- Buttons
- Label
- Alerts
- Dropdown
- Radios
- Navbar
- Topnav
- Tables
- Forms
- Modal
- Toast
- Panels
- Hero
;
component, module and stylesheet
By jongchan_choi
component, module and stylesheet
회사 워크샵용
- 419