개발자
류준열
컴포넌트 라이브러리 npm 배포 과정(vite,pnpm)
컴포넌트 라이브러리 Npm 배포 과정을 정리해보았다. vite와 pnpm을 사용했다.
(레포지토리)
vite로 react 프로젝트 생성
pnpm create vite . --template react-ts 참고
storybook 설치
root 파일에서 터미널에 접근후 아래 명령어 입력
npx storybook@latest init
그 후 버튼 하나 만들어준다.
실제 배포하기
호스팅된 url을 package.json에 적어줘야하기 때문에 먼저 배포.
배포하는 방법까지 설명하지 않음. 나는 vercel 이용함
https://storybook-npm-publish.vercel.app
빌드 설정
package.json
어떻게 npm에 등록하고 외부 프로젝트에 어떻게 내보낼지 작성해준다.
아래는 예시 코드이다.
{
// name: 프로젝트의 이름. 패키지의 고유 식별자이다
"name": "storybook-npm-publish",
// npm publish 할때마다 최소 patch는 올려주어야함
"version": "0.0.1",
// 프로젝트 단위에서 es 모듈을 사용할 수 있게 함으로써 import를 사용할 수 있게 해준다. 그냥 type: module로 설정하면 됨
"type": "module",
// 패키지의 주요 진입점 파일
"main": "./dist/index.js",
// 패키지의 TypeScript 타입 정의 파일
"types": "./dist/index.d.ts",
// 모듈을 외부에 공개할 때 사용하는 설정.
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.umd.cjs"
},
"./style.css": "./dist/style.css"
},
// 패키지에 포함되어야 하는 파일과 디렉토리를 나타낸다. 빌드시에 생성되는 dist 디렉토리 내의 모든 파일이 포함된다.
"files": [
"dist"
],
"repository": "https://github.com/ryu9663/storybook-npm-publish.git",
"author": "Junyeol Ryu",
"homepage": "https://storybook-npm-publish.vercel.app/",
"scripts": {
"start": "vite",
"build:lib": "tsc && vite build",
"build:storybook": "storybook build -o dist && touch ./dist/.nojekyll",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview",
"dev": "storybook dev -p 6006"
},
vite.config.ts
어떻게 파일을 말아줄지
import { defineConfig } from "vite";
import * as path from "path";
import dts from "vite-plugin-dts";
import tsconfigPaths from "vite-tsconfig-paths";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [dts(), tsconfigPaths()],
server: {
port: 3000,
},
build: {
// 빌드할 라이브러리에 대한 설정
lib: {
// 라이브러리의 진입점
entry: path.resolve(__dirname, "src/index.tsx"),
name: "index",
fileName: "index",
},
rollupOptions: {
external: ["react"],
output: {
globals: {
react: "React",
},
},
},
// CommonJS 번들러에 대한 옵션을 정의한다.
commonjsOptions: {
esmExternals: ["react"],
},
},
// 절대경로
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
});
tsconfig.json
절대경로를 제외하고는 create vite에서 만들어진 tsconfig.json에서 바꾸지 않음. 자세히 알고 싶으면 이 게시글 참고
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
위 설정으로 build 하면 다음과 같이 dist 디렉토리가 생성된다.

npm publish
DaleSeo 블로그에서 안내하는대로 따라하면 npm에 올라온 것을 확인할 수 있다.
외부라이브러리에서 사용
npm i storybook-npm-publish
