@fchc8/vite-plugin-multi-page
Version:
A powerful Vite plugin for building multi-page applications with smart file routing and multi-strategy builds
467 lines (346 loc) • 11.5 kB
Markdown
# @fchc8/vite-plugin-multi-page
> English Documentation | [English Documentation](./README-EN.md)
一个强大的 Vite 插件,支持多页面应用开发,提供多策略构建、TypeScript 配置支持和命令行工具。
## 特性
- 🎯 **多页面支持**: 自动发现页面入口文件
- 🔧 **多策略构建**: 支持为不同页面配置不同的构建策略
- 📝 **TypeScript 配置**: 支持 TypeScript 配置文件
- 🚀 **CLI 工具**: 提供命令行批量构建工具
- 🔄 **热重载**: 开发服务器支持页面热重载
- 📦 **扁平化输出**: 支持扁平化构建结果,减少目录层级
- ⚡ **并发构建**: 支持控制并发构建数量,提升构建效率
- 🗂️ **资源去重**: 自动去重共享资源,减少构建产物大小
## 安装
```bash
npm install @fchc8/vite-plugin-multi-page --save-dev
```
## 快速开始
### 1. 配置 Vite
在 `vite.config.ts` 中添加插件:
```typescript
import { defineConfig } from 'vite';
import { viteMultiPage } from '@fchc8/vite-plugin-multi-page';
export default defineConfig({
plugins: [viteMultiPage()],
});
```
### 2. 创建配置文件(可选)
插件提供了合理的默认配置,你可以选择:
**选项 A:无配置文件(使用默认配置)**
- 自动扫描 `src/pages/**/*.{ts,js}` 下的页面文件,目录下含有文件名main的文件作为页面入口
- 使用 `index.html` 作为模板
- 创建默认构建策略
**选项 B:最简配置**
创建 `multipage.config.ts`:
```typescript
import { defineConfig } from '@fchc8/vite-plugin-multi-page';
// 使用所有默认值
export default defineConfig(() => ({}));
```
**选项 C:完整配置**
创建 `multipage.config.ts` 或 `multipage.config.js`:
```typescript
import { defineConfig } from '@fchc8/vite-plugin-multi-page';
export default defineConfig(context => {
const { mode } = context;
const isProduction = mode === 'production';
return {
// 页面入口匹配规则
entry: 'src/pages/**/*.{ts,js}',
// HTML 模板
template: 'index.html',
// 排除的文件
exclude: ['src/shared/**/*.ts'],
// 构建策略
strategies: {
default: {
define: {
IS_DEFAULT: true,
API_BASE: isProduction ? '"https://api.example.com"' : '"http://localhost:3001/api"',
},
build: {
sourcemap: !isProduction,
minify: isProduction ? 'esbuild' : false,
},
},
mobile: {
define: {
IS_MOBILE: true,
API_BASE: isProduction
? '"https://mobile-api.example.com"'
: '"http://localhost:3001/mobile-api"',
},
build: {
target: ['es2015', 'chrome58', 'safari11'],
minify: isProduction ? 'terser' : false,
},
},
},
// 页面配置函数
pageConfigs: context => {
if (context.relativePath.includes('/mobile/')) {
return { strategy: 'mobile' };
}
return { strategy: 'default' };
},
};
});
```
### 3. 创建页面文件
按照约定创建页面文件:
```
src/pages/
├── home.js # → /home.html
├── about.js # → /about.html
├── mobile/
│ └── main.ts # → /mobile.html (移动端策略)
└── admin/
└── main.ts # → /admin.html
```
## 页面发现规则
插件按照以下规则发现页面入口:
1. **第一级文件** (优先级 1): `src/pages/home.js` → `/home.html`
2. **目录main文件** (优先级 2): `src/pages/mobile/main.ts` → `/mobile.html`
**目录优先原则**: 如果同时存在 `src/pages/about.js` 和 `src/pages/about/main.ts`,将使用 `src/pages/about/main.ts`。
## 构建策略
### 策略配置
策略配置支持所有 Vite 配置选项:
```typescript
strategies: {
mobile: {
define: {
IS_MOBILE: true,
},
build: {
target: ['es2015'],
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
},
},
},
// 其他 Vite 配置...
},
}
```
### 构建产物组织策略
#### 策略分组模式(默认)
默认情况下,构建结果按策略分组:
```
dist/
├── default/
│ ├── home.html
│ ├── about.html
│ ├── assets/
│ │ ├── home-xxx.js
│ │ ├── about-xxx.js
│ │ └── shared-resource.svg
│ └── images/
├── mobile/
│ ├── mobile.html
│ ├── assets/
│ │ ├── mobile-xxx.js
│ │ └── button-loading.svg
│ └── images/
└── tablet/
├── tablet.html
├── assets/
│ ├── tablet-xxx.js
│ └── button-loading.svg
└── images/
```
#### 扁平化模式(默认)
扁平化输出默认启用。使用 `--no-flatten` 参数禁用它:
```bash
# 默认行为(扁平化输出)
npx vite-mp
# 禁用扁平化输出
npx vite-mp --no-flatten
```
扁平化后的结构:
```
dist/
├── home.html
├── about.html
├── mobile.html
├── tablet.html
├── assets/
│ ├── home-xxx.js
│ ├── about-xxx.js
│ ├── mobile-xxx.js
│ ├── tablet-xxx.js
│ └── shared-resource.svg
├── images/
├── favicon.ico
└── some.css
```
#### 扁平化模式的优势
- ✅ **简化部署**: 所有文件在根目录,部署更简单
- ✅ **资源去重**: 自动去重相同内容的资源文件
- ✅ **减少层级**: 避免深层嵌套的目录结构
- ✅ **统一管理**: 所有资源集中管理,便于CDN配置
### 并发构建控制
通过 `--concurrency` 参数控制并发构建数量:
```bash
# 默认并发数为3
npx vite-mp
# 设置并发数为1(串行构建)
npx vite-mp --concurrency 1
# 设置并发数为5(高并发)
npx vite-mp --concurrency 5
```
#### 并发构建的优势
- ⚡ **提升效率**: 多策略并行构建,减少总构建时间
- 🔧 **资源控制**: 避免同时构建过多策略导致系统资源过载
- 🎯 **灵活配置**: 根据机器性能调整并发数量
- 📊 **进度可见**: 调试模式下显示批次构建进度
### 页面策略分配
通过 `pageConfigs` 函数为页面分配策略:
```typescript
pageConfigs: context => {
const { pageName, relativePath } = context;
if (relativePath.includes('/mobile/')) {
return { strategy: 'mobile' };
}
if (pageName.startsWith('admin')) {
return { strategy: 'admin' };
}
return { strategy: 'default' };
};
```
## 命令行工具
### 批量构建
```bash
# 构建所有策略(默认扁平化输出)
npx vite-mp
# 禁用扁平化输出结构
npx vite-mp --no-flatten
# 控制并发构建数量
npx vite-mp --concurrency 2
# 构建指定策略
npx vite-mp --strategy mobile,tablet
# 传递额外的 Vite 参数
npx vite-mp --host --port 3000
# 启用调试模式
npx vite-mp --debug
# 组合使用
npx vite-mp --concurrency 4 --debug
```
### 开发服务器
```bash
# 启动开发服务器 (所有页面)
npm run dev
# 只显示特定策略的页面
npm run dev -- --strategy mobile
```
### 静态资源预览
构建完成后,可以使用多种方式预览静态资源:
```bash
# 使用 serve 工具(推荐)
npx serve dist -p 3000
# 使用 http-server
npx http-server dist -p 3000
# 使用 Python 简单服务器
python -m http.server 3000 --directory dist
# 使用 Node.js 简单服务器
npx http-server dist
```
访问地址:
- 默认(扁平化模式):`http://localhost:3000/home.html`
- 策略分组模式:`http://localhost:3000/default/home.html`(使用 `--no-flatten`)
## 使用示例
### 默认扁平化构建
插件默认使用扁平化输出构建多策略应用:
```bash
# 默认扁平化构建,所有文件在根目录
npx vite-mp
# 高并发扁平化构建
npx vite-mp --concurrency 5
# 只构建移动端和平板端策略(默认扁平化)
npx vite-mp --strategy mobile,tablet
```
构建结果:
```
dist/
├── home.html # 默认策略页面
├── about.html # 默认策略页面
├── mobile.html # 移动端策略页面
├── tablet.html # 平板端策略页面
├── assets/ # 统一资源目录
│ ├── home-xxx.js
│ ├── about-xxx.js
│ ├── mobile-xxx.js
│ ├── tablet-xxx.js
│ └── shared-resource.svg
├── images/
├── favicon.ico
└── some.css
```
### 并发构建优化
根据机器性能调整并发数:
```bash
# 低配置机器:串行构建
npx vite-mp --concurrency 1
# 高配置机器:高并发构建
npx vite-mp --concurrency 8
# 调试模式查看构建进度
npx vite-mp --concurrency 4 --debug
```
### 生产环境部署
```bash
# 生产环境构建(默认扁平化)
npx vite-mp --concurrency 4
# 构建后可直接部署到CDN
# 所有资源都在根目录,便于CDN配置
```
## 环境变量
- `VITE_MULTI_PAGE_STRATEGY`: 当前构建策略(自动设置)
- `IS_MOBILE`: 移动端标识 (在 define 中配置)
- `API_BASE`: API 基础地址 (在 define 中配置)
## TypeScript 支持
插件完全支持 TypeScript 配置文件:
```typescript
// multipage.config.ts
import type { ConfigFunction } from '@fchc8/vite-plugin-multi-page';
const config: ConfigFunction = context => {
return {
entry: 'src/pages/**/*.{ts,js}',
// ... 其他配置
};
};
export default config;
```
## API 参考
### 配置选项
| 选项 | 类型 | 默认值 | 描述 |
| ------------- | -------------------------- | -------------------------- | ---------------- |
| `entry` | `string` | `'src/pages/**/*.{ts,js}'` | 页面入口匹配规则 |
| `template` | `string` | `'index.html'` | HTML 模板文件 |
| `placeholder` | `string` | `'{{ENTRY_FILE}}'` | 模板占位符 |
| `exclude` | `string[]` | `[]` | 排除的文件模式 |
| `debug` | `boolean` | `false` | 启用调试日志 |
| `strategies` | `Record<string, Strategy>` | `{}` | 构建策略配置 |
| `pageConfigs` | `Function \| Object` | `{}` | 页面配置 |
### CLI 参数
| 参数 | 类型 | 默认值 | 描述 |
| --------------- | --------- | ------- | -------------------------- |
| `--flatten` | `boolean` | `true` | 启用扁平化输出结构(默认) |
| `--no-flatten` | `boolean` | `false` | 禁用扁平化输出结构 |
| `--concurrency` | `number` | `3` | 并发构建数量 |
| `--strategy` | `string` | - | 指定构建策略(可多次使用) |
| `--debug` | `boolean` | `false` | 启用调试模式 |
| `--cwd` | `string` | - | 指定工作目录 |
| `--help` | `boolean` | `false` | 显示帮助信息 |
### 工具函数
```typescript
import { defineConfig } from '@fchc8/vite-plugin-multi-page';
// 定义配置
export default defineConfig(context => ({
// 配置选项
}));
```
## 示例项目
查看 [example](./example) 目录获取完整的示例项目。
## 许可证
MIT License