@fchc8/vite-plugin-multi-page 1.9.6 → 1.10.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-EN.md +114 -13
- package/README.md +105 -4
- package/dist/cli.js +18 -15
- package/dist/index.d.mts +3 -5
- package/dist/index.d.ts +3 -5
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README-EN.md
CHANGED
|
@@ -203,15 +203,60 @@ Control how build outputs are organized using the `merge` option:
|
|
|
203
203
|
```typescript
|
|
204
204
|
export default defineConfig({
|
|
205
205
|
// ... other configurations
|
|
206
|
-
merge: 'all' | '
|
|
206
|
+
merge: 'all' | 'page',
|
|
207
207
|
});
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
+
#### Available Modes
|
|
211
|
+
|
|
210
212
|
- **`all`** (default): All HTML files in root directory, assets merged into `/dist/assets/`
|
|
211
|
-
- **`strategy`**: Group by strategy, e.g., `/dist/mobile/page1.html`, `/dist/desktop/page1.html`
|
|
212
|
-
- **`page`**: Group by page, e.g., `/dist/homePage/index.html`, `/dist/aboutPage/index.html`
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
```
|
|
215
|
+
dist/
|
|
216
|
+
├── home.html
|
|
217
|
+
├── about.html
|
|
218
|
+
├── mobile.html
|
|
219
|
+
└── assets/
|
|
220
|
+
├── home-xxx.js
|
|
221
|
+
├── about-xxx.js
|
|
222
|
+
└── shared-resource.svg
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- **`page`**: Each page is independently packaged with its own complete set of resource copies
|
|
226
|
+
```
|
|
227
|
+
dist/
|
|
228
|
+
├── home/
|
|
229
|
+
│ ├── index.html
|
|
230
|
+
│ ├── assets/
|
|
231
|
+
│ │ ├── home-xxx.js
|
|
232
|
+
│ │ └── button-loading.svg
|
|
233
|
+
│ └── images/
|
|
234
|
+
├── about/
|
|
235
|
+
│ ├── index.html
|
|
236
|
+
│ ├── assets/
|
|
237
|
+
│ │ ├── about-xxx.js
|
|
238
|
+
│ │ └── button-loading.svg
|
|
239
|
+
│ └── images/
|
|
240
|
+
└── mobile/
|
|
241
|
+
├── index.html
|
|
242
|
+
├── assets/
|
|
243
|
+
│ ├── mobile-xxx.js
|
|
244
|
+
│ └── button-loading.svg
|
|
245
|
+
└── images/
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### Advantages of Page Mode
|
|
249
|
+
|
|
250
|
+
- ✅ **Fully Independent**: Each page directory contains all required resources, can be deployed independently
|
|
251
|
+
- ✅ **Avoid Conflicts**: Completely resolves shared resource attribution issues
|
|
252
|
+
- ✅ **Clean Naming**: Resource files use clean file names without page prefixes
|
|
253
|
+
- ✅ **Deployment Friendly**: Supports CDN distribution, micro-frontend architectures
|
|
254
|
+
|
|
255
|
+
> **Note**:
|
|
256
|
+
>
|
|
257
|
+
> - Page mode creates resource copies for each page, which may increase overall build output size
|
|
258
|
+
> - Suitable for scenarios requiring independent deployment or strict resource isolation
|
|
259
|
+
> - Static assets from the `public/` directory are automatically copied to each page directory
|
|
215
260
|
|
|
216
261
|
### Page Strategy Assignment
|
|
217
262
|
|
|
@@ -258,9 +303,64 @@ npm run dev
|
|
|
258
303
|
npm run dev -- --strategy mobile
|
|
259
304
|
```
|
|
260
305
|
|
|
306
|
+
## Usage Examples
|
|
307
|
+
|
|
308
|
+
### Page Mode for Independent Deployment
|
|
309
|
+
|
|
310
|
+
Configure Page mode where each page gets complete independent resources:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// multipage.config.ts
|
|
314
|
+
export default defineConfig({
|
|
315
|
+
entry: 'src/pages/**/*.{ts,js}',
|
|
316
|
+
template: 'index.html',
|
|
317
|
+
merge: 'page', // Enable Page mode
|
|
318
|
+
strategies: {
|
|
319
|
+
default: {
|
|
320
|
+
build: {
|
|
321
|
+
sourcemap: false,
|
|
322
|
+
minify: 'esbuild',
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
mobile: {
|
|
326
|
+
build: {
|
|
327
|
+
target: ['es2015'],
|
|
328
|
+
minify: 'terser',
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
pageConfigs: context => {
|
|
333
|
+
if (context.relativePath.includes('/mobile/')) {
|
|
334
|
+
return { strategy: 'mobile' };
|
|
335
|
+
}
|
|
336
|
+
return { strategy: 'default' };
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Build result: Each page has independent resource files, avoiding shared resource missing issues.
|
|
342
|
+
|
|
343
|
+
### Shared Resource Handling
|
|
344
|
+
|
|
345
|
+
In Page mode, shared resources (such as icons, style files) are copied to each page directory:
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
// src/pages/about/main.ts
|
|
349
|
+
import buttonIcon from '../button-loading.svg'; // Shared resource
|
|
350
|
+
|
|
351
|
+
// src/pages/mobile/main.ts
|
|
352
|
+
import buttonIcon from '../button-loading.svg'; // Same shared resource
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
After building, both pages will have their own resource copies:
|
|
356
|
+
|
|
357
|
+
- `dist/about/assets/button-loading-xxx.svg`
|
|
358
|
+
- `dist/mobile/assets/button-loading-xxx.svg`
|
|
359
|
+
|
|
261
360
|
## Environment Variables
|
|
262
361
|
|
|
263
362
|
- `VITE_BUILD_STRATEGY`: Specify a single strategy build
|
|
363
|
+
- `VITE_MULTI_PAGE_BUILD_SINGLE_PAGE`: Specify single page build (used internally by Page mode)
|
|
264
364
|
- `IS_MOBILE`: Mobile identifier (configured in define)
|
|
265
365
|
- `API_BASE`: API base address (configured in define)
|
|
266
366
|
|
|
@@ -286,15 +386,16 @@ export default config;
|
|
|
286
386
|
|
|
287
387
|
### Configuration Options
|
|
288
388
|
|
|
289
|
-
| Option | Type | Default Value | Description
|
|
290
|
-
| ------------- | -------------------------- | -------------------------- |
|
|
291
|
-
| `entry` | `string` | `'src/pages/**/*.{ts,js}'` | Page entry matching rules
|
|
292
|
-
| `template` | `string` | `'index.html'` | HTML Template File
|
|
293
|
-
| `placeholder` | `string` | `'{{ENTRY_FILE}}'` |
|
|
294
|
-
| `exclude` | `string[]` | `[]` |
|
|
295
|
-
| `debug` | `boolean` | `false` |
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
389
|
+
| Option | Type | Default Value | Description |
|
|
390
|
+
| ------------- | -------------------------- | -------------------------- | ---------------------------- |
|
|
391
|
+
| `entry` | `string` | `'src/pages/**/*.{ts,js}'` | Page entry matching rules |
|
|
392
|
+
| `template` | `string` | `'index.html'` | HTML Template File |
|
|
393
|
+
| `placeholder` | `string` | `'{{ENTRY_FILE}}'` | Template placeholder |
|
|
394
|
+
| `exclude` | `string[]` | `[]` | Excluded file patterns |
|
|
395
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
396
|
+
| `merge` | `'all' \| 'page'` | `'all'` | Build output merge strategy |
|
|
397
|
+
| `strategies` | `Record<string, Strategy>` | `{}` | Build strategy configuration |
|
|
398
|
+
| `pageConfigs` | `Function \| Object` | `{}` | Page configuration |
|
|
298
399
|
|
|
299
400
|
### Utility Functions
|
|
300
401
|
|
package/README.md
CHANGED
|
@@ -203,15 +203,60 @@ strategies: {
|
|
|
203
203
|
```typescript
|
|
204
204
|
export default defineConfig({
|
|
205
205
|
// ... 其他配置
|
|
206
|
-
merge: 'all' | '
|
|
206
|
+
merge: 'all' | 'page',
|
|
207
207
|
});
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
+
#### 可用模式
|
|
211
|
+
|
|
210
212
|
- **`all`** (默认): 所有HTML文件放在根目录,资源合并到 `/dist/assets/`
|
|
211
|
-
- **`strategy`**: 按策略分组,如 `/dist/mobile/page1.html`、`/dist/desktop/page1.html`
|
|
212
|
-
- **`page`**: 按页面分组,如 `/dist/homePage/index.html`、`/dist/aboutPage/index.html`
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
```
|
|
215
|
+
dist/
|
|
216
|
+
├── home.html
|
|
217
|
+
├── about.html
|
|
218
|
+
├── mobile.html
|
|
219
|
+
└── assets/
|
|
220
|
+
├── home-xxx.js
|
|
221
|
+
├── about-xxx.js
|
|
222
|
+
└── shared-resource.svg
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- **`page`**: 每个页面独立打包,各自拥有完整的资源副本
|
|
226
|
+
```
|
|
227
|
+
dist/
|
|
228
|
+
├── home/
|
|
229
|
+
│ ├── index.html
|
|
230
|
+
│ ├── assets/
|
|
231
|
+
│ │ ├── home-xxx.js
|
|
232
|
+
│ │ └── button-loading.svg
|
|
233
|
+
│ └── images/
|
|
234
|
+
├── about/
|
|
235
|
+
│ ├── index.html
|
|
236
|
+
│ ├── assets/
|
|
237
|
+
│ │ ├── about-xxx.js
|
|
238
|
+
│ │ └── button-loading.svg
|
|
239
|
+
│ └── images/
|
|
240
|
+
└── mobile/
|
|
241
|
+
├── index.html
|
|
242
|
+
├── assets/
|
|
243
|
+
│ ├── mobile-xxx.js
|
|
244
|
+
│ └── button-loading.svg
|
|
245
|
+
└── images/
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### Page模式的优势
|
|
249
|
+
|
|
250
|
+
- ✅ **完全独立**: 每个页面目录包含所有必需资源,可独立部署
|
|
251
|
+
- ✅ **避免冲突**: 彻底解决了共享资源的归属问题
|
|
252
|
+
- ✅ **简洁命名**: 资源文件使用干净的文件名,无页面前缀
|
|
253
|
+
- ✅ **部署友好**: 支持CDN分发、微前端等架构模式
|
|
254
|
+
|
|
255
|
+
> **注意**:
|
|
256
|
+
>
|
|
257
|
+
> - Page模式会为每个页面创建资源副本,可能增加总体构建产物大小
|
|
258
|
+
> - 适合需要独立部署或有严格资源隔离需求的场景
|
|
259
|
+
> - `public/` 目录中的静态资源会自动复制到每个页面目录中
|
|
215
260
|
|
|
216
261
|
### 页面策略分配
|
|
217
262
|
|
|
@@ -258,9 +303,64 @@ npm run dev
|
|
|
258
303
|
npm run dev -- --strategy mobile
|
|
259
304
|
```
|
|
260
305
|
|
|
306
|
+
## 使用示例
|
|
307
|
+
|
|
308
|
+
### Page模式独立部署
|
|
309
|
+
|
|
310
|
+
配置Page模式,每个页面获得完整的独立资源:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// multipage.config.ts
|
|
314
|
+
export default defineConfig({
|
|
315
|
+
entry: 'src/pages/**/*.{ts,js}',
|
|
316
|
+
template: 'index.html',
|
|
317
|
+
merge: 'page', // 启用Page模式
|
|
318
|
+
strategies: {
|
|
319
|
+
default: {
|
|
320
|
+
build: {
|
|
321
|
+
sourcemap: false,
|
|
322
|
+
minify: 'esbuild',
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
mobile: {
|
|
326
|
+
build: {
|
|
327
|
+
target: ['es2015'],
|
|
328
|
+
minify: 'terser',
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
pageConfigs: context => {
|
|
333
|
+
if (context.relativePath.includes('/mobile/')) {
|
|
334
|
+
return { strategy: 'mobile' };
|
|
335
|
+
}
|
|
336
|
+
return { strategy: 'default' };
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
构建结果:每个页面都有独立的资源文件,避免共享资源缺失问题。
|
|
342
|
+
|
|
343
|
+
### 共享资源处理
|
|
344
|
+
|
|
345
|
+
在Page模式下,共享资源(如图标、样式文件)会被复制到每个页面目录:
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
// src/pages/about/main.ts
|
|
349
|
+
import buttonIcon from '../button-loading.svg'; // 共享资源
|
|
350
|
+
|
|
351
|
+
// src/pages/mobile/main.ts
|
|
352
|
+
import buttonIcon from '../button-loading.svg'; // 相同的共享资源
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
构建后两个页面都会有自己的资源副本:
|
|
356
|
+
|
|
357
|
+
- `dist/about/assets/button-loading-xxx.svg`
|
|
358
|
+
- `dist/mobile/assets/button-loading-xxx.svg`
|
|
359
|
+
|
|
261
360
|
## 环境变量
|
|
262
361
|
|
|
263
362
|
- `VITE_BUILD_STRATEGY`: 指定单个策略构建
|
|
363
|
+
- `VITE_MULTI_PAGE_BUILD_SINGLE_PAGE`: 指定单个页面构建(Page模式内部使用)
|
|
264
364
|
- `IS_MOBILE`: 移动端标识 (在 define 中配置)
|
|
265
365
|
- `API_BASE`: API 基础地址 (在 define 中配置)
|
|
266
366
|
|
|
@@ -293,6 +393,7 @@ export default config;
|
|
|
293
393
|
| `placeholder` | `string` | `'{{ENTRY_FILE}}'` | 模板占位符 |
|
|
294
394
|
| `exclude` | `string[]` | `[]` | 排除的文件模式 |
|
|
295
395
|
| `debug` | `boolean` | `false` | 启用调试日志 |
|
|
396
|
+
| `merge` | `'all' \| 'page'` | `'all'` | 构建产物合并策略 |
|
|
296
397
|
| `strategies` | `Record<string, Strategy>` | `{}` | 构建策略配置 |
|
|
297
398
|
| `pageConfigs` | `Function \| Object` | `{}` | 页面配置 |
|
|
298
399
|
|
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
2
|
+
"use strict";var Ie=Object.create;var z=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var je=Object.getOwnPropertyNames;var Ae=Object.getPrototypeOf,Le=Object.prototype.hasOwnProperty;var _=(e,t)=>()=>(e&&(t=e(e=0)),t);var N=(e,t)=>{for(var r in t)z(e,r,{get:t[r],enumerable:!0})},pe=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of je(t))!Le.call(e,n)&&n!==r&&z(e,n,{get:()=>t[n],enumerable:!(s=Re(t,n))||s.enumerable});return e};var E=(e,t,r)=>(r=e!=null?Ie(Ae(e)):{},pe(t||!e||!e.__esModule?z(r,"default",{value:e,enumerable:!0}):r,e)),Ue=e=>pe(z({},"__esModule",{value:!0}),e);var P=_(()=>{"use strict"});function k(e,t,r,s){let n=[],a=new Map,c=t.replace(/\/\*.*$/,"");(!c||c===t)&&(c=R.dirname(t.split("*")[0]));let l=[];for(let g of e){if(r.includes(g))continue;let f=g.replace(/\\/g,"/"),u=c.replace(/\\/g,"/"),p=R.posix.relative(u,f).split("/");if(p.length===1){let o=p[0],m=R.posix.basename(o,R.posix.extname(o));l.push({name:m,file:g,priority:1})}else if(p.length>=2){let o=R.posix.basename(f,R.posix.extname(f)),m=p[0];o==="main"&&l.push({name:m,file:g,priority:2})}}for(let g of l){let f=a.get(g.name);f?g.priority>f.priority&&a.set(g.name,{file:g.file,priority:g.priority}):a.set(g.name,{file:g.file,priority:g.priority})}for(let[g,{file:f}]of a.entries())n.push({name:g,file:f});return n}var R,re=_(()=>{"use strict";P();R=E(require("path"))});var ue={};N(ue,{getPageConfig:()=>I});function I(e,t,r){if(!e)return null;if(typeof e=="function")return e(t);for(let[s,n]of Object.entries(e)){if(s===t.pageName)return r(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${t.pageName}:`,n),n;if(n.match&&(Array.isArray(n.match)?n.match:[n.match]).some(l=>q(l,t.pageName)||q(l,t.relativePath)||q(l,t.filePath)))return r(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${t.pageName} (\u6A21\u5F0F: ${n.match}):`,n),{...n,match:void 0};if(q(s,t.pageName))return r(`Glob\u5339\u914D\u9875\u9762 ${t.pageName} (\u6A21\u5F0F: ${s}):`,n),n}return null}function q(e,t){let r=e.replace(/\*\*/g,"__DOUBLE_STAR__").replace(/\*/g,"[^/]*").replace(/__DOUBLE_STAR__/g,".*");return new RegExp(`^${r}$`).test(t)}var J=_(()=>{"use strict";P()});function me(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function W(e){return(...t)=>{e&&console.log("[vite-plugin-multi-page]",...t)}}var oe=_(()=>{"use strict";P()});var X={};N(X,{cleanViteOutputDirectory:()=>ie,discoverPages:()=>Ne,generateBuildConfig:()=>B,getAvailableStrategies:()=>ae,getViteOutputDirectory:()=>L});function B(e){var i;let{entry:t="src/pages/*/main.{ts,js}",exclude:r=[],template:s="index.html",placeholder:n="<!--VITE_MULTI_PAGE_ENTRY-->",strategies:a={},pageConfigs:c={},forceBuildStrategy:l,forceBuildPage:g}=e,f=W(!0),u={};try{let p=K.glob.sync(t,{cwd:process.cwd()}),o=k(p,t,r,f);if(o.length===0)return f("\u8B66\u544A: \u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6"),{};let m=new Map,x=new Map;for(let S of o){let $={pageName:S.name,filePath:S.file,relativePath:F.relative(process.cwd(),S.file)},w=I(c,$,f),C=(w==null?void 0:w.strategy)||"default";m.set(S.name,C),x.has(C)||x.set(C,[]),(i=x.get(C))==null||i.push(S.name)}if(f(`\u{1F4C4} \u53D1\u73B0 ${o.length} \u4E2A\u9875\u9762: ${o.map(S=>S.name).join(", ")}`),g){if(!o.find(A=>A.name===g))return f(`\u8B66\u544A: \u672A\u627E\u5230\u9875\u9762 "${g}"`),{};let $=m.get(g)||"default",w=a[$]||{},C=Q(`single-${g}`,[g],o,w,c,s,n,f);return u[`single-${g}`]=C,u}if(l){let S=x.get(l)||[];if(S.length===0)return f(`\u8B66\u544A: \u7B56\u7565 "${l}" \u4E0B\u6CA1\u6709\u9875\u9762`),{};f(`\u5F3A\u5236\u6784\u5EFA\u7B56\u7565: ${l}, \u9875\u9762: ${S.join(", ")}`);let $=Q(l,S,o,a[l],c,s,n,f);return u[l]=$,u}for(let[S,$]of x){if($.length===0)continue;let w=a[S]||{},C=Q(S,$,o,w,c,s,n,f);u[S]=C}if(Object.keys(u).length===0){f("\u8B66\u544A: \u672A\u751F\u6210\u4EFB\u4F55\u6784\u5EFA\u914D\u7F6E\uFF0C\u521B\u5EFA\u9ED8\u8BA4\u914D\u7F6E");let S=o.map(w=>w.name),$=Q("default",S,o,{},c,s,n,f);u.default=$}let h=Object.keys(u);return f(`\u{1F4E6} \u6784\u5EFA\u7B56\u7565: ${h.join(", ")}`),u}catch(p){throw f("\u751F\u6210\u6784\u5EFA\u914D\u7F6E\u5931\u8D25:",p),p}}function Q(e,t,r,s,n,a,c,l){let g={},f=[],u={};for(let o of t){let m=r.find(ne=>ne.name===o);if(!m)continue;let x={pageName:o,filePath:m.file,relativePath:F.relative(process.cwd(),m.file),strategy:e},h=I(n,x,l);h!=null&&h.define&&Object.assign(u,h.define);let S=a,$=`${o}.html`;O.existsSync(F.resolve(process.cwd(),$))?S=$:h!=null&&h.template&&(S=h.template);let w=F.resolve(process.cwd(),S);if(!O.existsSync(w)){l(`\u8B66\u544A: \u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728: ${S}`);continue}let C=O.readFileSync(w,"utf-8");if(C.includes(c)){let ne=`./${m.file}`;C=C.replace(new RegExp(c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),ne)}let A=F.resolve(process.cwd(),`.temp.mp.${o}.html`);O.writeFileSync(A,C),f.push(A),g[o]=A}let i={build:{rollupOptions:{input:g,output:{entryFileNames:"assets/[name]-[hash].js",chunkFileNames:"assets/[name]-[hash].js",assetFileNames:"assets/[name]-[hash][extname]"}},emptyOutDir:!1},define:{}},p=i;return s&&(p=(0,de.mergeConfig)(i,s)),Object.keys(u).length>0&&(p.define={...p.define,...u}),p.build||(p.build={}),p.build.rollupOptions||(p.build.rollupOptions={}),p.build.rollupOptions.input=g,p.build.emptyOutDir=!1,l(`\u7B56\u7565 "${e}" - ${t.length} \u4E2A\u9875\u9762`),p}function L(e=[]){let t=e.findIndex(s=>s==="--outDir");if(t!==-1&&t+1<e.length){let s=e[t+1];return F.resolve(process.cwd(),s)}let r=e.find(s=>s.startsWith("--outDir="));if(r){let s=r.split("=")[1];return F.resolve(process.cwd(),s)}return F.resolve(process.cwd(),"dist")}function ie(e=[]){let t=L(e),r=W(!0);try{O.existsSync(t)&&(O.rmSync(t,{recursive:!0,force:!0}),r(`\u{1F9F9} \u6E05\u7406\u8F93\u51FA\u76EE\u5F55: ${F.relative(process.cwd(),t)}`))}catch(s){r(`\u26A0\uFE0F \u6E05\u7406\u8F93\u51FA\u76EE\u5F55\u5931\u8D25: ${t}`,s)}}function Ne(e){let{entry:t="src/pages/*/main.{ts,js}",exclude:r=[]}=e,s=W(!0);try{let n=K.glob.sync(t,{cwd:process.cwd()});return k(n,t,r,s)}catch(n){throw s("\u53D1\u73B0\u9875\u9762\u5931\u8D25:",n),n}}function ae(e){let{entry:t="src/pages/*/main.{ts,js}",exclude:r=[],pageConfigs:s={}}=e,n=W(!1),a=new Set,c=K.glob.sync(t,{cwd:process.cwd()}),l=k(c,t,r,n);if(l.length===0)throw new Error(`\u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6: ${t}`);try{for(let g of l){let f={pageName:g.name,filePath:g.file,relativePath:F.relative(process.cwd(),g.file)},u=I(s,f,n),i=(u==null?void 0:u.strategy)||"default";a.add(i)}return Array.from(a).sort()}catch(g){return n("\u83B7\u53D6\u53EF\u7528\u7B56\u7565\u5931\u8D25:",g),["default"]}}var de,K,F,O,U=_(()=>{"use strict";P();de=require("vite"),K=require("glob"),F=E(require("path")),O=E(require("fs"));re();J();oe()});var ve={};N(ve,{hasCustomConfig:()=>Z,loadUserConfig:()=>ee});function Z(){for(let e of he){let t=j.resolve(process.cwd(),e);if(G.existsSync(t))return!0}return!1}async function ee(e){let t=await Be();if(t){let r=t(e);return r||{}}return null}async function ke(e){if(e.endsWith(".ts"))try{let t=await G.promises.readFile(e,"utf-8"),r;try{r=await import("esbuild")}catch{throw console.error(`
|
|
3
3
|
\u274C \u65E0\u6CD5\u52A0\u8F7D TypeScript \u914D\u7F6E\u6587\u4EF6\uFF0C\u56E0\u4E3A\u627E\u4E0D\u5230 esbuild \u4F9D\u8D56\u3002`),console.error(`
|
|
4
4
|
\u{1F4A1} \u8BF7\u9009\u62E9\u4EE5\u4E0B\u89E3\u51B3\u65B9\u6848\u4E4B\u4E00\uFF1A`),console.error(' 1. \u5B89\u88C5 esbuild (peerDependency)\uFF1Anpm install esbuild@">=0.19.3" --save-dev'),console.error(" 2. \u6216\u8005\u5982\u679C\u4F7F\u7528 Vite \u9879\u76EE\uFF0Cesbuild \u901A\u5E38\u5DF2\u5B89\u88C5\uFF0C\u8BF7\u68C0\u67E5\u7248\u672C\u662F\u5426 >=0.19.3"),console.error(" 3. \u4F7F\u7528 JavaScript \u914D\u7F6E\u6587\u4EF6\uFF1A\u5C06 multipage.config.ts \u91CD\u547D\u540D\u4E3A multipage.config.js"),console.error(` 4. \u4F7F\u7528 ESM \u914D\u7F6E\u6587\u4EF6\uFF1A\u5C06 multipage.config.ts \u91CD\u547D\u540D\u4E3A multipage.config.mjs
|
|
5
|
-
`),new Error(`\u9700\u8981 esbuild \u4F9D\u8D56\u6765\u5904\u7406 TypeScript \u914D\u7F6E\u6587\u4EF6: ${
|
|
6
|
-
`);
|
|
7
|
-
${
|
|
5
|
+
`),new Error(`\u9700\u8981 esbuild \u4F9D\u8D56\u6765\u5904\u7406 TypeScript \u914D\u7F6E\u6587\u4EF6: ${j.basename(e)}`)}let s=await r.transform(t,{loader:"ts",format:"cjs",target:"node16",sourcemap:!1}),n=new Y.Module(e);return n.filename=e,n.paths=Y.Module._nodeModulePaths(j.dirname(e)),n._compile(s.code,e),n.exports}catch(t){if(t instanceof Error&&t.message.includes("\u9700\u8981 esbuild \u4F9D\u8D56"))throw t;console.warn("esbuild \u8F6C\u8BD1\u5931\u8D25\uFF0C\u5C1D\u8BD5\u7B80\u5355\u8F6C\u6362:",t);let s=(await G.promises.readFile(e,"utf-8")).replace(/export\s+default\s+/,"module.exports = ").replace(/import\s+.*?from\s+['"][^'"]*['"];?\s*/g,"").replace(/:\s*[^=,})\]]+/g,""),n=new Y.Module(e);return n.filename=e,n.paths=Y.Module._nodeModulePaths(j.dirname(e)),n._compile(s,e),n.exports}if(e.endsWith(".js")||e.endsWith(".mjs"))return import(`${(0,ye.pathToFileURL)(e).href}?t=${Date.now()}`);throw new Error(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u6587\u4EF6\u7C7B\u578B: ${e}`)}async function Be(){let e=process.cwd();for(let t of he){let r=j.resolve(e,t);if(G.existsSync(r))try{let s=await ke(r),n=s.default||s;if(typeof n=="function")return n;console.warn(`\u914D\u7F6E\u6587\u4EF6 ${t} \u5FC5\u987B\u9ED8\u8BA4\u5BFC\u51FA\u4E00\u4E2A\u51FD\u6570`)}catch(s){t.endsWith(".ts")?(console.error(`\u52A0\u8F7DTypeScript\u914D\u7F6E\u6587\u4EF6 ${t} \u5931\u8D25:`,s),console.log("\u63D0\u793A\uFF1A\u786E\u4FDD\u4F60\u7684\u9879\u76EE\u652F\u6301TypeScript\uFF0C\u6216\u8005\u4F7F\u7528 .js/.mjs \u914D\u7F6E\u6587\u4EF6")):console.error(`\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6 ${t} \u5931\u8D25:`,s)}}return null}var G,j,ye,Y,he,ce=_(()=>{"use strict";P();G=E(require("fs")),j=E(require("path")),ye=require("url"),Y=require("module"),he=["multipage.config.js","multipage.config.mjs","multipage.config.ts"]});var xe={};N(xe,{DEFAULT_CONFIG:()=>T,isEmptyConfig:()=>Ge,mergeWithDefaults:()=>V});function V(e){return e?{entry:e.entry??T.entry,exclude:e.exclude??T.exclude,template:e.template??T.template,placeholder:e.placeholder??T.placeholder,debug:e.debug??T.debug,merge:e.merge??T.merge,strategies:e.strategies??T.strategies,pageConfigs:e.pageConfigs??T.pageConfigs,__forceBuildStrategy:e.__forceBuildStrategy}:{...T}}function Ge(e){if(Object.keys(e).length===0)return!0;let t=e.entry&&e.entry!==T.entry,r=e.strategies&&Object.keys(e.strategies).length>0,s=e.pageConfigs&&(typeof e.pageConfigs=="function"||Object.keys(e.pageConfigs).length>0);return!t&&!r&&!s}var T,te=_(()=>{"use strict";P();T={entry:"src/pages/**/*.{ts,js}",exclude:[],template:"index.html",placeholder:"{{ENTRY_FILE}}",debug:!1,merge:"all",strategies:{default:{}},pageConfigs:{}}});function Ve(e,t,r){try{let s=Se.glob.sync(t.entry,{cwd:process.cwd()}),n=k(s,t.entry,t.exclude,r);if(n.length===0){r("\u8B66\u544A: \u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6");return}let a=t.devStrategy||e.config.__cliStrategy||e.config.strategy;a&&(r(`\u5F00\u53D1\u670D\u52A1\u5668\u4F7F\u7528\u6307\u5B9A\u7684\u7B56\u7565: ${a}`),n=n.filter(c=>{let l={pageName:c.name,filePath:c.file,relativePath:D.relative(process.cwd(),c.file),strategy:void 0,isMatched:!1},g=I(t.pageConfigs,l,r),f=(g==null?void 0:g.strategy)||"default";return a==="default"?f==="default":f===a}),r(`\u7B56\u7565 "${a}" \u4E0B\u53EF\u7528\u7684\u9875\u9762: ${n.map(c=>c.name).join(", ")||"\u65E0"}`)),r("\u5F00\u53D1\u670D\u52A1\u5668\u5E94\u7528\u7684\u5165\u53E3\u6587\u4EF6:",n),e.middlewares.use(async(c,l,g)=>{try{let u=(c.url||"").split("?")[0];if(u==="/"){let o=Ye(n,t,r);l.statusCode=200,l.setHeader("Content-Type","text/html"),l.end(o);return}if(u.match(/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot|map)$/)&&!u.endsWith(".html")||u.startsWith("/@")||u.includes("__vite")||u.startsWith("/node_modules"))return g();let i="";if(u.endsWith(".html"))i=D.basename(u,".html");else if(u.startsWith("/")){let o=u.substring(1);if(n.find(m=>m.name===o))i=o;else{let m=o.split("/");if(m.length>1){let x=m[0];n.find(h=>h.name===x)&&(i=x,r(`History \u8DEF\u7531\u5339\u914D: ${u} -> ${x}`))}}}if(!i)return g();let p=n.find(o=>o.name===i);return p?We(l,p,t,r):g()}catch(f){r(`\u5F00\u53D1\u670D\u52A1\u5668\u5904\u7406\u8BF7\u6C42\u5931\u8D25: ${f}`),g(f)}}),r("\u5F00\u53D1\u670D\u52A1\u5668\u914D\u7F6E\u5B8C\u6210")}catch(s){throw r(`\u914D\u7F6E\u5F00\u53D1\u670D\u52A1\u5668\u5931\u8D25: ${s}`),s}}function We(e,t,r,s){var u;let n={pageName:t.name,filePath:t.file,relativePath:D.relative(process.cwd(),t.file),strategy:void 0,isMatched:!1},a=I(r.pageConfigs,n,s);if(a!=null&&a.strategy)n.strategy=a.strategy;else if((u=r.appliedStrategies)!=null&&u.has(t.name)){let i=r.appliedStrategies.get(t.name);i&&(n.strategy=i)}let c="",l=D.resolve(process.cwd(),`${t.name}.html`);if(H.existsSync(l)?c=l:a!=null&&a.template?c=D.resolve(process.cwd(),a.template):c=D.resolve(process.cwd(),r.template),!H.existsSync(c)){e.statusCode=404,e.end("Template not found");return}let g=H.readFileSync(c,"utf-8");if(g.includes(r.placeholder)){let i=g;if(g=g.split(r.placeholder).join(`/${t.file}`),g===i){let p=me(r.placeholder),o=new RegExp(p,"g");g=i.replace(o,`/${t.file}`),g===i&&(g=i.replace(/\{\{ENTRY_FILE\}\}/g,`/${t.file}`))}}if(a!=null&&a.define){let i=Object.entries(a.define).map(([p,o])=>{let m=typeof o=="string"?`"${o}"`:JSON.stringify(o);return`window.${p} = ${m};`}).join(`
|
|
6
|
+
`);i&&(g=g.replace(/<\/head>/i,`<script type="text/javascript">
|
|
7
|
+
${i}
|
|
8
8
|
</script>
|
|
9
|
-
</head>`))}
|
|
9
|
+
</head>`))}e.statusCode=200,e.setHeader("Content-Type","text/html"),e.end(g)}function Ye(e,t,r){try{let s=e.map(n=>{var f;let a={pageName:n.name,filePath:n.file,relativePath:D.relative(process.cwd(),n.file),strategy:void 0,isMatched:!1},c=I(t.pageConfigs,a,r),l="default";if(c!=null&&c.strategy)l=c.strategy;else if((f=t.appliedStrategies)!=null&&f.has(n.name)){let u=t.appliedStrategies.get(n.name);u&&(l=u)}let g=l!=="default"?`<span class="badge">${l}</span>`:"";return`
|
|
10
10
|
<div class="page-item">
|
|
11
11
|
<a href="${n.name}.html" class="page-link">
|
|
12
|
-
${n.name}${
|
|
12
|
+
${n.name}${g}
|
|
13
13
|
</a>
|
|
14
14
|
<div class="page-path">${n.file}</div>
|
|
15
15
|
</div>`}).join("");return`
|
|
@@ -84,14 +84,14 @@ ${a}
|
|
|
84
84
|
<body>
|
|
85
85
|
<h1>\u591A\u9875\u9762\u5E94\u7528\u7D22\u5F15</h1>
|
|
86
86
|
<div class="stats">
|
|
87
|
-
\u627E\u5230 ${
|
|
87
|
+
\u627E\u5230 ${e.length} \u4E2A\u9875\u9762
|
|
88
88
|
</div>
|
|
89
89
|
<div class="page-list">
|
|
90
90
|
${s}
|
|
91
91
|
</div>
|
|
92
92
|
</body>
|
|
93
93
|
</html>
|
|
94
|
-
`}catch(s){return
|
|
94
|
+
`}catch(s){return r(`\u751F\u6210\u7D22\u5F15\u9875\u5931\u8D25: ${s}`),`
|
|
95
95
|
<!DOCTYPE html>
|
|
96
96
|
<html>
|
|
97
97
|
<head>
|
|
@@ -102,7 +102,7 @@ ${a}
|
|
|
102
102
|
<p>${s}</p>
|
|
103
103
|
</body>
|
|
104
104
|
</html>
|
|
105
|
-
`}}var
|
|
105
|
+
`}}var D,H,Se,be,$e=_(()=>{"use strict";P();D=E(require("path")),H=E(require("fs")),Se=require("glob");re();oe();J();be=Ve});function Ce(e){return typeof e=="function"?e:()=>e}function Pe(e){return e}var we=_(()=>{"use strict";P()});var _e={};N(_e,{cleanViteOutputDirectory:()=>ie,default:()=>ze,defineConfig:()=>Ce,defineConfigTransform:()=>Pe,generateBuildConfig:()=>B,getAvailableStrategies:()=>ae,getViteOutputDirectory:()=>L,mergeWithDefaults:()=>V,reorganizeAssetsInCLI:()=>He,viteMultiPage:()=>Te});function Fe(e,t,r,s){let n=b.resolve(e,"assets");if(!y.existsSync(n)){s("assets\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u91CD\u7EC4");return}let a=y.readdirSync(e).filter(i=>i.endsWith(".html")).map(i=>b.resolve(e,i));if(a.length===0){if(s("\u672A\u627E\u5230HTML\u6587\u4EF6\uFF0C\u4F46\u4ECD\u9700\u6E05\u7406assets\u76EE\u5F55"),(t==="strategy"||t==="page")&&y.existsSync(n))try{y.rmSync(n,{recursive:!0,force:!0}),s("\u5F3A\u5236\u6E05\u7406\u6574\u4E2A\u6839\u76EE\u5F55assets\u76EE\u5F55 (strategy/page\u6A21\u5F0F)")}catch(i){s("\u6E05\u7406\u6839\u76EE\u5F55assets\u5931\u8D25:",i)}return}let c=new Map,l=new Map;a.forEach(i=>{var w;let p=b.basename(i,".html");p.startsWith(".temp.mp.")&&(p=p.replace(".temp.mp.",""));let o=y.readFileSync(i,"utf-8"),m=[],x=/(?:src|href)="\/assets\/([^"]+)"/g,h;for(;(h=x.exec(o))!==null;){let C=h[1];m.push(C),l.has(C)||l.set(C,[]),(w=l.get(C))==null||w.push(p)}let S="";t==="page"&&(S=p);let $=b.resolve(e,S);c.set(p,{assets:m,targetDir:$}),s(`\u9875\u9762 ${p} \u4F9D\u8D56\u8D44\u6E90:`,m)}),s("\u7B2C\u4E00\u9636\u6BB5\u8865\u5145\uFF1A\u5206\u6790public\u76EE\u5F55\u8D44\u6E90");let g=new Set,f=b.resolve(process.cwd(),"public");if(y.existsSync(f)){let i=Ee.sync("**/*",{cwd:f,nodir:!0});for(let p of i)g.add(p),s(`\u53D1\u73B0public\u8D44\u6E90: ${p}`)}l.forEach((i,p)=>{i.length>1?s(`\u5171\u4EAB\u8D44\u6E90 ${p} \u88AB\u9875\u9762\u4F7F\u7528:`,i):s(`\u72EC\u5360\u8D44\u6E90 ${p} \u4EC5\u88AB\u9875\u9762 ${i[0]} \u4F7F\u7528`)}),c.forEach(({assets:i,targetDir:p},o)=>{let m=b.resolve(p,"assets");y.existsSync(m)||y.mkdirSync(m,{recursive:!0}),i.forEach(x=>{let h=b.resolve(n,x),S=b.resolve(m,x);if(y.existsSync(h)){y.copyFileSync(h,S);let w=(l.get(x)||[]).length>1?"\u5171\u4EAB\u8D44\u6E90":"\u72EC\u5360\u8D44\u6E90";s(`\u590D\u5236${w}\u5230 ${o}: assets/${x} -> ${b.relative(e,S)}`)}else s(`\u8B66\u544A: \u8D44\u6E90\u6587\u4EF6\u4E0D\u5B58\u5728: ${h}`)}),y.existsSync(n)&&y.readdirSync(n).forEach(h=>{if(!i.includes(h)){let S=b.resolve(n,h),$=b.resolve(m,h);y.existsSync(S)&&(y.copyFileSync(S,$),s(`\u590D\u5236\u5176\u4ED6\u8D44\u6E90\u6587\u4EF6\u5230 ${o}: assets/${h} -> ${b.relative(e,$)}`))}})}),s("\u7B2C\u4E09\u9636\u6BB5\u8865\u5145\uFF1A\u5904\u7406public\u76EE\u5F55\u8D44\u6E90");let u=new Set;c.forEach(({targetDir:i})=>{u.add(i)});for(let i of u)for(let p of g){let o=b.resolve(e,p),m=b.resolve(i,p);if(y.existsSync(o)){let x=b.dirname(m);y.existsSync(x)||y.mkdirSync(x,{recursive:!0}),y.copyFileSync(o,m),s(`\u590D\u5236public\u8D44\u6E90: ${p} -> ${b.relative(e,m)}`)}}if(c.forEach(({targetDir:i},p)=>{let o=b.resolve(e,`${p}.html`),m=p;if(y.existsSync(o)||(o=b.resolve(e,`.temp.mp.${p}.html`),y.existsSync(o)&&(m=p)),y.existsSync(o)){let x=y.readFileSync(o,"utf-8");x=x.replace(/(?:src|href)="\/assets\//g,$=>$.replace("/assets/","./assets/"));let h;t==="strategy"?h=b.resolve(i,`${m}.html`):t==="page"?h=b.resolve(i,"index.html"):h=o,y.writeFileSync(h,x),h!==o&&y.unlinkSync(o);let S=b.relative(e,h);s(`\u6309${t}\u5206\u7EC4\u79FB\u52A8HTML\u6587\u4EF6: ${m}.html -> ${S}`)}else s(`\u8B66\u544A: \u672A\u627E\u5230HTML\u6587\u4EF6: ${p}.html \u6216 .temp.mp.${p}.html`)}),y.existsSync(n))if(t==="strategy"||t==="page")try{y.rmSync(n,{recursive:!0,force:!0}),s("\u5F3A\u5236\u6E05\u7406\u6574\u4E2A\u6839\u76EE\u5F55assets\u76EE\u5F55 (strategy/page\u6A21\u5F0F)")}catch(i){s("\u6E05\u7406\u6839\u76EE\u5F55assets\u5931\u8D25:",i)}else{l.forEach((p,o)=>{let m=b.resolve(n,o);y.existsSync(m)&&(y.unlinkSync(m),s(`\u6E05\u7406\u539F\u59CB\u8D44\u6E90\u6587\u4EF6: assets/${o}`))});let i=y.readdirSync(n);i.length===0?(y.rmdirSync(n),s("\u6E05\u7406\u7A7A\u7684assets\u76EE\u5F55")):s("assets\u76EE\u5F55\u4E2D\u8FD8\u6709\u672A\u5904\u7406\u7684\u6587\u4EF6:",i)}(t==="strategy"||t==="page")&&g.size>0&&(s("\u7B2C\u4E94\u9636\u6BB5\u8865\u5145\uFF1A\u6E05\u7406\u6839\u76EE\u5F55\u7684public\u8D44\u6E90"),g.forEach(i=>{let p=b.resolve(e,i);if(y.existsSync(p))try{y.unlinkSync(p),s(`\u5220\u9664\u6839\u76EE\u5F55public\u8D44\u6E90: ${i}`)}catch(o){s(`\u5220\u9664\u6839\u76EE\u5F55public\u8D44\u6E90\u5931\u8D25: ${i}`,o)}}),g.forEach(i=>{let p=b.resolve(e,i),o=b.dirname(p);for(;o!==e&&o!==b.dirname(o);)try{if(y.existsSync(o)&&y.readdirSync(o).length===0)y.rmdirSync(o),s(`\u5220\u9664\u7A7A\u76EE\u5F55: ${b.relative(e,o)}`),o=b.dirname(o);else break}catch{break}}))}function Te(e){let t,r=[],s=()=>{};return{name:"vite-multi-page",async configResolved(n){let a=null;Z()&&(a=await ee({mode:n.command==="serve"?"development":"production",command:n.command,isCLI:!1}));let c=V(a);t=e?e(c,{mode:n.command==="serve"?"development":"production",command:n.command,isCLI:!1}):c,s=t.debug??!1?console.log.bind(console,"[vite-multi-page]"):()=>{},s("Vite\u914D\u7F6E\u5DF2\u89E3\u6790, \u4F7F\u7528\u914D\u7F6E:",{strategies:Object.keys(t.strategies||{}),entry:t.entry})},async config(n,{command:a}){var c;if(a==="serve"){let l=process.argv,g=l.find(f=>f.startsWith("--strategy="));if(g){let f=g.split("=")[1];f&&(process.env.VITE_MULTI_PAGE_STRATEGY=f)}else{let f=l.findIndex(u=>u==="--strategy");if(f!==-1&&f+1<l.length){let u=l[f+1];process.env.VITE_MULTI_PAGE_STRATEGY=u}}process.env.VITE_MULTI_PAGE_STRATEGY||(process.env.VITE_MULTI_PAGE_STRATEGY="default")}if(a==="build"){if(!t){let i=null;Z()&&(i=await ee({mode:"production",command:"build",isCLI:!1}));let p=V(i);t=e?e(p,{mode:"production",command:"build",isCLI:!1}):p,s=t.debug??!1?console.log.bind(console,"[vite-multi-page]"):()=>{}}s("\u914D\u7F6E\u6784\u5EFA\u6A21\u5F0F");let l=process.env.VITE_MULTI_PAGE_BUILD_SINGLE_PAGE;if(l){s(`\u5355\u9875\u9762\u6784\u5EFA\u6A21\u5F0F: ${l}`);let i=B({entry:t.entry||"src/pages/**/*.{ts,js}",exclude:t.exclude||[],template:t.template||"index.html",placeholder:t.placeholder||"{{ENTRY_FILE}}",merge:t.merge||"all",strategies:t.strategies||{},pageConfigs:t.pageConfigs||{},forceBuildStrategy:void 0,forceBuildPage:l}),p=Object.values(i);if(p.length>0){let o=p[0],m=(0,le.mergeConfig)(n,o);Object.assign(n,m),s(`\u5DF2\u5E94\u7528\u5355\u9875\u9762\u6784\u5EFA\u914D\u7F6E: ${l}`);return}else throw new Error(`\u672A\u627E\u5230\u9875\u9762: ${l}`)}let g=process.env.VITE_MULTI_PAGE_STRATEGY,f=B({entry:t.entry||"src/pages/**/*.{ts,js}",exclude:t.exclude||[],template:t.template||"index.html",placeholder:t.placeholder||"{{ENTRY_FILE}}",merge:t.merge||"all",strategies:t.strategies||{},pageConfigs:t.pageConfigs||{},forceBuildStrategy:g}),u=Object.keys(f)[0];if(u&&f[u]){s(`\u5E94\u7528\u6784\u5EFA\u7B56\u7565: ${u}`);let i=f[u],p=(0,le.mergeConfig)(n,i);Object.assign(n,p),s(`\u5DF2\u5E94\u7528\u7B56\u7565 "${u}" \u7684\u914D\u7F6E:`,{build:!!i.build,define:!!i.define,plugins:((c=i.plugins)==null?void 0:c.length)||0})}else throw s("\u672A\u627E\u5230\u53EF\u7528\u7684\u6784\u5EFA\u7B56\u7565\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E"),new Error(`\u274C \u6784\u5EFA\u5931\u8D25: \u672A\u627E\u5230\u4EFB\u4F55\u6784\u5EFA\u7B56\u7565
|
|
106
106
|
|
|
107
107
|
\u53EF\u80FD\u7684\u539F\u56E0\uFF1A
|
|
108
108
|
1. \u914D\u7F6E\u6587\u4EF6\u8FD4\u56DE\u7A7A\u5BF9\u8C61 {}
|
|
@@ -117,7 +117,7 @@ export default () => ({
|
|
|
117
117
|
strategies: {
|
|
118
118
|
default: {}
|
|
119
119
|
}
|
|
120
|
-
});`)}},configureServer(n){if(n.config.command==="serve"){s("\u914D\u7F6E\u5F00\u53D1\u670D\u52A1\u5668");let
|
|
120
|
+
});`)}},configureServer(n){if(n.config.command==="serve"){s("\u914D\u7F6E\u5F00\u53D1\u670D\u52A1\u5668");let a=process.env.VITE_MULTI_PAGE_STRATEGY||"default";s(`\u5F00\u53D1\u6A21\u5F0F\u7B56\u7565: ${a}`),be(n,{entry:t.entry||"src/pages/**/*.{ts,js}",exclude:t.exclude||[],template:t.template||"index.html",placeholder:t.placeholder||"{{ENTRY_FILE}}",strategies:t.strategies||{},pageConfigs:t.pageConfigs||{},devStrategy:a},s)}},writeBundle(n){if(!(t!=null&&t.merge)||t.merge==="all")return;let a=n.dir||"dist",c=t.merge;s(`\u5E94\u7528\u6784\u5EFA\u4EA7\u7269\u5408\u5E76\u6A21\u5F0F: ${c}`);try{Fe(a,c,t,s)}catch(l){throw s("\u8D44\u6E90\u91CD\u7EC4\u5931\u8D25:",l),l}},buildEnd(){r.length>0&&(s(`\u6E05\u7406 ${r.length} \u4E2A\u4E34\u65F6\u6587\u4EF6`),r.forEach(n=>{try{y.existsSync(n)&&(y.unlinkSync(n),s(`\u5220\u9664\u4E34\u65F6\u6587\u4EF6: ${n}`))}catch(a){s(`\u5220\u9664\u4E34\u65F6\u6587\u4EF6\u5931\u8D25: ${n}`,a)}}),r.length=0)}}}function He(e,t,r,s){return Fe(e,t,r,s)}var y,b,le,Ee,ze,Oe=_(()=>{"use strict";P();y=E(require("fs")),b=E(require("path")),le=require("vite");$e();U();ce();te();Ee=E(require("glob"));we();U();te();ze=Te});var rt={};N(rt,{buildAll:()=>Me});module.exports=Ue(rt);P();var ge=require("child_process"),d=E(require("fs")),v=E(require("path")),se=E(require("glob"));U();function qe(){let e=process.argv.slice(2),t=[],r=!1,s,n;for(let a=0;a<e.length;a++){let c=e[a];c==="--debug"?r=!0:c==="--cwd"?s=e[++a]:c==="--strategy"?n=e[++a].split(",").map(g=>g.trim()):c==="--help"||c==="-h"?(console.log(`
|
|
121
121
|
\u4F7F\u7528\u65B9\u6CD5: vite-mp [\u9009\u9879]
|
|
122
122
|
|
|
123
123
|
\u9009\u9879:
|
|
@@ -135,8 +135,11 @@ export default () => ({
|
|
|
135
135
|
vite-mp --debug # \u542F\u7528\u8C03\u8BD5\u6A21\u5F0F
|
|
136
136
|
vite-mp --cwd example # \u5728example\u76EE\u5F55\u8FD0\u884C
|
|
137
137
|
vite-mp --mode production --debug # \u4F20\u9012\u989D\u5916\u53C2\u6570\u7ED9vite
|
|
138
|
-
`),process.exit(0)):
|
|
139
|
-
\
|
|
140
|
-
\
|
|
141
|
-
\
|
|
142
|
-
\
|
|
138
|
+
`),process.exit(0)):c!=="build"&&t.push(c)}return{viteBuildArgs:t,debug:r,cwd:s,strategies:n}}async function Je(){let{loadUserConfig:e,hasCustomConfig:t}=await Promise.resolve().then(()=>(ce(),ve)),{mergeWithDefaults:r}=await Promise.resolve().then(()=>(te(),xe)),s=null;return t()&&(s=await e({mode:"production",command:"build",isCLI:!0}),s||console.log("\u274C \u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u5931\u8D25")),r(s)}function Qe(e,t,r){return new Promise(s=>{var f;let n=r?console.log.bind(console,`[${e}]`):()=>{};n(`\u5F00\u59CB\u6784\u5EFA\u7B56\u7565: ${e}`);let a={...process.env,VITE_MULTI_PAGE_STRATEGY:e},c=["build",...t];n(`\u6267\u884C\u547D\u4EE4: npx vite ${c.join(" ")}`);let l=(0,ge.spawn)("npx",["vite",...c],{stdio:r?"inherit":"pipe",env:a,cwd:process.cwd()}),g="";r||(f=l.stderr)==null||f.on("data",u=>{g+=u.toString()}),l.on("close",u=>{let i=u===0,p=L(t);if(i){n(`\u2705 \u7B56\u7565 ${e} \u6784\u5EFA\u6210\u529F`);try{if(d.existsSync(p)){let o=d.readdirSync(p);for(let m of o)if(m.startsWith(".temp.mp.")&&m.endsWith(".html")){let x=v.resolve(p,m),S=`${m.replace(/^\.temp\.mp\./,"").replace(/\.html$/,"")}.html`,$=v.resolve(p,S);d.renameSync(x,$),n(`\u91CD\u547D\u540DHTML: ${m} -> ${S}`)}}}catch(o){n("\u91CD\u547D\u540DHTML\u6587\u4EF6\u5931\u8D25:",o)}}else n(`\u274C \u7B56\u7565 ${e} \u6784\u5EFA\u5931\u8D25 (\u9000\u51FA\u7801: ${u})`),!r&&g&&console.error(`\u7B56\u7565 ${e} \u9519\u8BEF\u8F93\u51FA:`,g);s({strategy:e,success:i,error:i?void 0:g||`\u6784\u5EFA\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${u}`,outputDir:p})}),l.on("error",u=>{n(`\u274C \u7B56\u7565 ${e} \u6784\u5EFA\u51FA\u9519:`,u.message);let i=L(t);s({strategy:e,success:!1,error:u.message,outputDir:i})})})}function Ke(e,t,r,s){return new Promise(n=>{var i;let a=r?console.log.bind(console,`[${e}]`):()=>{};a(`\u5F00\u59CB\u6784\u5EFA\u9875\u9762: ${e}`);let c=v.resolve(process.cwd(),`dist-temp-${e}`),l={...process.env,VITE_MULTI_PAGE_BUILD_SINGLE_PAGE:e,VITE_MULTI_PAGE_TEMP_OUTPUT_DIR:c,VITE_MULTI_PAGE_STRATEGY:s},g=["build","--outDir",c,...t];a(`\u6267\u884C\u547D\u4EE4: npx vite ${g.join(" ")}`);let f=(0,ge.spawn)("npx",["vite",...g],{stdio:r?"inherit":"pipe",env:l,cwd:process.cwd()}),u="";r||(i=f.stderr)==null||i.on("data",p=>{u+=p.toString()}),f.on("close",p=>{let o=p===0;o?a(`\u2705 \u9875\u9762 ${e} \u6784\u5EFA\u6210\u529F`):(a(`\u274C \u9875\u9762 ${e} \u6784\u5EFA\u5931\u8D25 (\u9000\u51FA\u7801: ${p})`),!r&&u&&console.error(`\u9875\u9762 ${e} \u9519\u8BEF\u8F93\u51FA:`,u)),n({pageName:e,success:o,error:o?void 0:u||`\u6784\u5EFA\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${p}`,outputDir:c})}),f.on("error",p=>{a(`\u274C \u9875\u9762 ${e} \u6784\u5EFA\u51FA\u9519:`,p.message),n({pageName:e,success:!1,error:p.message,outputDir:c})})})}async function Xe(e,t,r){let s=r?console.log.bind(console,"[merge]"):()=>{};s("\u5F00\u59CB\u5408\u5E76\u6784\u5EFA\u7ED3\u679C...");let n=t.merge||"all";s(`\u4F7F\u7528\u5408\u5E76\u6A21\u5F0F: ${n}`),n==="all"?await De(e,r):n==="page"&&await et(e,t,r)}async function Ze(e,t,r){let s=r?console.log.bind(console,"[merge]"):()=>{},n=v.resolve(process.cwd(),"dist"),a=v.resolve(process.cwd(),".temp-merge");d.existsSync(a)&&d.rmSync(a,{recursive:!0,force:!0}),d.mkdirSync(a,{recursive:!0});for(let l of e){if(!l.success)continue;let g=l.outputDir;if(!d.existsSync(g)){s(`\u8B66\u544A: \u9875\u9762\u6784\u5EFA\u76EE\u5F55\u4E0D\u5B58\u5728: ${g}`);continue}let f=v.resolve(a,l.pageName);d.mkdirSync(f,{recursive:!0});let u=d.readdirSync(g,{withFileTypes:!0});for(let i of u){let p=v.resolve(g,i.name);if(i.isFile())if(i.name.endsWith(".html")){let o=v.resolve(f,"index.html");d.copyFileSync(p,o)}else{let o=v.resolve(f,i.name);d.copyFileSync(p,o)}else if(i.isDirectory())if(i.name===l.pageName){let o=d.readdirSync(p,{withFileTypes:!0});for(let m of o){let x=v.resolve(p,m.name),h=v.resolve(f,m.name);m.isFile()?d.copyFileSync(x,h):m.isDirectory()&&d.cpSync(x,h,{recursive:!0})}}else{let o=v.resolve(f,i.name);d.cpSync(p,o,{recursive:!0})}}}let c=v.resolve(v.dirname(n),".dist-backup");d.existsSync(c)&&d.rmSync(c,{recursive:!0,force:!0}),d.existsSync(n)&&d.renameSync(n,c);try{d.renameSync(a,n)}catch{d.cpSync(a,n,{recursive:!0}),d.rmSync(a,{recursive:!0,force:!0})}d.existsSync(c)&&d.rmSync(c,{recursive:!0,force:!0});for(let l of e)l.outputDir&&d.existsSync(l.outputDir)&&d.rmSync(l.outputDir,{recursive:!0,force:!0})}async function De(e,t){let r=t?console.log.bind(console,"[merge]"):()=>{},s=v.resolve(process.cwd(),"dist"),n=v.resolve(s,"assets");d.existsSync(n)||d.mkdirSync(n,{recursive:!0});let a=[];for(let c of e){if(!c.success)continue;let l=v.resolve(s,c.strategy);if(!d.existsSync(l)){r(`\u8B66\u544A: \u7B56\u7565\u76EE\u5F55\u4E0D\u5B58\u5728: ${l}`);continue}r(`\u5904\u7406\u7B56\u7565: ${c.strategy}`);let g=d.readdirSync(l,{withFileTypes:!0});for(let f of g){let u=v.resolve(l,f.name);if(f.isFile())if(f.name.endsWith(".html")){let i=v.resolve(s,f.name);d.copyFileSync(u,i),a.push(f.name),r(`\u590D\u5236HTML: ${f.name} -> dist/${f.name}`)}else{let i=v.resolve(s,f.name);d.copyFileSync(u,i),r(`\u590D\u5236\u6587\u4EF6: ${f.name} -> dist/${f.name}`)}else if(f.isDirectory()&&f.name==="assets"){let i=u,p=d.readdirSync(i,{withFileTypes:!0});for(let o of p){let m=v.resolve(i,o.name),x=v.resolve(n,o.name);if(o.isFile())if(d.existsSync(x)){let h=d.readFileSync(m),S=d.readFileSync(x);if(h.equals(S))r(`\u8DF3\u8FC7\u91CD\u590D\u8D44\u6E90: ${o.name}`);else{let $=v.extname(o.name),C=`${v.basename(o.name,$)}-${c.strategy}${$}`,A=v.resolve(n,C);d.copyFileSync(m,A),r(`\u590D\u5236\u8D44\u6E90(\u91CD\u547D\u540D): ${o.name} -> assets/${C}`)}}else d.copyFileSync(m,x),r(`\u590D\u5236\u8D44\u6E90: ${o.name} -> assets/${o.name}`);else if(o.isDirectory()){let h=v.resolve(n,o.name);d.existsSync(h)||d.mkdirSync(h,{recursive:!0}),d.cpSync(m,h,{recursive:!0}),r(`\u590D\u5236\u8D44\u6E90\u76EE\u5F55: ${o.name} -> assets/${o.name}`)}}}else if(f.isDirectory()){let i=v.resolve(s,f.name);d.cpSync(u,i,{recursive:!0}),r(`\u590D\u5236\u76EE\u5F55: ${f.name} -> dist/${f.name}`)}}}r("\u2705 \u6784\u5EFA\u7ED3\u679C\u5408\u5E76\u5B8C\u6210"),r(`\u{1F4C1} \u751F\u6210\u9875\u9762: ${a.join(", ")}`),r("\u{1F4E6} \u8D44\u6E90\u76EE\u5F55: dist/assets/"),r(`\u{1F527} \u5904\u7406\u7B56\u7565: ${e.filter(c=>c.success).map(c=>c.strategy).join(", ")}`)}async function et(e,t,r){let s=r?console.log.bind(console,"[merge]"):()=>{};await De(e,r);let n=v.resolve(process.cwd(),"dist"),a=t.merge;s(`\u5E94\u7528${a}\u6A21\u5F0F\u7684\u8D44\u6E90\u91CD\u7EC4...`);try{let{reorganizeAssetsInCLI:c}=await Promise.resolve().then(()=>(Oe(),_e));await c(n,a,t,s),s(`\u2705 ${a}\u6A21\u5F0F\u8D44\u6E90\u91CD\u7EC4\u5B8C\u6210`)}catch(c){throw s("\u8D44\u6E90\u91CD\u7EC4\u5931\u8D25:",c),c}}async function fe(e){let t=se.sync(".temp.mp.*.html",{cwd:process.cwd()});for(let r of t){let s=v.resolve(process.cwd(),r);try{d.unlinkSync(s)}catch{}}}async function tt(e,t,r){let s=r?console.log.bind(console,"[cleanup]"):()=>{};s("\u6E05\u7406\u4E34\u65F6\u6587\u4EF6...");let n=t.merge||"all",a=se.sync(".temp.mp.*.html",{cwd:process.cwd()});for(let c of a){let l=v.resolve(process.cwd(),c);try{d.unlinkSync(l),s(`\u5220\u9664\u6839\u76EE\u5F55\u4E34\u65F6\u6587\u4EF6: ${c}`)}catch(g){s(`\u5220\u9664\u6839\u76EE\u5F55\u4E34\u65F6\u6587\u4EF6\u5931\u8D25: ${c}`,g)}}for(let c of e){let l=v.resolve(process.cwd(),"dist",c);if(d.existsSync(l)){let g=se.sync("*.mp.temp.html",{cwd:l});for(let f of g){let u=v.resolve(l,f);try{d.unlinkSync(u),s(`\u5220\u9664\u7B56\u7565\u76EE\u5F55\u4E34\u65F6\u6587\u4EF6: ${c}/${f}`)}catch(i){s(`\u5220\u9664\u7B56\u7565\u76EE\u5F55\u4E34\u65F6\u6587\u4EF6\u5931\u8D25: ${c}/${f}`,i)}}}}if(n==="all"){let c=v.resolve(process.cwd(),"dist");for(let l of e){let g=v.resolve(c,l);if(d.existsSync(g))try{d.rmSync(g,{recursive:!0,force:!0}),s(`\u5220\u9664\u7B56\u7565\u76EE\u5F55: ${l}`)}catch(f){s(`\u5220\u9664\u7B56\u7565\u76EE\u5F55\u5931\u8D25: ${l}`,f)}}}else s(`\u4FDD\u7559\u7B56\u7565\u76EE\u5F55 (merge\u6A21\u5F0F: ${n})`);s("\u2705 \u6E05\u7406\u5B8C\u6210")}async function Me(){let{viteBuildArgs:e,debug:t,cwd:r,strategies:s}=qe(),n=t?console.log.bind(console,"[main]"):()=>{};if(r){let a=v.resolve(process.cwd(),r);d.existsSync(a)||(console.error(`\u274C \u6307\u5B9A\u7684\u76EE\u5F55\u4E0D\u5B58\u5728: ${a}`),process.exit(1)),process.chdir(a),n(`\u5207\u6362\u5DE5\u4F5C\u76EE\u5F55\u5230: ${a}`)}try{n("\u{1F4CB} \u52A0\u8F7D\u914D\u7F6E...");let a=await Je(),c=a.merge||"all";n("\u{1F9F9} \u6E05\u7406\u8F93\u51FA\u76EE\u5F55...");let{cleanViteOutputDirectory:l}=await Promise.resolve().then(()=>(U(),X));l(e),c==="page"?await st(a,e,t):await nt(a,e,t,s)}catch(a){console.error("\u274C \u6784\u5EFA\u5931\u8D25:",a instanceof Error?a.message:a),process.exit(1)}}async function st(e,t,r){let s=r?console.log.bind(console,"[page-mode]"):()=>{};s("\u{1F680} \u5F00\u59CBPage\u6A21\u5F0F\u6784\u5EFA...");let{discoverPages:n}=await Promise.resolve().then(()=>(U(),X)),a=n({entry:e.entry||"src/pages/*/main.{ts,js}",exclude:e.exclude||[],template:e.template||"index.html",placeholder:e.placeholder||"{{ENTRY_FILE}}",pageConfigs:e.pageConfigs||{},strategies:e.strategies||{}});if(a.length===0)throw new Error("\u672A\u627E\u5230\u4EFB\u4F55\u9875\u9762");s(`\u53D1\u73B0\u9875\u9762: ${a.map(o=>o.name).join(", ")}`);let{getPageConfig:c}=await Promise.resolve().then(()=>(J(),ue)),l=new Map;for(let o of a){let m={pageName:o.name,filePath:o.file,relativePath:v.relative(process.cwd(),o.file)},x=c(e.pageConfigs,m,()=>{}),h=(x==null?void 0:x.strategy)||"default";l.set(o.name,h)}s("\u{1F528} \u5F00\u59CB\u5E76\u884C\u6784\u5EFA\u9875\u9762...");let g=a.map(o=>{let m=l.get(o.name)||"default";return Ke(o.name,t,r,m)}),f=await Promise.all(g),u=f.filter(o=>o.success).length,i=f.length-u;console.log(`
|
|
139
|
+
\u{1F4CA} \u9875\u9762\u6784\u5EFA\u7ED3\u679C\u7EDF\u8BA1:`),console.log(`\u2705 \u6210\u529F: ${u}`),console.log(`\u274C \u5931\u8D25: ${i}`),i>0&&(console.log(`
|
|
140
|
+
\u274C \u5931\u8D25\u7684\u9875\u9762:`),f.filter(o=>!o.success).forEach(o=>{console.log(` - ${o.pageName}: ${o.error}`)}),await fe(r),process.exit(1)),await Ze(f,e,r),await fe(r);let p=f.filter(o=>o.success);console.log(`
|
|
141
|
+
\u{1F389} \u6240\u6709\u9875\u9762\u6784\u5EFA\u6210\u529F\uFF01`),console.log("\u{1F4C1} \u6784\u5EFA\u7ED3\u679C\u4F4D\u4E8E: dist/"),console.log(`\u{1F4E6} \u6784\u5EFA\u9875\u9762: ${p.map(o=>o.pageName).join(", ")}`)}async function nt(e,t,r,s){let n=r?console.log.bind(console,"[strategy-mode]"):()=>{};n("\u{1F680} \u5F00\u59CB\u7B56\u7565\u6A21\u5F0F\u6784\u5EFA...");let{getAvailableStrategies:a}=await Promise.resolve().then(()=>(U(),X)),c=a({entry:e.entry||"src/pages/*/main.{ts,js}",exclude:e.exclude||[],template:e.template||"index.html",placeholder:e.placeholder||"{{ENTRY_FILE}}",pageConfigs:e.pageConfigs||{},strategies:e.strategies||{}});if(c.length===0)throw new Error("\u672A\u627E\u5230\u4EFB\u4F55\u6784\u5EFA\u7B56\u7565");let l;if(s&&s.length>0){let m=s.filter(x=>!c.includes(x));if(m.length>0)throw new Error(`\u6307\u5B9A\u7684\u7B56\u7565\u4E0D\u5B58\u5728: ${m.join(", ")}
|
|
142
|
+
\u53EF\u7528\u7B56\u7565: ${c.join(", ")}`);l=s,n(`\u4F7F\u7528\u6307\u5B9A\u7684\u7B56\u7565: ${l.join(", ")}`)}else l=c,n(`\u6784\u5EFA\u6240\u6709\u53EF\u7528\u7B56\u7565: ${l.join(", ")}`);n("\u{1F528} \u5F00\u59CB\u5E76\u884C\u6784\u5EFA...");let g=l.map(m=>Qe(m,t,r)),f=await Promise.all(g),u=f.filter(m=>m.success).length,i=f.length-u;console.log(`
|
|
143
|
+
\u{1F4CA} \u6784\u5EFA\u7ED3\u679C\u7EDF\u8BA1:`),console.log(`\u2705 \u6210\u529F: ${u}`),console.log(`\u274C \u5931\u8D25: ${i}`),i>0&&(console.log(`
|
|
144
|
+
\u274C \u5931\u8D25\u7684\u7B56\u7565:`),f.filter(m=>!m.success).forEach(m=>{console.log(` - ${m.strategy}: ${m.error}`)}),await fe(r),process.exit(1)),n("\u{1F4E6} \u5408\u5E76\u6784\u5EFA\u7ED3\u679C..."),await Xe(f,e,r),await tt(l,e,r);let p=f.filter(m=>m.success),o=d.readdirSync(v.resolve(process.cwd(),"dist")).filter(m=>m.endsWith(".html"));console.log(`
|
|
145
|
+
\u{1F389} \u6240\u6709\u7B56\u7565\u6784\u5EFA\u6210\u529F\uFF01`),console.log("\u{1F4C1} \u6784\u5EFA\u7ED3\u679C\u4F4D\u4E8E: dist/"),console.log(`\u{1F310} \u751F\u6210\u7684\u9875\u9762: ${o.join(", ")}`),console.log(`\u{1F4E6} \u6784\u5EFA\u7B56\u7565: ${p.map(m=>m.strategy).join(", ")}`)}require.main===module&&Me().catch(e=>{console.error("\u274C \u672A\u5904\u7406\u7684\u9519\u8BEF:",e),process.exit(1)});0&&(module.exports={buildAll});
|