@twotwoba/vv-cli
Version:
Easily create Vite + React19/Vue3 web/h5/mini-program/chrome-extension projects.
270 lines (212 loc) • 7.55 kB
Markdown
# UI Component Library Template - Project Summary
## 🎯 Overview
This is a production-ready template for building Vue 3 UI component libraries, similar to Element Plus and Ant Design Vue. It uses:
- **Vite 8** (with Rolldown beta) for ultra-fast builds
- **pnpm workspace** for monorepo management
- **TypeScript** for type safety
- **Vue 3 Composition API** for modern component development
## 📁 Complete File Structure
```
template-ui-lib/
├── .npmrc # pnpm configuration
├── LICENSE # MIT License
├── README.md # Main documentation
├── QUICK_START.md # Quick start guide
├── DEVELOPMENT.md # Detailed development guide
├── PROJECT_SUMMARY.md # This file
├── gitignore # Git ignore rules
├── package.json # Root package with scripts
├── pnpm-workspace.yaml # Workspace configuration
├── tsconfig.json # Root TypeScript config
│
├── packages/
│ └── components/ # Main component library (publishable)
│ ├── README.md # Library usage documentation
│ ├── package.json # Library package config
│ ├── tsconfig.json # Library TypeScript config
│ ├── vite.config.ts # Vite library mode config
│ └── src/
│ ├── index.ts # Main entry point
│ ├── button/
│ │ ├── button.vue # Button component
│ │ └── index.ts # Button exports
│ └── input/
│ ├── input.vue # Input component
│ └── index.ts # Input exports
│
└── playground/ # Development playground
├── .env.dev # Dev environment variables
├── .env.prod # Prod environment variables
├── index.html # HTML entry
├── package.json # Playground package
├── tsconfig.json # Playground TypeScript config
├── vite.config.ts # Playground Vite config
├── public/
│ └── vite.svg # Vite logo
└── src/
├── main.ts # App entry point
├── style.css # Global styles
└── App.vue # Demo application
```
## 🔑 Key Features
### 1. Vite 8 with Rolldown (Beta)
The template uses Vite 8's new Rolldown bundler for:
- ⚡️ Faster builds (10x faster than Rollup)
- 🎯 Better tree-shaking
- 📦 Smaller bundle sizes
- 🔧 Native Rust performance
### 2. Library Mode Configuration
The `vite.config.ts` in `packages/components` is configured for library building:
```typescript
build: {
lib: {
entry: { /* multiple entry points */ },
formats: ['es', 'cjs']
},
rolldownOptions: {
external: ['vue'],
output: [
{ format: 'es', dir: 'es', preserveModules: true },
{ format: 'cjs', dir: 'lib', preserveModules: true }
]
}
}
```
This generates:
- **ES modules** (`es/`) for modern bundlers (tree-shakable)
- **CommonJS** (`lib/`) for older tools
- **Type definitions** (`.d.ts`) for TypeScript support
### 3. Package.json Exports
The library's `package.json` uses modern exports field:
```json
{
"exports": {
".": {
"types": "./es/index.d.ts",
"import": "./es/index.mjs",
"require": "./lib/index.js"
},
"./button": {
/* individual component export */
},
"./input": {
/* individual component export */
}
}
}
```
This enables:
- Full import: `import UI from 'your-lib'`
- On-demand import: `import { Button } from 'your-lib'`
- Direct import: `import Button from 'your-lib/button'`
### 4. Monorepo Structure
Using pnpm workspace for:
- 🔗 Shared dependencies
- 🚀 Fast installs with hard links
- 📦 Workspace protocol (`workspace:*`)
- 🎯 Isolated package management
### 5. Development Playground
The playground package:
- Uses the library via `workspace:*` dependency
- Provides hot module replacement (HMR)
- Allows real-time component testing
- Serves as living documentation
## 🚀 Available Scripts
### Root Level
```bash
pnpm dev # Start playground dev server
pnpm build # Build component library
pnpm build:all # Build all packages
pnpm type-check # Run TypeScript checks
pnpm clean # Clean all build outputs
```
### Component Library
```bash
cd packages/components
pnpm dev # Watch mode build
pnpm build # Production build
pnpm type-check # Type checking
```
## 📦 Build Output
After running `pnpm build`, the library generates:
```
packages/components/
├── es/ # ES modules
│ ├── index.mjs
│ ├── index.d.ts
│ ├── button/
│ │ ├── index.mjs
│ │ ├── index.d.ts
│ │ └── button.vue.d.ts
│ └── input/
│ ├── index.mjs
│ ├── index.d.ts
│ └── input.vue.d.ts
└── lib/ # CommonJS
├── index.js
├── button/
│ └── index.js
└── input/
└── index.js
```
## 🎨 Component Structure
Each component follows this pattern:
```
component-name/
├── component-name.vue # Component implementation
└── index.ts # Exports and install function
```
The `index.ts` provides:
- Named export: `export { ComponentName }`
- Default export: `export default ComponentName`
- Type export: `export type { ComponentNameProps }`
- Install function for Vue.use()
## 📝 Usage After Publishing
### Installation
```bash
npm install your-ui-library
```
### Full Import
```typescript
import { createApp } from 'vue'
import YourUI from 'your-ui-library'
app.use(YourUI)
```
### On-Demand Import
```typescript
import { Button, Input } from 'your-ui-library'
```
### Direct Import (Best for Tree-Shaking)
```typescript
import Button from 'your-ui-library/button'
import Input from 'your-ui-library/input'
```
## 🔧 Customization
1. **Update package name**: Edit `packages/components/package.json`
2. **Add components**: Follow the Button/Input pattern
3. **Customize styles**: Modify component `.vue` files
4. **Add build plugins**: Update `vite.config.ts`
5. **Configure TypeScript**: Adjust `tsconfig.json` files
## 📚 Documentation Files
- **README.md**: Overview and basic usage
- **QUICK_START.md**: Step-by-step getting started guide
- **DEVELOPMENT.md**: Detailed development workflow
- **packages/components/README.md**: Library API documentation
## 🎯 Best Practices Implemented
1. ✅ TypeScript for type safety
2. ✅ Scoped styles to prevent conflicts
3. ✅ Component naming with `Ui` prefix
4. ✅ Props interfaces with TypeScript
5. ✅ Proper event typing with `defineEmits`
6. ✅ Tree-shakable exports
7. ✅ Separate CSS for each component
8. ✅ Full type definitions
9. ✅ Modern package.json exports
10. ✅ Monorepo for better organization
## 🚀 Next Steps
1. Install dependencies: `pnpm install`
2. Start development: `pnpm dev`
3. Add your components
4. Build: `pnpm build`
5. Publish: `npm publish`
Enjoy building your UI library! 🎉