@lemon30_npm/csit-vue3 0.0.31 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.dev.md +485 -0
- package/README.md +27 -27
- package/dist/csit-vue3.js +672 -664
- package/dist/images-readme-dev/demo-complex-com.png +0 -0
- package/dist/images-readme-dev/demo-directory-ex.png +0 -0
- package/dist/images-readme-dev/demo-easy-com.png +0 -0
- package/dist/images-readme-dev/demo-menus-cui-ex.png +0 -0
- package/dist/images-readme-dev/demo-menus-tree.png +0 -0
- package/dist/images-readme-dev/demo-usedemo-com-ex.png +0 -0
- package/dist/index.css +1 -1
- package/dist/lib/ci-blue-line-title/index.css +1 -1
- package/dist/lib/ci-common-list/ci-common-list-layout/index.css +1 -1
- package/dist/lib/ci-common-list/ci-common-list-layout/index.vue.js +2 -2
- package/dist/lib/ci-common-list/ci-common-list-layout/index.vue2.js +13 -13
- package/dist/lib/ci-common-list/ci-common-list-query/index.css +1 -1
- package/dist/lib/ci-common-list/ci-common-list-query/index.js +1 -1
- package/dist/lib/ci-common-list/ci-common-list-query/index.vue.js +2 -2
- package/dist/lib/ci-common-list/ci-common-list-query/index.vue2.js +54 -52
- package/dist/lib/ci-common-list/ci-common-list-query-item/index.css +1 -0
- package/dist/lib/ci-common-list/ci-common-list-query-item/index.js +9 -0
- package/dist/lib/ci-common-list/ci-common-list-query-item/index.vue.js +7 -0
- package/dist/lib/ci-common-list/ci-common-list-query-item/index.vue2.js +21 -0
- package/dist/lib/ci-common-list/ci-common-list-start-end-datepicker/index.css +1 -1
- package/dist/lib/ci-common-list/ci-common-list-start-end-datepicker/index.vue.js +2 -2
- package/dist/lib/ci-page-header/index.css +1 -1
- package/dist/lib/ci-page-header/index.vue.js +1 -1
- package/dist/lib/ci-page-header/index.vue2.js +4 -4
- package/dist/lib/ci-upload/index.css +1 -1
- package/dist/lib/ci-upload/index.vue.js +3 -3
- package/dist/lib/ci-upload/index.vue2.js +28 -24
- package/dist/lib/components/index.js +26 -21
- package/dist/lib/images-readme-dev/demo-complex-com.png +0 -0
- package/dist/lib/images-readme-dev/demo-directory-ex.png +0 -0
- package/dist/lib/images-readme-dev/demo-easy-com.png +0 -0
- package/dist/lib/images-readme-dev/demo-menus-cui-ex.png +0 -0
- package/dist/lib/images-readme-dev/demo-menus-tree.png +0 -0
- package/dist/lib/images-readme-dev/demo-usedemo-com-ex.png +0 -0
- package/dist/lib/styles/reset-elementPlus/index.css +1 -0
- package/dist/types/src/components/components-project/ci-common-list/ci-common-list-query/hooks/useCollapseTransition.d.ts +11 -0
- package/dist/types/src/components/components-project/ci-common-list/ci-common-list-query/index.d.ts +4 -4
- package/dist/types/src/components/components-project/ci-common-list/ci-common-list-query-item/index.d.ts +8 -0
- package/dist/types/src/components/components-project/ci-common-list/ci-common-list-query-item/index.vue.d.ts +12 -0
- package/dist/types/src/components/components-project/ci-common-list/ci-common-list-query-item/type.d.ts +3 -0
- package/dist/types/src/components/index.d.ts +2 -1
- package/dist/types/src/layout/mock/local-dev-menus-tree/index.d.ts +1 -27
- package/dist/types/src/layout/mock/local-dev-menus-tree/menus-com-classify.d.ts +26 -0
- package/dist/types/src/layout/mock/local-dev-menus-tree/menus-cuiwenqing.d.ts +38 -0
- package/dist/types/src/layout/mock/local-dev-menus-tree/menus-lisi.d.ts +38 -0
- package/dist/types/src/layout/mock/local-dev-menus-tree/menus-more-developer.d.ts +38 -0
- package/dist/types/src/layout/mock/local-dev-menus-tree/menus-zhangsan.d.ts +38 -0
- package/dist/types/src/views-demo/usedemo-ci-upload/index.vue.d.ts +1 -0
- package/package.json +14 -4
- package/dist/lib/components/components-global/SvgIcon/index.vue.js +0 -26
- package/dist/lib/components/components-global/SvgIcon/index.vue2.js +0 -4
package/README.dev.md
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
|
|
2
|
+
# 🧩 csit-vue3 组件库 - 组件开发 - 开发者遵循规范
|
|
3
|
+
|
|
4
|
+
- 本文档专为参与维护/扩展该组件库的开发者编写,包含目录结构说明、组件编写规范、打包配置、文档写法等内容。
|
|
5
|
+
- 本文档用于指导组件库的开发规范,避免多人工程混乱,确保`按需引入`、自动生成 `exports`等机制正常运作。
|
|
6
|
+
- 本文档目的是让参与开发这个组件库的同事们 **明确规则、统一规范、提升效率,减少出错**。
|
|
7
|
+
|
|
8
|
+
## 1:组件目录规范说明
|
|
9
|
+
|
|
10
|
+
> 为了确保组件库的 **构建一致性**、**按需引入支持** 以及 **自动化导出脚本正常工作**,我们对组件的目录结构和命名方式做出了以下强制性约定。
|
|
11
|
+
|
|
12
|
+
### 1.1. 所有组件必须放置在
|
|
13
|
+
|
|
14
|
+
**`src/components/components-project/`**
|
|
15
|
+
|
|
16
|
+
### 1.2. 每个组件必须是一个**独立的文件夹**,且目录名必须满足以下要求
|
|
17
|
+
|
|
18
|
+
- 使用 `kebab-case` 命名风格,示例:`ci-blue-line-title`
|
|
19
|
+
- 以 `ci-` 开头(如 `ci-upload`, `ci-page-header`)
|
|
20
|
+
- 可支持多层级分类(可根据组件所属类别进行归类,清晰明了)(如 `ci-echarts/ci-echart-bar`、`ci-element-plus/ci-el-date-picker-daterange`)
|
|
21
|
+
|
|
22
|
+

