Skip to content

Design System Publish in NPM (1)

Published: at 오전 09:16

해당 게시글은 vite v4, typescript v5, react v18, storybook v8, pnpm v8 환경에서 작성되었습니다.

Deploy setting

  1. package.json 설정하기
{
  "name": "배포할 패키지 이름",
  "version": "패키지 버전",
  "private": false,
  "description": "패키지 설명",
  "keywords": ["패키지 검색을 도와줄 키워드"],
  "repository": {
    "type": "git",
    "url": "git 주소"
  },
  "license": "MIT", // 라이선스 명시
  "type": "module", // CJS or ESM
  "main": "./dist/index.cjs.js",
  "module": "./dist/index.es.js",
  "types": "./dist/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.es.js",
      "require": "./dist/index.cjs.js"
    }
  },
  "files": ["dist"]
  // ...
}

legacy support

exports

Warning

CJS, ESM을 모두 지원하기 위해서는 Conditional Exports를 사용해야 한다.

 "exports": {
   ".": {
     "require": {
       "types": "./dist/index.d.cts",
       "default": "./dist/index.cjs.js"
     },
     "import": {
       "types": "./dist/index.d.ts",
       "default": "./dist/index.es.js"
     }
   }
 },

Trouble Shooting

하지만 Conditional Exports를 설정 후 yarn build를 실행하였을 때에도 dist 폴더 내에 cts 파일이 생성되지 않았다.

=> vite은 CJS build를 더 이상 제공하지 않는다고 한다.

Ref: https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated

  1. vite.config.ts 수정하기

타입 정의 파일(.d.ts)를 생성하기 위해 vite-plugin-dts를 설치한다.

yarn add -D vite-plugin-dts

vite.config.ts 전체 코드

export default defineConfig({
  plugins: [
    react(),
    dts({
      insertTypesEntry: true,
    }),
    tsconfigPaths(),
  ],
  build: {
    lib: {
      entry: path.resolve(__dirname, "src/index.ts"),
      name: "@yourssu/design-system-react",
      formats: ["es", "cjs"],
      fileName: format => `index.${format}.js`,
    },
    rollupOptions: {
      external: ["react", "react-dom", "styled-components", "**/*.stories.tsx"],
      output: {
        globals: {
          react: "React",
          "react-dom": "ReactDOM",
          "styled-components": "styled",
        },
        banner: '"use client";',
        interop: "compat",
      },
    },
  },
});

lib

rollupOptions

  1. 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",
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    },

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["src"],
  "references": [{ "path": "./tsconfig.node.json" }]
}
  1. .npmignore 설정하기

npm 배포 시 제외할 파일/폴더를 선택한다.

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

.yarn
storybook-static
package.tgz
iconsAsset
.storybook

warning

해당 파일이 없다면 .gitignore 폴더를 보게 되는데, .gitignore에는 dist 폴더가 존재하기 때문에 npm에 dist 파일이 올라가지 않는 문제가 생길 수 있으니 주의하자!