이전 포스팅에 이어서 작성합니다.
[npm 라이브러리 배포] 개발환경 세팅하기(yarn+Vite+React+TypeScript+Emotion+Storybook)
yarn add -D vite-plugin-dts
import * as path from 'path';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import dts from 'vite-plugin-dts';
export default defineConfig({
assetsInclude: ['/sb-preview/runtime.js'],
build: {
lib: {
entry: path.resolve(__dirname, 'src/lib/index.ts'),
name: 'react-carousel-image-optimized',
formats: ['es', 'cjs'],
fileName: (format) => `index.${format}.js`,
},
rollupOptions: {
external: ['react', 'react-dom', '**/*.stories.tsx'],
output: {
globals: {
react: 'React',
'react-dom': 'ReactDOM',
},
banner: '"use client";',
interop: 'auto',
},
},
commonjsOptions: {
esmExternals: ['react'],
},
},
plugins: [
react({
jsxImportSource: '@emotion/react',
babel: {
plugins: ['@emotion/babel-plugin'],
},
}),
dts({
insertTypesEntry: true,
}),
],
});
CommonJS와 ES모듈 두 가지 방식을 모두 지원하기 위해, exports에서 require을 사용하는 경우와 import를 사용하는 경우 어떤 파일에서 불러올 지 지정해준다.
{
//패킹된 라이브러리의 이름을 결정
"name": "라이브러리 이름",
"description": "라이브러리 설명",
"keywords": [
관련 키워드
],
"author": {
"name": "이름",
"email": "이메일"
},
"repository": {
"type": "git",
"url": "git주소"
},
"private": false,
"license": "MIT", //라이브러리 라이센스
"version": "0.0.1",
"type": "module",
"main": "dist/index.cjs.js",
"module": "dist/index.es.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"module": "./dist/index.es.js",
"import": "./dist/index.es.js",
"default": "./dist/index.cjs.js"
}
},
}
참고 문서
npm package.json 공식문서
Node.js 공식문서
최종적으로 빌드됐을 때, 배포에 필요한 파일과 폴더를 지정해준다.(TypeScript 컴파일러가 JavaScript 코드로 변환할 소스 파일을 지정하는 것)
나같은 경우 src/lib에 컴포넌트 라이브러리로 배포할 파일을 넣었고, lib폴더 내에 테스트 코드를 제외시켜줬다.
{
"compilerOptions": {
//생략
},
"include": ["src/lib"],
"exclude": ["**/*.stories.tsx"],
"references": [{ "path": "./tsconfig.node.json" }]
}
여기까지 하면 라이브러리를 배포할 준비는 모두 마쳤고, 다음 포스팅에서는 테스트 컴포넌트를 만들어서 로컬에서 테스트해보고, 실제 npm registry에도 배포하는 과정을 기록할 예정이다.