- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Collapsible
- Combobox
- Command
- Context Menu
- Data Table
- Date Picker
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Message Scroller
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Questionnaire
- Radio Group
- Resizable
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
- Typography
shadcn CLI は パッケージのインポート をサポートしています。コンポーネントのインストール、インポートの書き換え、サードパーティレジストリの解決に使用されます。
パッケージのインポートにより、tsconfig.json の compilerOptions.paths の代わりに package.json でプライベートな #... インポートエイリアスを使用できます。
例#
package.json で imports を構成します。
{
"imports": {
"#components/*": "./src/components/*.tsx",
"#lib/*": "./src/lib/*.ts",
"#hooks/*": "./src/hooks/*.ts"
}
}次に、#... 指定子を使用して、生成されたコンポーネントをインポートします。
import { Button } from "#components/ui/button"
import { cn } from "#lib/utils"パッケージのインポート指定子は # で始まる必要があります。TypeScript 5 以降を使用し、
moduleResolution: "bundler" および resolvePackageJsonImports: true を設定してください。
アプリ#
Next.js、Vite、TanStack Start のようなアプリでは、コンポーネントを同じワークスペースにインストールして追加します。
package.json を構成する#
shadcn/ui のインストール先に対応するインポートを追加します。
{
"imports": {
"#components/*": "./src/components/*.tsx",
"#lib/*": "./src/lib/*.ts",
"#hooks/*": "./src/hooks/*.ts"
}
}アプリが src ディレクトリを使用しない場合は、ターゲットから src/ を削除します。たとえば:
{
"imports": {
"#components/*": "./components/*.tsx",
"#lib/*": "./lib/*.ts",
"#hooks/*": "./hooks/*.ts"
}
}TypeScript を設定する#
パッケージのインポート解決を有効にします。
{
"compilerOptions": {
"moduleResolution": "bundler",
"resolvePackageJsonImports": true
}
}これらのエイリアスには compilerOptions.paths は必要ありません。
components.json を構成する#
components.json で同じ #... ルートを使用します。
{
"aliases": {
"components": "#components",
"ui": "#components/ui",
"lib": "#lib",
"hooks": "#hooks",
"utils": "#lib/utils"
}
}ui エイリアスは #components/ui を使用しますが、これは package.json の #components/* インポートでまだカバーされています。
utils エイリアスは #lib/utils を使用します。これは #lib/* でカバーされているため、別途 #utils インポートを追加する必要はありません。
モノレポ#
モノレポでは、各パッケージ内のファイルにはパッケージインポートを使用し、ワークスペース間で共有するファイルにはエクスポートを使用します。
アプリのワークスペースの場合:
{
"name": "web",
"private": true,
"imports": {
"#components/*": "./src/components/*.tsx",
"#lib/*": "./src/lib/*.ts",
"#hooks/*": "./src/hooks/*.ts"
},
"dependencies": {
"@workspace/ui": "workspace:*"
}
}{
"aliases": {
"components": "#components",
"ui": "@workspace/ui/components",
"lib": "#lib",
"hooks": "#hooks",
"utils": "@workspace/ui/lib/utils"
}
}共有 UI パッケージの場合:
{
"name": "@workspace/ui",
"private": true,
"imports": {
"#components/*": "./src/components/*.tsx",
"#lib/*": "./src/lib/*.ts",
"#hooks/*": "./src/hooks/*.ts"
},
"exports": {
"./globals.css": "./src/styles/globals.css",
"./components/*": "./src/components/*.tsx",
"./lib/*": "./src/lib/*.ts",
"./hooks/*": "./src/hooks/*.ts"
}
}{
"aliases": {
"components": "#components",
"ui": "#components",
"lib": "#lib",
"hooks": "#hooks",
"utils": "#lib/utils"
}
}apps/web から add を実行すると、アプリのローカルファイルは #... インポートを使用し、
共有 UI ファイルは @workspace/ui からインポートされます。
import { Button } from "@workspace/ui/components/button"
import { LoginForm } from "#components/login-form"ファイル拡張子#
package.json#imports のターゲットパターンは、生成されるインポートにファイル拡張子を含めるかどうかを制御します。
{
"imports": {
"#components/*": "./src/components/*.tsx"
}
}これにより、拡張子なしのインポートが生成されます。
import { Button } from "#components/ui/button"拡張子なしでターゲットを使用する場合:
{
"imports": {
"#components/*": "./src/components/*"
}
}生成されたインポートでは、ソース拡張子が保持されます。
import { Button } from "#components/ui/button.tsx"ほとんどのアプリでは、ターゲットパターンで拡張子を使用します。
トラブルシューティング#
TypeScript が #... インポートを解決できない場合は、次のことを確認してください。
- 指定子は
#で始まります importsエントリは最も近いpackage.jsonにありますmoduleResolutionはbundlerに設定されますresolvePackageJsonImportsが有効になっています- コンポーネントの追加後に一致するターゲットが存在する
コンポーネントをインストールしたにもかかわらず、インポートが依然として @/... を指している場合は、components.json がパッケージのインポートと同じ #... エイリアスを使用しているか確認してください。