시작하기
시작하기
나만의 컴포넌트 레지스트리를 설정하고 운영하는 방법을 알려드릴게요. 이미 컴포넌트가 있는 프로젝트를 레지스트리로 바꾸는 과정을 기준으로 설명할게요.
출처: 문서
본문
이 가이드는 나만의 컴포넌트 레지스트리를 설정하는 과정을 안내해요. 이미 컴포넌트가 있는 프로젝트를 레지스트리로 전환하고자 한다는 전제로 진행합니다.
새 레지스트리 프로젝트를 시작한다면 registry 템플릿을 출발점으로 삼을 수 있어요. 이미 설정이 완료되어 있습니다.
registry.json
registry.json 파일은 shadcn CLI로 레지스트리를 빌드할 때만 필요해요. 다른 빌드 시스템을 쓴다면, 빌드 시스템이 registry-item 스키마 명세를 따르는 유효한 JSON 파일을 만드는 한 이 단계는 건너뛸 수 있어요.
registry.json 파일 추가
프로젝트 루트에 registry.json 파일을 만들어요. 프로젝트는 Next.js, Remix, Vite, 그 외 React를 지원하는 어떤 프로젝트든 상관없어요.
{
"$schema": "https://ui.shadcn.com/schema/registry.json",
"name": "acme",
"homepage": "https://acme.com",
"items": [
// ...
]
}
이 registry.json 파일은 registry 스키마 명세를 따라야 해요.
레지스트리 아이템 추가
컴포넌트 만들기
첫 번째 컴포넌트를 추가해요. 간단한 <HelloWorld /> 컴포넌트의 예시예요.
import { Button } from "@/components/ui/button"
export function HelloWorld() {
return <Button>Hello World</Button>
}
참고: 이 예시에서는 컴포넌트를
registry디렉터리에 둡니다.registry.json파일에 올바른 경로만 설정하면 프로젝트 어디에든 배치할 수 있어요.
registry
└── hello-world
└── hello-world.tsx
중요: 컴포넌트를 커스텀 디렉터리에 배치한다면
tailwind.config.ts파일에 해당 경로가 설정되어 있는지 확인하세요.
// tailwind.config.ts
export default {
content: ["./registry/**/*.{js,ts,jsx,tsx}"],
}
레지스트리에 컴포넌트 추가
컴포넌트를 레지스트리에 추가하려면 컴포넌트 정의를 registry.json에 추가해야 해요.
{
"$schema": "https://ui.shadcn.com/schema/registry.json",
"name": "acme",
"homepage": "https://acme.com",
"items": [
{
"name": "hello-world",
"type": "registry:block",
"title": "Hello World",
"description": "A simple hello world component.",
"files": [
{
"path": "registry/hello-world/hello-world.tsx",
"type": "registry:component"
}
]
}
]
}
레지스트리 아이템은 name, type, title, description, files를 추가해 정의해요. 파일마다 path와 type을 반드시 지정해야 해요. path는 프로젝트 루트 기준 상대 경로이고, type은 파일의 유형이에요.
레지스트리 아이템 스키마와 파일 유형에 대해 더 자세히 알고 싶다면 registry item 스키마 문서를 읽어보세요.
레지스트리 빌드
shadcn CLI 설치
참고로 build 명령어는 현재 shadcn@canary 버전의 CLI에서만 사용할 수 있어요.
npm install shadcn@canary
build 스크립트 추가
package.json 파일에 registry:build 스크립트를 추가해요.
{
"scripts": {
"registry:build": "shadcn build"
}
}
build 스크립트 실행
build 스크립트를 실행해 레지스트리 JSON 파일을 생성해요.
npm run registry:build
참고: 기본적으로 build 스크립트는 레지스트리 JSON 파일을
public/r아래에 생성해요. 예를 들어public/r/hello-world.json같은 형태입니다.--output옵션으로 출력 디렉터리를 바꿀 수 있어요. 자세한 내용은 shadcn build 명령어를 참고하세요.
레지스트리 서빙
Next.js에서 레지스트리를 운영한다면 next 서버를 실행해 레지스트리를 서빙할 수 있어요. 다른 프레임워크에서는 명령어가 다를 수 있어요.
npm run dev
파일은 이제 http://localhost:3000/r/[NAME].json에서 제공돼요. 예를 들어 http://localhost:3000/r/hello-world.json 같은 식입니다.
레지스트리 배포
다른 개발자들이 레지스트리를 사용할 수 있게 하려면 프로젝트를 공개 URL에 배포하면 돼요.
가이드라인
레지스트리용 컴포넌트를 만들 때 따르면 좋은 가이드라인을 정리했어요.
- 블록 정의에는
name,description,type,files속성이 필수예요. - 모든 레지스트리 의존성을
registryDependencies에 나열하세요. 레지스트리 의존성이란 레지스트리 안의 컴포넌트 이름(예:input,button,card) 또는 레지스트리 아이템의 URL(예:http://localhost:3000/r/editor.json)을 말해요. - 모든 의존성을
dependencies에 나열하세요. 의존성이란 레지스트리 안의 패키지 이름(예:zod,sonner)을 말해요. 버전을 지정하려면name@version형식을 사용할 수 있어요(예:zod@^3.20.0). - import는 항상
@/registry경로를 사용하세요. 예:import { HelloWorld } from "@/registry/hello-world/hello-world" - 이상적으로는 파일을
components,hooks,lib디렉터리 안의 레지스트리 아이템에 배치하세요.
CLI로 설치
shadcn CLI로 레지스트리 아이템을 설치하려면 add 명령어에 레지스트리 아이템의 URL을 붙여 사용해요.
npx shadcn@latest add http://localhost:3000/r/hello-world.json