UI Library 제작 및 사용기(react - storybook - tailwind -netlify)
· 9 min read
배경
사내에서 react를 활용한 어드민 페이지 개발이 다수의 서비스에 도입되면서 다수의 어드민 페이지 개발을 통일성 있게 개발해 보자는 니즈가 있었고 이를 위해 공용 모듈을 통해 통일성을 찾아보자는 방법을 연구하기 시작합니다.
프로세스 설계
공통 UI Library 프로세스 설계
- UI Library Developer는 reactjs, storybook, tailwindcss를 이용해 공통으로 사용할 만한 UI 컴포넌트를 제작해 storybook을 통해 이를 테스트해 볼 수 있도록 하는 웹을 Netlify를 통해 배포합니다.
- UI Designer와 함께 웹을 보면서 Storybook을 통해 수치를 조정하거나 컴포넌트 변경에 대해 논의 및 수정합니다.
- 협의된 컴포넌트를 Npm을 통해 라이브러리로 배포합니다.
- Frontend Developer는 Storybook을 통해 컴포넌트의 UI셋팅값에 맞게 UI Designer와 함께 웹 서비스를 개발합니다.
- 장점
- 매 프로젝트별 동일하게 사용하는 컴포넌트 개발을 프로젝트 별로 분리 개발하지 않고 설치해서 바로 사용 가능합니다.
- Storybook을 웹에 배포해 UI Designer와 함께 직접 컴포넌트 셋팅값을 조정해 개발적으로도 가능 범주를 조정해 줄 수 있고 UI Designer도 실제 눈앞에서 조정해 볼 수 있어 효율적입니다.
- UI 라이브러리를 지속적으로 업그레이드 해 기존 프로젝트 별 일회성 컴포넌트가 아닌 자산화가 가능합니다.
- 단점
- 공용으로 사용하는 모듈의 사용을 강력히 권고하면 프로젝트 별 자유도를 떨어트립니다.
- UI 라이브러리의 지속적 업데이트 관리가 필요하며 사용하는 프로젝트에서의 라이브러리 버전 특성을 고려해야 합니다.
- 주요 고려 사항
- 공용으로 사용하는 모듈의 사용은 편의를 제공하기 위함이므로 사용을 권고하기 보다 원하면 사용하도록 하는 것이 좋을 것으로 보입니다.
- 공용으로 반드시 사용할 수 있을 만한 컴포넌트 단위를 신중히 선정해야 할 것으로 보입니다.
개발 과정
React Typescript 빌드 설정
-
React 프로젝트 생성:
npm init -y
-
필수 라이브러리 설치:
npm install --save-dev react react-dom @types/node @types/react @types/react-dom typescript
-
package.json 설정
peerDependencies
란 실제로 패키지에서require
,import
하지는 않지만 특정 라이브러리 툴에 호환성을 필요로 할 경우 명시하는 dependencies인데 아래와 같이 react 버전과 react-dom 버전을 명시함으로써 해당 버전에서 사용할 수 있는 라이브러리임을 명시해 오류를 줄이기 위함입니다.files
는npm
라이브러리 배포 시 폴더를 설정하기 위함입니다.- scripts는 tsc를 통해 빌드하는 타입스크립트 빌드
build:esm
과 바닐라JS사용 유저를 위해build:cjs
를 둘 다 빌드하게 합니다.
{
"peerDependencies": {
"react": "^18.1.0",
"react-dom": "^18.1.0"
},
"files": ["dist"],
"scripts": {
"build": "rm -rf /dist && npm run build:esm && npm run build:cjs",
"build:esm": "tsc",
"build:cjs": "tsc --module CommonJS --outDir dist/cjs"
}
} -
Typescript 설정
- 타입스크립트 초기 설정:
tsc --init
- tsconfig.json 설정
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"declaration": true,
"esModuleInterop": true,
"jsx": "react",
"lib": ["ES5", "ES2015", "ES2016", "DOM", "ESNext"],
"types": ["node"],
"module": "es2015",
"moduleResolution": "node",
"noImplicitAny": false,
"noUnusedLocals": true,
"outDir": "dist/esm",
"sourceMap": true,
"strict": true,
"target": "ES6"
},
"include": ["src/**/*.ts", "src/**/*.tsx"]
} - 타입스크립트 초기 설정:
Storybook 설정
-
Storybook 초기 설정:
npx sb init
-
실행 확인:
npm run storybook
Npm 배포
- 라이브러리로 배포 후 사용하기 위해서는 path 설정을 해줘야 하는데 이를 위해 컴포넌트 별로
export * from “./Button”
이런 식의 경로 설정을 폴더별index.ts
에 적용합니다. - 빌드:
npm run build