create-vite-vue 1.4.0 → 1.5.1
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.md +269 -0
- package/bin/index.js +79 -81
- package/package.json +1 -1
- package/template/base-js/package.json.tpl +4 -4
- package/template/base-ts/package.json.tpl +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# ⚡ create-vite-vue
|
|
2
|
+
|
|
3
|
+
🚀 一个开箱即用的 Vue 3 项目快速生成工具
|
|
4
|
+
基于 Vite 构建,支持按需组合常用技术栈,直接生成可落地的项目结构。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## ✨ 特性一览
|
|
9
|
+
|
|
10
|
+
- ⚡ 基于 Vite + Vue 3,启动快、构建快
|
|
11
|
+
- 📜 支持 JavaScript / TypeScript 自由选择
|
|
12
|
+
- 🧭 可选集成 Vue Router(支持动态参数路由)
|
|
13
|
+
- 🗂️ 可选集成 Pinia(含持久化)
|
|
14
|
+
- 📡 内置 Axios 请求方案
|
|
15
|
+
- 🖥️ / 📱 支持 Element Plus / Vant
|
|
16
|
+
- 🧰 常用工具库可选:VueUse / Lodash / Day.js
|
|
17
|
+
- 🧩 结构清晰,适合直接写业务
|
|
18
|
+
- 🔧 内置 Vite 配置优化构建输出和资源路径
|
|
19
|
+
- 🌐 本地及网络访问启动日志显示
|
|
20
|
+
- 📝 自定义 Banner 插件显示项目信息
|
|
21
|
+
- 🎨 可选集成 Tailwind CSS(通过 postcss 配置)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🧩 技术栈
|
|
26
|
+
|
|
27
|
+
⚡ Vite
|
|
28
|
+
🟢 Vue 3
|
|
29
|
+
📜 JavaScript / 🔷 TypeScript
|
|
30
|
+
🧭 Vue Router
|
|
31
|
+
🗂️ Pinia
|
|
32
|
+
📡 Axios
|
|
33
|
+
🖥️ Element Plus / 📱 Vant
|
|
34
|
+
🧰 VueUse · Lodash · Day.js
|
|
35
|
+
🎨 Tailwind CSS
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 📦 生成后的项目包含什么?
|
|
40
|
+
|
|
41
|
+
根据你的选择,工具会自动生成一个标准化 Vue 3 项目结构,主要包括:
|
|
42
|
+
|
|
43
|
+
### 基础内容(必选)
|
|
44
|
+
|
|
45
|
+
- 项目入口页面
|
|
46
|
+
- src 源码目录
|
|
47
|
+
- 项目启动入口文件
|
|
48
|
+
- 根组件与默认欢迎页
|
|
49
|
+
- 全局样式文件
|
|
50
|
+
- Vite 配置文件
|
|
51
|
+
- 依赖管理文件(已自动注入所选功能)
|
|
52
|
+
- 路径别名配置(@ 指向 src)
|
|
53
|
+
- postcss.config.mjs(Tailwind CSS 配置,可选)
|
|
54
|
+
|
|
55
|
+
这些内容已经帮你处理好基础配置,可直接开始开发,无需清理模板代码。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 📁 项目目录结构说明
|
|
60
|
+
|
|
61
|
+
project-name
|
|
62
|
+
├─ public/ —— 公共静态资源目录
|
|
63
|
+
│ └─ favicon.ico
|
|
64
|
+
├─ src/
|
|
65
|
+
│ ├─ api/ —— 接口请求封装目录
|
|
66
|
+
│ ├─ assets/ —— 图片、字体等静态资源
|
|
67
|
+
│ ├─ components/ —— 公共组件目录
|
|
68
|
+
│ ├─ router/ —— 路由配置(可选)
|
|
69
|
+
│ ├─ stores/ —— Pinia 状态管理(可选)
|
|
70
|
+
│ ├─ types/ —— 类型声明文件
|
|
71
|
+
│ ├─ utils/ —— 工具方法、请求封装
|
|
72
|
+
│ ├─ views/ —— 页面级组件(路由页面)
|
|
73
|
+
│ │ └─ home/ —— 示例页面文件夹
|
|
74
|
+
│ │ ├─ index.vue —— 默认首页 /home
|
|
75
|
+
│ │ ├─ meta.json —— 页面 meta 信息
|
|
76
|
+
│ │ └─ [id]/ —— 动态参数路由示例
|
|
77
|
+
│ │ └─ [name].vue —— 路由 /home/:id/:name
|
|
78
|
+
│ ├─ App.vue —— 根组件
|
|
79
|
+
│ ├─ main.js / main.ts —— 项目启动入口
|
|
80
|
+
│ └─ style.css —— 全局样式文件
|
|
81
|
+
├─ index.html —— 项目入口页面
|
|
82
|
+
├─ jsconfig.json / tsconfig.json —— 路径别名与编译配置
|
|
83
|
+
├─ package.json —— 项目依赖与脚本配置
|
|
84
|
+
├─ postcss.config.mjs —— Tailwind CSS 配置文件(可选)
|
|
85
|
+
├─ README.md —— 项目说明文档
|
|
86
|
+
└─ vite.config.ts —— Vite 开发与构建配置
|
|
87
|
+
|
|
88
|
+
### 目录说明(白话版)
|
|
89
|
+
|
|
90
|
+
- **public**:放不会被打包处理的静态资源
|
|
91
|
+
- **assets**:项目中使用的图片、字体等资源
|
|
92
|
+
- **components**:可复用的通用组件
|
|
93
|
+
- **views**:页面级组件,通常与路由一一对应
|
|
94
|
+
- **router**:统一管理页面路由规则
|
|
95
|
+
- **stores**:全局状态管理目录
|
|
96
|
+
- **utils**:请求封装、工具方法等公共逻辑
|
|
97
|
+
- **api**:接口请求封装目录
|
|
98
|
+
- **types**:TypeScript 类型定义
|
|
99
|
+
- **postcss.config.mjs**:Tailwind CSS 配置,可根据需求修改
|
|
100
|
+
- **README.md**:项目说明文档
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## ⚙️ 使用方式
|
|
105
|
+
|
|
106
|
+
1. 创建项目
|
|
107
|
+
```bash
|
|
108
|
+
npm create vite-vue@latest
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
2. 进入项目目录
|
|
112
|
+
```bash
|
|
113
|
+
cd 项目名
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
3. 安装依赖 (已自动执行可省略)
|
|
117
|
+
```bash
|
|
118
|
+
npm install
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
4. 启动开发环境
|
|
122
|
+
```bash
|
|
123
|
+
npm run dev
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> 如果在创建时选择了「立即运行」,工具会自动执行启动命令。
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🌐 技术栈官网链接
|
|
131
|
+
|
|
132
|
+
- [Vite](https://vitejs.dev/)
|
|
133
|
+
- [Vue 3](https://vuejs.org/)
|
|
134
|
+
- [JavaScript](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript)
|
|
135
|
+
- [TypeScript](https://www.typescriptlang.org/)
|
|
136
|
+
- [Vue Router](https://router.vuejs.org/)
|
|
137
|
+
- [Pinia](https://pinia.vuejs.org/)
|
|
138
|
+
- [Axios](https://axios-http.com/)
|
|
139
|
+
- [Element Plus](https://element-plus.org/)
|
|
140
|
+
- [Vant](https://vant-contrib.gitee.io/vant/)
|
|
141
|
+
- [VueUse](https://vueuse.org/)
|
|
142
|
+
- [Lodash](https://lodash.com/)
|
|
143
|
+
- [Day.js](https://day.js.org/)
|
|
144
|
+
- [Tailwind CSS](https://tailwindcss.com/)
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 🔧 常见需要调整的地方(具体文件示例)
|
|
149
|
+
|
|
150
|
+
### 1️⃣ 接口请求地址
|
|
151
|
+
|
|
152
|
+
文件:`src/utils/request.ts` `src/utils/request.js`
|
|
153
|
+
```ts
|
|
154
|
+
import axios from 'axios';
|
|
155
|
+
|
|
156
|
+
const service = axios.create({
|
|
157
|
+
baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 修改为你的接口地址
|
|
158
|
+
timeout: 10000,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// 示例请求
|
|
162
|
+
export const getUserList = () => request.get('/users');
|
|
163
|
+
|
|
164
|
+
export default service;
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
> 🔹 根据实际业务修改 `baseURL` 和各个接口方法。
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### 2️⃣ 本地代理配置
|
|
172
|
+
|
|
173
|
+
文件:`vite.config.ts` `vite.config.js`
|
|
174
|
+
```ts
|
|
175
|
+
import { defineConfig } from 'vite';
|
|
176
|
+
import vue from '@vitejs/plugin-vue';
|
|
177
|
+
|
|
178
|
+
export default defineConfig({
|
|
179
|
+
plugins: [vue()],
|
|
180
|
+
server: {
|
|
181
|
+
proxy: {
|
|
182
|
+
'/api': {
|
|
183
|
+
target: 'http://localhost:3000', // 修改为后端服务地址
|
|
184
|
+
changeOrigin: true,
|
|
185
|
+
rewrite: (path) => path.replace(/^\/api/, ''),
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
> 🔹 如果接口路径前有 `/api` 前缀,可通过代理去掉
|
|
193
|
+
> 🔹 根据本地后端环境调整 `target`
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
### 3️⃣ 路由结构(支持动态参数)
|
|
198
|
+
|
|
199
|
+
文件:`src/router/index.ts` `src/router/index.js`
|
|
200
|
+
```ts
|
|
201
|
+
import { createRouter, createWebHistory } from 'vue-router'
|
|
202
|
+
import routes from '~pages' // 自动生成的路由
|
|
203
|
+
|
|
204
|
+
const router = createRouter({
|
|
205
|
+
history: createWebHistory(),
|
|
206
|
+
routes
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
export default router
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
> 🔹 页面文件夹结构示例:
|
|
213
|
+
```text
|
|
214
|
+
src/views/home/
|
|
215
|
+
├─ index.vue -> /home
|
|
216
|
+
└─ [id]/[name].vue -> /home/:id/:name
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
> 🔹 获取路由参数:
|
|
220
|
+
```ts
|
|
221
|
+
import { useRoute } from 'vue-router'
|
|
222
|
+
const route = useRoute()
|
|
223
|
+
console.log(route.params.id)
|
|
224
|
+
console.log(route.params.name)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### 4️⃣ 页面内容与样式
|
|
230
|
+
|
|
231
|
+
文件示例:`src/views/home/index.vue`
|
|
232
|
+
```vue
|
|
233
|
+
<template>
|
|
234
|
+
<div class="home-container">
|
|
235
|
+
<h1>欢迎来到项目首页</h1>
|
|
236
|
+
<p>这里可以根据业务需求修改页面内容和样式</p>
|
|
237
|
+
</div>
|
|
238
|
+
</template>
|
|
239
|
+
|
|
240
|
+
<script setup lang="ts">
|
|
241
|
+
// 可引入接口数据
|
|
242
|
+
// import { getUserList } from '@/api'
|
|
243
|
+
</script>
|
|
244
|
+
|
|
245
|
+
<style scoped>
|
|
246
|
+
.home-container {
|
|
247
|
+
padding: 20px;
|
|
248
|
+
}
|
|
249
|
+
</style>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
> 🔹 根据实际业务修改 HTML、样式、以及调用接口逻辑
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 🎯 适用场景
|
|
257
|
+
|
|
258
|
+
- Vue 3 新手快速上手
|
|
259
|
+
- 后台管理系统
|
|
260
|
+
- 中小型 Web 项目
|
|
261
|
+
- 练手项目 / 毕设 / 实战项目
|
|
262
|
+
- 不想每次重复配置环境的开发者
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 📄 License
|
|
267
|
+
|
|
268
|
+
MIT License
|
|
269
|
+
|
package/bin/index.js
CHANGED
|
@@ -1,10 +1,36 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
import { execSync } from 'child_process'
|
|
3
3
|
import fs from 'fs'
|
|
4
4
|
import path from 'path'
|
|
5
5
|
import prompts from 'prompts'
|
|
6
6
|
import { fileURLToPath } from 'url'
|
|
7
7
|
|
|
8
|
+
// 检测 Node 版本
|
|
9
|
+
const requiredVersion = '22.19.0'
|
|
10
|
+
|
|
11
|
+
function compareVersion (v1, v2) {
|
|
12
|
+
const a = v1.split('.').map(Number)
|
|
13
|
+
const b = v2.split('.').map(Number)
|
|
14
|
+
|
|
15
|
+
for(let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
16
|
+
const n1 = a[i] || 0
|
|
17
|
+
const n2 = b[i] || 0
|
|
18
|
+
if(n1 > n2) return 1
|
|
19
|
+
if(n1 < n2) return -1
|
|
20
|
+
}
|
|
21
|
+
return 0
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const currentVersion = process.version.replace('v', '')
|
|
25
|
+
|
|
26
|
+
if(compareVersion(currentVersion, requiredVersion) < 0) {
|
|
27
|
+
console.error(`❌ Node.js 版本过低`)
|
|
28
|
+
console.error(`当前版本: ${currentVersion}`)
|
|
29
|
+
console.error(`最低要求: ${requiredVersion}`)
|
|
30
|
+
console.error(`请升级 Node.js 后再运行`)
|
|
31
|
+
process.exit(1)
|
|
32
|
+
}
|
|
33
|
+
|
|
8
34
|
const __filename = fileURLToPath(import.meta.url)
|
|
9
35
|
const __dirname = path.dirname(__filename)
|
|
10
36
|
|
|
@@ -42,37 +68,36 @@ const __dirname = path.dirname(__filename)
|
|
|
42
68
|
]
|
|
43
69
|
})
|
|
44
70
|
|
|
45
|
-
// 2️⃣
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
])
|
|
71
|
+
// 2️⃣ 功能选择(多选)
|
|
72
|
+
const { featureList } = await prompts({
|
|
73
|
+
type: 'multiselect',
|
|
74
|
+
name: 'featureList',
|
|
75
|
+
message: '请选择基础功能(↑↓选择,空格确认,回车完成)',
|
|
76
|
+
instructions: false,
|
|
77
|
+
choices: [
|
|
78
|
+
{ title: 'Vue Router', value: 'router' },
|
|
79
|
+
{ title: 'Pinia(含持久化)', value: 'pinia' },
|
|
80
|
+
{ title: 'Axios', value: 'axios' },
|
|
81
|
+
{ title: 'Element Plus(PC UI)', value: 'element' },
|
|
82
|
+
{ title: 'Vant(Mobile UI)', value: 'vant' },
|
|
83
|
+
{ title: 'VueUse(实用 Composition API)', value: 'vueuse' },
|
|
84
|
+
{ title: 'Lodash(工具库)', value: 'lodash' },
|
|
85
|
+
{ title: 'Day.js(日期处理)', value: 'dayjs' },
|
|
86
|
+
{ title: 'Tailwind CSS(原子化 CSS)', value: 'tailwind' }
|
|
87
|
+
]
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
// 转换成原来的结构(保证后面代码基本不用动)
|
|
91
|
+
const features = {
|
|
92
|
+
router: featureList?.includes('router') || false,
|
|
93
|
+
pinia: featureList?.includes('pinia') || false,
|
|
94
|
+
axios: featureList?.includes('axios') || false,
|
|
95
|
+
ui: featureList?.filter(v => ['element', 'vant'].includes(v)) || []
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const extraPlugins = featureList?.filter(v =>
|
|
99
|
+
['vueuse', 'lodash', 'dayjs', 'tailwind'].includes(v)
|
|
100
|
+
) || []
|
|
76
101
|
|
|
77
102
|
// 询问是否开启自动路由
|
|
78
103
|
let autoRoute = false
|
|
@@ -88,40 +113,6 @@ const __dirname = path.dirname(__filename)
|
|
|
88
113
|
autoRoute = enableAutoRoute
|
|
89
114
|
}
|
|
90
115
|
|
|
91
|
-
// ========== 新增:增强插件配置 ==========
|
|
92
|
-
let extraPlugins = []
|
|
93
|
-
|
|
94
|
-
const { wantExtra } = await prompts({
|
|
95
|
-
type: 'toggle',
|
|
96
|
-
name: 'wantExtra',
|
|
97
|
-
message: '是否需要添加额外工具?',
|
|
98
|
-
initial: false,
|
|
99
|
-
active: '是',
|
|
100
|
-
inactive: '否'
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
if(wantExtra) {
|
|
104
|
-
const pluginOptions = [
|
|
105
|
-
{ title: 'VueUse(实用 Composition API)', value: 'vueuse' },
|
|
106
|
-
{ title: 'Lodash(实用工具库)', value: 'lodash' },
|
|
107
|
-
{ title: 'Day.js(轻量日期处理)', value: 'dayjs' },
|
|
108
|
-
{ title: 'Tailwind CSS(原子化 CSS)', value: 'tailwind' }
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
const { selectedPlugins } = await prompts({
|
|
112
|
-
type: 'multiselect',
|
|
113
|
-
name: 'selectedPlugins',
|
|
114
|
-
message: '请选择额外工具(↑↓选择,空格确认,回车完成)',
|
|
115
|
-
choices: pluginOptions.map(p => ({ title: p.title, value: p.value })),
|
|
116
|
-
instructions: false
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
if(selectedPlugins?.length) {
|
|
120
|
-
extraPlugins = selectedPlugins
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// ========== 增强插件配置结束 ==========
|
|
124
|
-
|
|
125
116
|
// 3️⃣ 是否立即运行 dev
|
|
126
117
|
const { runDev } = await prompts({
|
|
127
118
|
type: 'select',
|
|
@@ -184,13 +175,13 @@ const __dirname = path.dirname(__filename)
|
|
|
184
175
|
'/* __PINIA_IMPORT__ */': features.pinia
|
|
185
176
|
? "import { createPinia } from 'pinia'\nimport persistedstate from 'pinia-plugin-persistedstate'"
|
|
186
177
|
: '',
|
|
187
|
-
'/* __ELEMENT_IMPORT__ */': features.ui
|
|
178
|
+
'/* __ELEMENT_IMPORT__ */': features.ui.includes('element')
|
|
188
179
|
? `import ElementPlus from 'element-plus'
|
|
189
180
|
import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
|
190
181
|
import 'element-plus/dist/index.css'
|
|
191
182
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'`
|
|
192
183
|
: '',
|
|
193
|
-
'/* __VANT_IMPORT__ */': features.ui
|
|
184
|
+
'/* __VANT_IMPORT__ */': features.ui.includes('vant')
|
|
194
185
|
? `import Vant from 'vant'
|
|
195
186
|
import 'vant/lib/index.css'`
|
|
196
187
|
: '',
|
|
@@ -198,13 +189,13 @@ import 'vant/lib/index.css'`
|
|
|
198
189
|
'/* __PINIA_USE__ */': features.pinia
|
|
199
190
|
? 'app.use(createPinia().use(persistedstate))'
|
|
200
191
|
: '',
|
|
201
|
-
'/* __ELEMENT_USE__ */': features.ui
|
|
192
|
+
'/* __ELEMENT_USE__ */': features.ui.includes('element')
|
|
202
193
|
? `app.use(ElementPlus, { locale: zhCn })
|
|
203
194
|
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
|
|
204
195
|
app.component(key, component)
|
|
205
196
|
}`
|
|
206
197
|
: '',
|
|
207
|
-
'/* __VANT_USE__ */': features.ui
|
|
198
|
+
'/* __VANT_USE__ */': features.ui.includes('vant')
|
|
208
199
|
? 'app.use(Vant)'
|
|
209
200
|
: ''
|
|
210
201
|
}
|
|
@@ -234,21 +225,21 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
|
|
|
234
225
|
let pkg = fs.readFileSync(pkgTpl, 'utf-8')
|
|
235
226
|
|
|
236
227
|
const optionalDeps = {}
|
|
237
|
-
if(features.router) optionalDeps['vue-router'] = '^
|
|
228
|
+
if(features.router) optionalDeps['vue-router'] = '^5.0.3'
|
|
238
229
|
if(features.pinia) {
|
|
239
|
-
optionalDeps['pinia'] = '^
|
|
240
|
-
optionalDeps['pinia-plugin-persistedstate'] = '^
|
|
230
|
+
optionalDeps['pinia'] = '^3.0.4'
|
|
231
|
+
optionalDeps['pinia-plugin-persistedstate'] = '^4.7.1'
|
|
241
232
|
}
|
|
242
|
-
if(features.axios) optionalDeps['axios'] = '^1.
|
|
243
|
-
if(features.ui
|
|
244
|
-
optionalDeps['element-plus'] = '^2.
|
|
245
|
-
optionalDeps['@element-plus/icons-vue'] = '^2.3.
|
|
233
|
+
if(features.axios) optionalDeps['axios'] = '^1.13.6'
|
|
234
|
+
if(features.ui.includes('element')) {
|
|
235
|
+
optionalDeps['element-plus'] = '^2.13.3'
|
|
236
|
+
optionalDeps['@element-plus/icons-vue'] = '^2.3.2'
|
|
246
237
|
}
|
|
247
|
-
if(features.ui
|
|
238
|
+
if(features.ui.includes('vant')) {
|
|
248
239
|
optionalDeps['vant'] = '^4.9.22'
|
|
249
240
|
}
|
|
250
241
|
// 增强插件依赖
|
|
251
|
-
if(extraPlugins.includes('vueuse')) optionalDeps['@vueuse/core'] = '^14.1
|
|
242
|
+
if(extraPlugins.includes('vueuse')) optionalDeps['@vueuse/core'] = '^14.2.1'
|
|
252
243
|
if(extraPlugins.includes('dayjs')) optionalDeps['dayjs'] = '^1.11.19'
|
|
253
244
|
if(extraPlugins.includes('lodash')) optionalDeps['lodash'] = '^4.17.23'
|
|
254
245
|
if(autoRoute) optionalDeps['vite-plugin-pages'] = '^0.33.3'
|
|
@@ -369,11 +360,18 @@ export default createRouter({
|
|
|
369
360
|
|
|
370
361
|
// 1️⃣0️⃣ 安装依赖
|
|
371
362
|
console.log('📦 安装依赖中...')
|
|
372
|
-
execSync('npm install', { cwd: targetDir, stdio: 'inherit' })
|
|
363
|
+
// execSync('npm install', { cwd: targetDir, stdio: 'inherit' })
|
|
364
|
+
// if(extraPlugins.includes('tailwind')) {
|
|
365
|
+
// execSync('npm install tailwindcss @tailwindcss/postcss postcss', { cwd: targetDir, stdio: 'inherit' })
|
|
366
|
+
// }
|
|
367
|
+
let installCmd = 'npm install'
|
|
368
|
+
|
|
373
369
|
if(extraPlugins.includes('tailwind')) {
|
|
374
|
-
|
|
370
|
+
installCmd += ' tailwindcss @tailwindcss/postcss postcss'
|
|
375
371
|
}
|
|
376
372
|
|
|
373
|
+
execSync(installCmd, { cwd: targetDir, stdio: 'inherit' })
|
|
374
|
+
|
|
377
375
|
// 1️⃣1️⃣ 运行 dev
|
|
378
376
|
if(runDev) {
|
|
379
377
|
console.log('🚀 启动开发服务器...')
|
package/package.json
CHANGED
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"less": "^4.5.1",
|
|
13
13
|
"tslib": "^2.8.1",
|
|
14
|
-
"vue": "^3.5.
|
|
14
|
+
"vue": "^3.5.25"__OPTIONAL_DEP__
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
18
|
-
"vite": "
|
|
17
|
+
"@vitejs/plugin-vue": "^6.0.2",
|
|
18
|
+
"vite": "^8.0.0-beta.13"
|
|
19
19
|
},
|
|
20
20
|
"overrides": {
|
|
21
|
-
"vite": "
|
|
21
|
+
"vite": "^8.0.0-beta.13"
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -11,17 +11,17 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"less": "^4.5.1",
|
|
13
13
|
"tslib": "^2.8.1",
|
|
14
|
-
"vue": "^3.5.
|
|
14
|
+
"vue": "^3.5.25"__OPTIONAL_DEP__
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@types/node": "^24.
|
|
18
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
17
|
+
"@types/node": "^24.11.0",
|
|
18
|
+
"@vitejs/plugin-vue": "^6.0.2",
|
|
19
19
|
"@vue/tsconfig": "^0.8.1",
|
|
20
20
|
"typescript": "~5.9.3",
|
|
21
|
-
"vite": "
|
|
22
|
-
"vue-tsc": "^3.1.
|
|
21
|
+
"vite": "^8.0.0-beta.13",
|
|
22
|
+
"vue-tsc": "^3.1.5"
|
|
23
23
|
},
|
|
24
24
|
"overrides": {
|
|
25
|
-
"vite": "
|
|
25
|
+
"vite": "^8.0.0-beta.13"
|
|
26
26
|
}
|
|
27
27
|
}
|