@real-bird/cdd-wanted
로 만들었다.node
환경을 사용하기 위해 npm init
명령어로 초기화한다.npm init -y
를 입력하면 패키지를 일일이 설정할 필요없이 package.json
이 생성된다.# current dir tree
@real-bird/cdd-wanted/
└─ package.json
storybook
을 설치한다.npx storybook@latest init
react
로 선택했다.vite
와 webpack5
환경 중 react-webpack5
로 설치한다.storybook vite
의 경우 별도의 설정을 해야 하는데 모르기 때문이다.# current dir tree
@real-bird/cdd-wanted/
├─ .storybook/
│ ├─ main.js
│ └─ preview.js
├─ node_modules/
├─ stories/
├─ package-lock.json
└─ package.json
CSS-in-JS
라이브러리인 styled-components
를 설치했다.npm install styled-components@latest
latest
버전은 6.0.0-rc.3
이다.stories
를 src/components
로 바꿨다.# current dir tree
@real-bird/cdd-wanted/
├─ .storybook/
│ ├─ main.js
│ └─ preview.js
├─ node_modules/
├─ src/
│ └─ components/
│ ├─ Button.jsx
│ └─ Button.stories.jsx
├─ package-lock.json
└─ package.json
// .storybook/main.js
const config = {
// 기존의 ../stories/**/*.stories.@(js|jsx|ts|tsx)를 아래처럼 바꿨다.
stories: ["../src/components/**/*.stories.@(js|jsx|ts|tsx)"],
// (...)
};
export default config;
<Button />
을 구성했다.Button.jsx
파일은 다음과 같다.import React from "react";
import PropTypes from "prop-types";
import { styled } from "styled-components";
const DefaultButton = styled.button`
color: ${(props) => (props.color ? props.color : "#FFFFFF")};
background-color: ${(props) =>
props.backgroundColor ? props.backgroundColor : "#F59E0B"};
border-radius: ${(props) => (props.borderRadius ? borderRadius : "10px")};
`;
export const Button = ({ color, backgroundColor, borderRadius, label }) => {
return (
<DefaultButton
type="button"
style={{ color, backgroundColor, borderRadius }}
>
{label}
</DefaultButton>
);
};
Button.propTypes = {
color: PropTypes.string,
backgroundColor: PropTypes.string,
label: PropTypes.string.isRequired,
borderRadius: PropTypes.string,
};
Button.stories.jsx
는 다음과 같다.import { Button } from "./Button";
export default {
title: "Example/Button",
component: Button,
tags: ["autodocs"],
argTypes: {
backgroundColor: { control: "color" },
color: { control: "color" },
borderRadius: { control: "text" },
},
};
export const Default = {
args: {
label: "Default",
},
};
export const Hover = {
args: {
label: "Hover",
backgroundColor: "#D97706",
},
};
export const Action = {
args: {
label: "Action",
backgroundColor: "#B45309",
},
};
export const Disabled = {
args: {
label: "Disabled",
backgroundColor: "#6B7280",
},
};
argTypes
의 명세는 여기서 확인할 수 있다.rollup
을 설치한다.npm install -D rollup
webpack
보다 설정이 편하기 때문...인가? 사용 이유는 잘 모르겠다. 공부 필요rollup.config.js
를 생성해 진입점(entry)을 설정한다.export default {
input: "src/index.js",
output: {
file: "bundle.js",
format: "cjs",
},
};
src/index.js
로 설정하고, ESmodule
을 사용하기 위해 package.json
에 "type": "module"
을 추가한다.ESM
과 CommonJS modules
를 번들링하기 위해 esbuild
를 설치한다.
npm install --save-exact -D esbuild
npm install rollup-plugin-esbuild
rollup.config.js
에 플러그인을 추가한다.
import esbuild from "rollup-plugin-esbuild";
export default {
input: "src/index.js",
output: {
file: "bundle.js",
format: "cjs",
},
plugins: [
esbuild({
include: /\.jsx?$/,
minify: process.env.NODE_ENV === "production",
jsx: "automatic",
}),
],
};
package.json
의 peerDependencies
에 추가한다. 여기서는 react
, react-dom
, styled-components
가 필요하다.{
// (...)
"peerDependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"styled-components": "^6.0.0-rc.3"
}
}
rollup.config.jf
의 external
에 번들링 제외할 peer-deps 라이브러리들을 추가한다.import esbuild from "rollup-plugin-esbuild";
export default {
input: "src/index.js",
output: {
file: "bundle.js",
format: "cjs",
},
plugins: [
esbuild({
include: /\.jsx?$/,
minify: process.env.NODE_ENV === "production",
jsx: "automatic",
}),
],
external: ["react", "react-dom", "styled-components"],
};
ESM
과 CJS
두 모듈 모두 번들링하기 위해 rollup.config.js
의 output
을 변경한다.import pkg from "./package.json" assert { type: "json" };
export default {
input: "src/index.js",
output: [
{
file: pkg.exports["."].import,
format: "cjs",
},
{
file: pkg.exports["."].require,
format: "esm",
},
],
// (...)
};
package.json
에도 exports
를 추가한다. "exports": {
".": {
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.js"
}
},
package
의 exports
를 config
에서 가져온 것이다. assert
문법은 json
을 가져오는 ESModule
기능이다.npm login
으로 인증한다.npm info 패키지명
으로 중복을 확인한다. 에러가 나면 중복되지 않은 패키지명이다."main": "dist/esm/index.js",
"scripts": {
"build": "rollup -c",
"prepack": "rm -rf dist && npm run build",
},
빌드가 정상적으로 동작하면 npm publish
로 배포한다.
403
에러가 발생한다.npm publish
로는 에러가 발생했다. private
쓸 거면 돈을 내란다. public
으로 설정하면 배포가 가능하다. npm publish --access public
npm에 올린 결과물이다.
올리기 전에 https://www.toptal.com/developers/gitignore에서 환경에 맞는 ignore파일을 만든 후 추가한다. 여기서는 node
만 써서 만들었다.
패키지스러운 README
를 작성하자.
"build-storybook": "storybook build -o docs"
npm run build-storybook
으로 빌드한다.package
의 버전을 하나 올리고 npm publish
하면 README
가 추가된 저장소를 볼 수 있다.main
브랜치의 docs
를 설정했다.npm i @real-bird/cdd-wanted
로 설치해 본다.