|
|
23
|
+
|
|
24
|
+
> [!NOTE]
|
|
25
|
+
>
|
|
26
|
+
> **原因:**
|
|
27
|
+
>
|
|
28
|
+
> - ci- 前缀用于标识该目录为一个“最终组件目录”,即该目录下的内容会被视为一个完整组件用于打包。
|
|
29
|
+
> - 自动导出脚本会以 ci- 为特征开始递归查找组件文件结构,并生成对应的 package.json > exports 配置,**非 ci- 开头目录将被忽略**。
|
|
30
|
+
> - 确保多人协作时命名风格统一,避免命名混乱。
|
|
31
|
+
|
|
32
|
+
## 2:每个组件目录必须具备的内容
|
|
33
|
+
|
|
34
|
+
| 文件名 | 说明 |
|
|
35
|
+
| ------------------- | -------------------------------------------------------- |
|
|
36
|
+
| `index.ts` | 组件安装文件(用于 Vue 插件化安装) |
|
|
37
|
+
| `index.vue` | 组件主文件(模板 + 逻辑) |
|
|
38
|
+
| `type.ts` | 可选:暴露组件用到的类型,如 props 类型等 |
|
|
39
|
+
| `styles/index.less` | 可选:组件样式,最终打包后会变成 `index.css`,被自动导出 |
|
|
40
|
+
|
|
41
|
+
> [!NOTE]
|
|
42
|
+
>
|
|
43
|
+
> **原因:**
|
|
44
|
+
>
|
|
45
|
+
> - index.vue + index.ts 命名固定后,在使用 preserveModules 打包策略时,最终输出的文件名也会是 index.js 和 index.css,便于按需导入时路径规则一致。
|
|
46
|
+
> - 自动导出脚本是基于是否存在 index.js 来判断当前目录是否为组件终点节点(leaf node),如果文件命名不一致,将导致按需导出失效。
|
|
47
|
+
> - 确保团队在开发新组件时保持一致性,避免遗漏必要的导出或类型文件。
|
|
48
|
+
|
|
49
|
+
### 2.1. 简单组件开发模块化分类示例
|
|
50
|
+
|
|
51
|
+
<img src="./public/images-readme-dev/demo-easy-com.png" alt="alt text"/>
|
|
52
|
+
|
|
53
|
+
### 2.2. 复杂组件开发模块化分类示例
|
|
54
|
+
|
|
55
|
+
<img src="./public/images-readme-dev/demo-complex-com.png" alt="alt text"/>
|
|
56
|
+
|
|
57
|
+
> [!NOTE]
|
|
58
|
+
>
|
|
59
|
+
> 当开发复杂组件时,代码行数控制在 **500 ~ 600** 行之间,能分模块提取的内容参照`ci-upload`示例进行提取,提取的文件名必须遵循`见名知意`即可。
|
|
60
|
+
>
|
|
61
|
+
> 比如:**pages/components/views** (看到这些大家第一时间联想到的是 .vue 文件存放目录)、**model**(联想到数据层目录)、**styles**(联想到样式层目录)、**utils**(联想到工具层目录)、**hooks**(联想到组合式API层目录)等等。
|
|
62
|
+
>
|
|
63
|
+
> **代码需要加详细注释,以便于后续维护**
|
|
64
|
+
|
|
65
|
+
### 2.3. 编写`.vue`组件规范(以`index.vue`为核心)
|
|
66
|
+
|
|
67
|
+
> 为确保组件统一风格、可维护性强、结构清晰,所有组件的 .vue 文件需遵循以下编写规范。
|
|
68
|
+
|
|
69
|
+
#### 2.3.1. 命名与基础结构
|
|
70
|
+
|
|
71
|
+
> 组件名必须显式声明,且遵循目录名的大驼峰命名法(PascalCase)
|
|
72
|
+
|
|
73
|
+
每个组件的 name 属性必须显式声明,并保持与组件目录名一致(转为大驼峰命名):
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<script lang="ts">
|
|
77
|
+
export default {
|
|
78
|
+
name: 'CiBlueLineTitle', // 必须与目录 ci-blue-line-title 对应
|
|
79
|
+
}
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
好的示例:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
ci-blue-line-title/
|
|
87
|
+
└── index.vue // name: 'CiBlueLineTitle'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
错误示例:
|
|
91
|
+
|
|
92
|
+
- 缺少 name 定义
|
|
93
|
+
- 命名与目录不一致,如 BlueLine、TitleComponent
|
|
94
|
+
|
|
95
|
+
#### 2.3.2. 样式规范
|
|
96
|
+
|
|
97
|
+
> 禁止在.vue中直接写样式,必须模块化样式至styles/文件夹中(参考: 2.2),或者简单样式模块化至当前组件目录中(参考: 2.1)
|
|
98
|
+
|
|
99
|
+
组件样式必须单独存放在 styles/ 目录下,并通过模块方式引入:
|
|
100
|
+
|
|
101
|
+
```vue
|
|
102
|
+
<style lang="less" scoped>
|
|
103
|
+
@import url('./styles/xxx.less'); // 如果样式文件放到styles目录下
|
|
104
|
+
</style>
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
<style lang="less" scoped>
|
|
108
|
+
@import url('./xxx.less'); // 如果样式文件放到当前目录下
|
|
109
|
+
</style>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
推荐结构:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
ci-blue-line-title/
|
|
116
|
+
├── index.vue
|
|
117
|
+
└── styles/
|
|
118
|
+
└── index.less
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
禁止以下写法:
|
|
122
|
+
|
|
123
|
+
```vue
|
|
124
|
+
<style lang="less" scoped>
|
|
125
|
+
/* ❌ 不允许在.vue中直接写样式 */
|
|
126
|
+
.CiNoDataStatus {
|
|
127
|
+
width: 100%;
|
|
128
|
+
height: 100%;
|
|
129
|
+
/* ... */
|
|
130
|
+
}
|
|
131
|
+
</style>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### 2.3.3. Props 处理方式
|
|
135
|
+
|
|
136
|
+
> 必须使用defineProps + withDefaults 的组合式 props 定义方式(支持类型推导和默认值设置)来定义默认值
|
|
137
|
+
|
|
138
|
+
标准写法:
|
|
139
|
+
|
|
140
|
+
```vue
|
|
141
|
+
<script lang="ts">
|
|
142
|
+
import { defineProps, withDefaults } from 'vue'
|
|
143
|
+
import type { BlueLineTitleProps } from './type'
|
|
144
|
+
|
|
145
|
+
const props = withDefaults(defineProps<BlueLineTitleProps>(), {
|
|
146
|
+
title: '默认标题',
|
|
147
|
+
color: '#3573f3',
|
|
148
|
+
})
|
|
149
|
+
</script>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
不建议使用的旧写法(🚫 错误)
|
|
153
|
+
|
|
154
|
+
```vue
|
|
155
|
+
<script lang="ts">
|
|
156
|
+
// ❌ 不推荐
|
|
157
|
+
defineProps({
|
|
158
|
+
title: {
|
|
159
|
+
type: String,
|
|
160
|
+
default: '默认标题'
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
</script>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
使用 withDefaults 的好处:
|
|
167
|
+
|
|
168
|
+
- 更强的类型推导
|
|
169
|
+
- 更符合 Vue 3 SFC 的最佳实践
|
|
170
|
+
- 默认值更直观、可维护性更强
|
|
171
|
+
|
|
172
|
+
#### 2.3.4. `.vue`组件体积控制与逻辑拆分
|
|
173
|
+
|
|
174
|
+
> 单文件组件`.vue`文件 不应超过500 ~ 600行
|
|
175
|
+
>
|
|
176
|
+
> 为保持代码可读性和团队协作效率,组件内容超过一定行数时,必须拆分。
|
|
177
|
+
|
|
178
|
+
拆分建议如下(示例结构参考:2.2):
|
|
179
|
+
|
|
180
|
+
| **情况** | **拆分建议** |
|
|
181
|
+
| --------------------- | ---------------------------------------------------------- |
|
|
182
|
+
| template 模板区域过长 | 将 UI 拆分为子组件 |
|
|
183
|
+
| setup 中逻辑函数过多 | 拆分为模块化函数文件,例如:useXXX.ts、logic.ts、helper.ts |
|
|
184
|
+
| 响应式变量过多 | 考虑适当合并或封装成 composable |
|
|
185
|
+
|
|
186
|
+
#### 2.3.5. 总结
|
|
187
|
+
|
|
188
|
+
请严格遵循上述约定,统一团队开发风格,确保以下目标:
|
|
189
|
+
|
|
190
|
+
- 支持自动化导出和按需引入
|
|
191
|
+
- 保持组件结构清晰可维护
|
|
192
|
+
- 符合现代 Vue 3 开发最佳实践
|
|
193
|
+
|
|
194
|
+
如有不符合规范的代码,提交前请调整为统一格式,或通过代码审查发现后统一修正。
|
|
195
|
+
|
|
196
|
+
### 2.4. `index.ts`文件介绍和编写示例
|
|
197
|
+
|
|
198
|
+
#### 2.4.1. 介绍
|
|
199
|
+
|
|
200
|
+
> “每个组件都必须有 index.ts 文件,否则将无法支持按需引入。”
|
|
201
|
+
|
|
202
|
+
**`index.ts`是组件的导出入口文件,主要职责如下**
|
|
203
|
+
|
|
204
|
+
- 注册组件(如添加 .install 方法,支持 app.use() 全局注册)
|
|
205
|
+
- 导出组件本体(默认导出 Vue 组件)
|
|
206
|
+
- 导出相关类型(通过 export * from './type' 等方式)
|
|
207
|
+
- index.ts 的存在对于支持组件**全量引入**与**按需引入**非常关键。
|
|
208
|
+
|
|
209
|
+
#### 2.4.2. 示例
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
// 引入 Vue 的 App 类型,用于为组件添加 install 方法时提供类型支持
|
|
213
|
+
import type { App } from 'vue'
|
|
214
|
+
// 引入当前组件的 vue 文件
|
|
215
|
+
import _CiBlueLineTitle from './index.vue'
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* 这个变量带上 install 方法 & 类型断言
|
|
219
|
+
* 1: app.use CiBlueLineTitle 时,Vue 会调用这个 install 方法来注册组件
|
|
220
|
+
* 2: 防止 app.use CiBlueLineTitle 时,Vue 无法识别组件类型
|
|
221
|
+
*/
|
|
222
|
+
const CiBlueLineTitle = _CiBlueLineTitle as typeof _CiBlueLineTitle & {
|
|
223
|
+
install: (app: App) => void
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// 为组件添加 install 方法,使其可以通过 app.use() 全局注册
|
|
227
|
+
CiBlueLineTitle.install = (app: App) => {
|
|
228
|
+
// 注册组件,组件名称通过 name 属性指定
|
|
229
|
+
app.component(CiBlueLineTitle.name as string, CiBlueLineTitle)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// 具名导出(完整生态约定)
|
|
233
|
+
export { CiBlueLineTitle }
|
|
234
|
+
|
|
235
|
+
// 默认导出(完整生态约定)
|
|
236
|
+
export default CiBlueLineTitle
|
|
237
|
+
|
|
238
|
+
// 将 type.ts 中定义的类型全部具名导出,方便外部在按需导入组件时也能使用相关类型(完整生态约定)
|
|
239
|
+
export * from './type'
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## `番外:`自动生成 `exports` 规则说明
|
|
244
|
+
|
|
245
|
+
我们提供了一个自动脚本,会递归分析 `dist/lib` 和 `dist/types/...` 生成 package.json 中的 `exports` 字段,方便支持按需引入。
|
|
246
|
+
|
|
247
|
+
### 脚本规则
|
|
248
|
+
|
|
249
|
+
- 从 `dist/lib/` 开始递归,**只识别以 `ci-` 开头**的目录为组件。
|
|
250
|
+
- 组件目录下必须有 `index.js` 表示是一个“组件终点”。
|
|
251
|
+
- 如果有 `index.css`,则自动生成 `./ci-xxx/style/index.css` 入口。
|
|
252
|
+
- 类型文件根据 `dist/types/src/components/components-project/...` 匹配生成。
|
|
253
|
+
|
|
254
|
+
## 3:组件开发过程中,如何进行组件效果的预览规范说明
|
|
255
|
+
|
|
256
|
+
> 为了规范组件开发过程中的调试方式,提升协作效率,业务组件库提供了统一的**组件预览机制**。开发者需按照以下规则进行组件预览页的创建与管理。
|
|
257
|
+
|
|
258
|
+
### 3.1 预览目录结构规范
|
|
259
|
+
|
|
260
|
+
**当你在 src/components/components-project/ 下开发完成一个组件后,需在 src/views-demo/ 下创建对应的预览模块以进行调试与功能验证。**
|
|
261
|
+
|
|
262
|
+
| **项目** | **说明** |
|
|
263
|
+
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
264
|
+
| src/views-demo/ | 专用于放置组件开发过程中的预览用例,每个组件对应一个子目录 |
|
|
265
|
+
| 子目录命名要求 | 必须以 `usedemo-`开头 + 组件目录名,采用 `kebab-case` 命名规则 示例:`usedemo-ci-blue-line-title` |
|
|
266
|
+
| index.vue | 预览页的入口组件,所有人统一命名为 `index.vue` |
|
|
267
|
+
| 可选目录结构 | `- model/`:存放当前预览模块的状态模型或数据`- api/`:存放当前预览模块的接口请求逻辑`- mock/`:如需本地 mock 接口,请放于此`- styles/`:模块样式专用目录 |
|
|
268
|
+
|
|
269
|
+
#### 3.1.1. 示例结构
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
src/
|
|
273
|
+
├── components/
|
|
274
|
+
│ └── components-project/
|
|
275
|
+
│ └── ci-blue-line-title/
|
|
276
|
+
│ ├── index.vue
|
|
277
|
+
│ └── index.ts
|
|
278
|
+
├── views-demo/
|
|
279
|
+
│ └── usedemo-ci-blue-line-title/
|
|
280
|
+
│ ├── index.vue
|
|
281
|
+
│ ├── model/
|
|
282
|
+
│ ├── api/
|
|
283
|
+
│ ├── mock/
|
|
284
|
+
│ └── styles/
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
#### 3.1.2. 示例结构图
|
|
288
|
+
|
|
289
|
+

|
|
290
|
+
|
|
291
|
+
### 3.2 路由管理规范
|
|
292
|
+
|
|
293
|
+
**所有用于预览的组件模块,都需要在统一的路由管理文件中注册。**
|
|
294
|
+
|
|
295
|
+
| **文件路径** | **说明** |
|
|
296
|
+
| ------------------------------ | ------------------------------------------ |
|
|
297
|
+
| src/views-demo/routes/index.ts | 统一维护所有组件预览模块的路由配置入口文件 |
|
|
298
|
+
|
|
299
|
+
#### 3.2.1 子模块路由定义方式
|
|
300
|
+
|
|
301
|
+
每个预览模块内需提供 routes/index.ts 路由定义文件,并在主路由入口中集中注册。
|
|
302
|
+
|
|
303
|
+
示例:src/views-demo/usedemo-ci-blue-line-title/routes/index.ts
|
|
304
|
+
|
|
305
|
+
```ts
|
|
306
|
+
export default [
|
|
307
|
+
{
|
|
308
|
+
path: 'usedemoCiBlueLineTitle', // 必须以 usedemo 开头 + CamelCase 命名
|
|
309
|
+
name: 'usedemoCiBlueLineTitle',
|
|
310
|
+
component: () => import('../index.vue'),
|
|
311
|
+
},
|
|
312
|
+
]
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
然后在 src/views-demo/routes/index.ts 中统一引入并注册:
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
import usedemoCiBlueLineTitle from '../usedemo-ci-blue-line-title/routes'
|
|
319
|
+
|
|
320
|
+
export default [...usedemoCiBlueLineTitle]
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
> [!IMPORTANT]
|
|
324
|
+
>
|
|
325
|
+
> **注意事项:**
|
|
326
|
+
>
|
|
327
|
+
> 所有预览路径必须以 `usedemo` 开头,方便统一管理。
|
|
328
|
+
>
|
|
329
|
+
> 路由名称统一采用 `CamelCase` 命名方式,例如:`usedemoCiBlueLineTitle`
|
|
330
|
+
|
|
331
|
+
#### 3.2.2 总结要求
|
|
332
|
+
|
|
333
|
+
| **类型** | **要求** |
|
|
334
|
+
| -------------- | ---------------------------------------------------------------------------- |
|
|
335
|
+
| 模块目录命名 | `usedemo-` + 组件目录名(`kebab-case`) |
|
|
336
|
+
| 路由 path/name | 必须 `usedemo` 开头,`CamelCase` 命名 |
|
|
337
|
+
| 模块主入口文件 | 必须存在 `index.vue` |
|
|
338
|
+
| 可选支持目录 | `model/`、`api/`、`mock/`、`styles/` |
|
|
339
|
+
| 路由配置注册 | 每个模块提供 `routes/index.ts`,并统一注册到 `views-demo/routes/index.ts` 中 |
|
|
340
|
+
|
|
341
|
+
## 4:左侧抽屉菜单 - 组件菜单维护说明
|
|
342
|
+
|
|
343
|
+
> 为了方便开发者在本地调试和预览自己编写的组件,组件库提供了**菜单渲染机制**,用于在菜单栏中显示“组件开发预览入口”。
|
|
344
|
+
|
|
345
|
+
### 4.1. 整体效果示例图
|
|
346
|
+
|
|
347
|
+

|
|
348
|
+
|
|
349
|
+
### 4.2. 目录结构说明
|
|
350
|
+
|
|
351
|
+
开发者的本地预览菜单配置,统一放在如下目录:
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
src/layout/mock/local-dev-menus-tree/
|
|
355
|
+
├── index.ts // 所有开发者菜单的汇总入口
|
|
356
|
+
├── menus-lisi.ts // 示例:由 李四 编写的本地菜单配置
|
|
357
|
+
├── menus-zhangsan.ts // 示例:由 张三 编写的本地菜单配置
|
|
358
|
+
└── ...
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
> 所有开发者的菜单文件 **必须以 menus- 为前缀命名**,并使用**全拼**命名,如:menus-zhangsan.ts、menus-lisi.ts。
|
|
362
|
+
|
|
363
|
+
### 4.3. 如何在左侧抽屉菜单中添加自己的组件预览菜单?
|
|
364
|
+
|
|
365
|
+
#### 4.3.1. 在目录中创建自己的菜单模块文件
|
|
366
|
+
|
|
367
|
+
例如,你的名字是 “李四”,则新建一个文件:
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
src/layout/mock/local-dev-menus-tree/menus-lisi.ts
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
#### 4.3.2. 每位开发者的菜单文件结构
|
|
374
|
+
|
|
375
|
+
每个开发者的菜单模块,必须默认导出一个“树形结构”的菜单数据数组。**以下字段规则必须遵守**:
|
|
376
|
+
|
|
377
|
+
| **字段名** | **类型** | **是否必填** | **说明** |
|
|
378
|
+
| ------------ | -------- | ------------ | ----------------------------------------------------------------------------------------------------------- |
|
|
379
|
+
| menuId | string | ✅ 必填 | 菜单唯一标识(需自行定义,确保唯一) |
|
|
380
|
+
| menuTitle | string | ✅ 必填 | 菜单名称。顶级菜单填写**你的名字**,子级菜单填写**功能或组件名** |
|
|
381
|
+
| menuUrl | string | ✅ 必填 | 页面路由地址(仅子级菜单需填写,顶级菜单无需填写)<br /><br />页面路由地址:'/' + views-demo/routes中的path |
|
|
382
|
+
| menuIcon | string | ❌ 可选 | 菜单图标,默认使用系统图标 |
|
|
383
|
+
| menuOrderNum | number | ❌ 可选 | 菜单排序号,当前未启用 |
|
|
384
|
+
| menuDescrib | string | ❌ 可选 | 菜单描述,当前未启用 |
|
|
385
|
+
| menuParentId | string | ✅ 必填 | 父级菜单的 menuId,**顶级菜单请统一填写 'iadw'** |
|
|
386
|
+
| menuType | string | ❌ 可选 | 菜单类型,当前未启用 |
|
|
387
|
+
| target | string | ❌ 可选 | 打开方式,当前未启用 |
|
|
388
|
+
| keepAlive | boolean | ❌ 可选 | 是否缓存页面,当前未启用 |
|
|
389
|
+
| children | array | ❌ 可选 | 子菜单数组,结构同上,支持多级嵌套 |
|
|
390
|
+
|
|
391
|
+
示例:menus-zhangsan.ts
|
|
392
|
+
|
|
393
|
+
```ts
|
|
394
|
+
export default {
|
|
395
|
+
menuId: 'menu-zhangsan-root',
|
|
396
|
+
menuTitle: '张三',
|
|
397
|
+
menuParentId: 'iadw', // 顶级菜单统一使用 iadw
|
|
398
|
+
children: [
|
|
399
|
+
{
|
|
400
|
+
menuId: 'menu-zhangsan-ci-upload',
|
|
401
|
+
menuTitle: 'CiUpload 组件预览',
|
|
402
|
+
menuUrl: '/usedemoCiUpload',
|
|
403
|
+
menuParentId: 'menu-zhangsan-root',
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
menuId: 'menu-zhangsan-ci-blue-line-title',
|
|
407
|
+
menuTitle: 'CiBlueLineTitle 标题组件',
|
|
408
|
+
menuUrl: '/usedemoCiBlueLineTitle',
|
|
409
|
+
menuParentId: 'menu-zhangsan-root',
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
> [!IMPORTANT]
|
|
417
|
+
>
|
|
418
|
+
> 也可参考示例文件:src/layout/mock/local-dev-menus-tree/menus-cuiwenqing.ts
|
|
419
|
+
|
|
420
|
+

|
|
421
|
+
|
|
422
|
+
#### 4.3.3. 将你的菜单文件注册到总入口
|
|
423
|
+
|
|
424
|
+
编辑 src/layout/mock/local-dev-menus-tree/index.ts:
|
|
425
|
+
|
|
426
|
+
```ts
|
|
427
|
+
import MenusZhangsan from './menus-zhangsan'
|
|
428
|
+
// 其他人的菜单引入...
|
|
429
|
+
|
|
430
|
+
export default [
|
|
431
|
+
// 组件开发负责人 - 张三
|
|
432
|
+
MenusZhangsan,
|
|
433
|
+
|
|
434
|
+
// 其他人菜单合并...
|
|
435
|
+
]
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
> [!TIP]
|
|
439
|
+
>
|
|
440
|
+
> 配置完成后,你的菜单将出现在左侧菜单栏的“组件开发预览”区域,点击即可跳转到你开发中的组件页面进行调试和预览。
|
|
441
|
+
|
|
442
|
+
## 5:项目启动与构建发布命令说明
|
|
443
|
+
|
|
444
|
+
> **本章节用于指导开发者如何正确启动组件库项目、编写文档、执行打包及发布流程。所有命令均已在 package.json 中配置。**
|
|
445
|
+
|
|
446
|
+
### 5.1 启动开发环境
|
|
447
|
+
|
|
448
|
+
组件开发阶段,可选择不同环境模式进行调试:
|
|
449
|
+
|
|
450
|
+
| **命令** | **说明** |
|
|
451
|
+
| -------------------- | ---------------------------------------------------------------------------------------------- |
|
|
452
|
+
| npm run dev-mock | 启动组件库开发模式,使用本地 Mock 数据模拟后端接口,适用于**组件开发初期、接口未联调时使用**。 |
|
|
453
|
+
| npm run dev-liantiao | 启动组件库开发模式,使用真实后端接口联调,适用于**后期联调测试与功能验证阶段**。 |
|
|
454
|
+
|
|
455
|
+
### 5.2 文档开发与预览
|
|
456
|
+
|
|
457
|
+
配套组件文档使用 [VitePress](https://vitepress.dev/) 进行编写与构建:
|
|
458
|
+
|
|
459
|
+
| **命令** | **说明** |
|
|
460
|
+
| -------------------- | ----------------------------------------------------------------- |
|
|
461
|
+
| npm run docs:dev | 启动文档开发服务器,实时预览 .md 文档变更,适合文档编写阶段使用。 |
|
|
462
|
+
| npm run docs:build | 构建静态文档产物,输出至 .vitepress/dist 目录,用于生产部署。 |
|
|
463
|
+
| npm run docs:preview | 预览构建完成后的文档站点,模拟线上访问效果。 |
|
|
464
|
+
|
|
465
|
+
> 文档编辑完成后,建议执行 docs:preview 进行本地验收。
|
|
466
|
+
|
|
467
|
+
### 5.3 构建组件库产物
|
|
468
|
+
|
|
469
|
+
| **命令** | **说明** |
|
|
470
|
+
| ------------- | ----------------------------------------------------------------------------------------------------------- |
|
|
471
|
+
| npm run build | 执行组件库构建任务,会自动打包出:全量引入版本 + 按需引入版本 产物,并生成类型声明文件。输出至 dist/ 目录。 |
|
|
472
|
+
|
|
473
|
+
### 5.4 发布组件库到 NPM
|
|
474
|
+
|
|
475
|
+
| **命令** | **说明** |
|
|
476
|
+
| ----------- | ------------------------------------------------------- |
|
|
477
|
+
| npm publish | 将构建完成的组件库发布到 NPM 仓库,供业务项目安装使用。 |
|
|
478
|
+
|
|
479
|
+
> ⚠️ 发布前请确保以下工作已完成:
|
|
480
|
+
|
|
481
|
+
- **本地构建成功**(运行 npm run build 无误)
|
|
482
|
+
- **功能自测通过**(组件功能正常、无明显 bug)
|
|
483
|
+
- **代码已 Review**(经团队审查通过)
|
|
484
|
+
- **文档已完善**(至少包含组件说明和示例)
|
|
485
|
+
- **版本号已更新**(遵循 [Semver 语义化版本规范](https://semver.org/lang/zh-CN/))
|
package/README.md
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# 🧩 csit-vue3 组件库
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **一个基于 Vue 3 + Element Plus 封装的业务组件库,提供统一的 UI 规范和业务逻辑组件,提升团队开发效率。**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 📦 安装方式
|
|
5
|
+
## 1. 安装方式
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
8
|
# 使用 npm
|
|
@@ -34,13 +32,11 @@ pnpm add csit-vue3
|
|
|
34
32
|
- "moment": "^2.30.1"
|
|
35
33
|
- "lodash": "^4.17.21"
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
## 🚀 快速开始
|
|
35
|
+
## 2. 快速开始
|
|
40
36
|
|
|
41
|
-
|
|
37
|
+
> **本节将介绍如何在项目中使用 cist-vue3。**
|
|
42
38
|
|
|
43
|
-
### 完整引入
|
|
39
|
+
### 2.1. 完整引入
|
|
44
40
|
|
|
45
41
|
如果你对打包后的文件大小不是很在乎,那么使用完整导入会更方便。
|
|
46
42
|
|
|
@@ -64,9 +60,11 @@ app.mount("#app");
|
|
|
64
60
|
|
|
65
61
|
以上代码便完成了 cist-vue3 的引入。需要注意的是,样式文件需要单独引入。
|
|
66
62
|
|
|
67
|
-
### 按需导入
|
|
63
|
+
### 2.2. 按需导入
|
|
68
64
|
|
|
69
|
-
|
|
65
|
+
> **组件库默认支持按需引入,你可以只引入你所需要的组件,而无需引入整个组件库。**
|
|
66
|
+
|
|
67
|
+
#### 2.2.1. 示例: `main.ts`按需导入
|
|
70
68
|
|
|
71
69
|
接下来,如果你只希望引入部分组件,比如 CiUpload 和 CiCommonListLayout 和 CiPageHeader,那么需要在 main.ts 中写入以下内容:
|
|
72
70
|
|
|
@@ -103,7 +101,7 @@ import CiUpload from 'csit-vue3/ci-upload'
|
|
|
103
101
|
import CiPageHeader from 'csit-vue3/ci-page-header'
|
|
104
102
|
```
|
|
105
103
|
|
|
106
|
-
####
|
|
104
|
+
#### 2.2.2. 示例: `.vue`单组件中使用某个组件
|
|
107
105
|
|
|
108
106
|
```html
|
|
109
107
|
<template>
|
|
@@ -119,11 +117,11 @@ import CiBlueLineTitle from 'csit-vue3/ci-blue-line-title'
|
|
|
119
117
|
</style>
|
|
120
118
|
```
|
|
121
119
|
|
|
122
|
-
#### 按需导入规则和建议
|
|
120
|
+
#### 2.2.3. 按需导入规则和建议
|
|
123
121
|
|
|
124
122
|
相信细心的小伙伴们会有疑问了❓ 按需导入时 import xxx from 'csit-vue3/yyy'; 后面的yyy是什么值呢❓
|
|
125
123
|
|
|
126
|
-
##### 规则解释如下
|
|
124
|
+
##### 2.2.3.1. 规则解释如下
|
|
127
125
|
|
|
128
126
|
```ts
|
|
129
127
|
// 组件导入模版
|
|
@@ -143,7 +141,7 @@ import "csit-vue3/ci-common-list-layout/style/index.css;
|
|
|
143
141
|
// zzz: zzz值同理yyy值解释
|
|
144
142
|
```
|
|
145
143
|
|
|
146
|
-
#####
|
|
144
|
+
##### 2.2.3.2. 建议📢
|
|
147
145
|
|
|
148
146
|
```ts
|
|
149
147
|
// 样式不建议按需导入, 建议 main.ts 中直接全量导入, 清晰且不易出现问题
|
|
@@ -152,7 +150,7 @@ import "csit-vue3/ci-common-list-layout/style/index.css;
|
|
|
152
150
|
import "csit-vue3/dist/index.css";
|
|
153
151
|
```
|
|
154
152
|
|
|
155
|
-
#####
|
|
153
|
+
##### `番外:` **常见命名风格比较**
|
|
156
154
|
|
|
157
155
|
| **风格** | **示例** | **常见场景** |
|
|
158
156
|
| ---------- | ------------------ | ---------------------------------------- |
|
|
@@ -161,11 +159,11 @@ import "csit-vue3/dist/index.css";
|
|
|
161
159
|
| snake_case | ci_blue_line_title | Python变量、文件名、数据库字段 |
|
|
162
160
|
| kebab-case | ci-blue-line-title | 文件/文件夹、HTML/CSS 类名、自定义组件名 |
|
|
163
161
|
|
|
164
|
-
### "优雅的"按需导入(自动导入)【!!!推荐】
|
|
162
|
+
### 2.3. "优雅的"按需导入(自动导入)【!!!推荐】
|
|
165
163
|
|
|
166
164
|
> 为你使用的 csit-vue3 组件库提供一个 unplugin-vue-components 的 Resolver,就像 ElementPlusResolver 一样,支持按名称自动引入组件。
|
|
167
165
|
|
|
168
|
-
#### 背景介绍
|
|
166
|
+
#### 2.3.1. 背景介绍
|
|
169
167
|
|
|
170
168
|
`Element Plus`按需导入之自动导入写法(点击查看[官方文档🔗](https://element-plus.org/zh-CN/guide/quickstart.html#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5))
|
|
171
169
|
|
|
@@ -174,7 +172,7 @@ import "csit-vue3/dist/index.css";
|
|
|
174
172
|
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
|
175
173
|
```
|
|
176
174
|
|
|
177
|
-
|
|
175
|
+
**为什么ElementPlusResolver能直接用?**
|
|
178
176
|
|
|
179
177
|
因为:
|
|
180
178
|
|
|
@@ -184,25 +182,25 @@ import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
|
|
184
182
|
|
|
185
183
|
🔗 官方文档:<https://github.com/antfu/unplugin-vue-components#resolvers>
|
|
186
184
|
|
|
187
|
-
|
|
185
|
+
**如何让你自己使用的 csit-vue3 组件库也能像ElementPlusResolver那样?**
|
|
188
186
|
|
|
189
187
|
- 很简单,你只需要自己手动写一个 Resolver
|
|
190
188
|
|
|
191
|
-
#### 实战代码示例
|
|
189
|
+
#### 2.3.2. 实战代码示例
|
|
192
190
|
|
|
193
|
-
|
|
191
|
+
##### 2.3.2.1 完成如下步骤即可
|
|
194
192
|
|
|
195
193
|
1. 你需要使用额外的插件来导入要使用的组件,你需要安装`unplugin-vue-components` 这款插件。
|
|
196
194
|
2. 你需要手写一个 Resolver。
|
|
197
195
|
3. 把`unplugin-vue-components`插件配置到 `Vite` 的配置文件中
|
|
198
196
|
|
|
199
|
-
#####
|
|
197
|
+
##### 2.3.2.2. 安装插件
|
|
200
198
|
|
|
201
199
|
```bash
|
|
202
200
|
npm install -D unplugin-vue-components
|
|
203
201
|
```
|
|
204
202
|
|
|
205
|
-
##### 2. 在你的项目中手写 Resolver
|
|
203
|
+
##### 2.3.2.3. 在你的项目中手写 Resolver
|
|
206
204
|
|
|
207
205
|
```ts
|
|
208
206
|
/**
|
|
@@ -237,7 +235,7 @@ export function CsitComponentResolver() {
|
|
|
237
235
|
}
|
|
238
236
|
```
|
|
239
237
|
|
|
240
|
-
##### 3. 把`unplugin-vue-components`插件配置到 `Vite` 的配置文件中
|
|
238
|
+
##### 2.3.2.4. 把`unplugin-vue-components`插件配置到 `Vite` 的配置文件中
|
|
241
239
|
|
|
242
240
|
```ts
|
|
243
241
|
import { defineConfig } from 'vite'
|
|
@@ -253,7 +251,9 @@ export default defineConfig({
|
|
|
253
251
|
})
|
|
254
252
|
```
|
|
255
253
|
|
|
256
|
-
|
|
254
|
+
> [!WARNING]
|
|
255
|
+
>
|
|
256
|
+
> ⚠️ 注意:样式文件我们就不支持按需导入了,我们建议:在 main.ts 中全量引入所有组件样式
|
|
257
257
|
|
|
258
258
|
```ts
|
|
259
259
|
// 样式不建议按需导入, 建议 main.ts 中直接全量导入, 清晰且不易出现问题
|
|
@@ -301,7 +301,7 @@ export default defineConfig({
|
|
|
301
301
|
})
|
|
302
302
|
```
|
|
303
303
|
|
|
304
|
-
##
|
|
304
|
+
## 3. 示例组件使用
|
|
305
305
|
|
|
306
306
|
```html
|
|
307
307
|
<template>
|