@fchc8/vite-plugin-multi-page 1.0.5 → 1.1.0
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 +97 -0
- package/dist/index.js +181 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +182 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
- 🔧 **完整 Vite 集成**:继承所有 Vite 配置选项
|
|
14
14
|
- 🌍 **环境变量支持**:页面级和策略级环境变量定义
|
|
15
15
|
- 🎨 **开发友好**:详细的调试日志和热重载支持
|
|
16
|
+
- ⚡ **开发构建一致性**:确保开发模式与构建模式使用相同的配置逻辑
|
|
17
|
+
- 🔄 **配置同步**:环境变量、模板选择、构建策略在开发和生产环境保持一致
|
|
16
18
|
|
|
17
19
|
## 📦 安装
|
|
18
20
|
|
|
@@ -419,3 +421,98 @@ MIT License
|
|
|
419
421
|
- [Prettier](https://prettier.io/)
|
|
420
422
|
- [Git Flow](https://nvie.com/posts/a-successful-git-branching-model/)
|
|
421
423
|
- [语义化版本](https://semver.org/lang/zh-CN/)
|
|
424
|
+
|
|
425
|
+
## ⚡ 开发与构建一致性
|
|
426
|
+
|
|
427
|
+
### 配置同步机制
|
|
428
|
+
|
|
429
|
+
本插件确保开发模式与构建模式使用**完全相同的配置逻辑**,避免开发环境和生产环境的差异问题。
|
|
430
|
+
|
|
431
|
+
#### 1. 页面配置一致性
|
|
432
|
+
|
|
433
|
+
```typescript
|
|
434
|
+
// 开发和构建都使用相同的页面配置逻辑
|
|
435
|
+
pageConfigs: context => {
|
|
436
|
+
const { pageName, relativePath } = context;
|
|
437
|
+
|
|
438
|
+
// 移动端页面 - 开发和构建都使用 mobile.html 模板
|
|
439
|
+
if (relativePath.includes('/mobile/')) {
|
|
440
|
+
return {
|
|
441
|
+
template: 'mobile.html',
|
|
442
|
+
define: {
|
|
443
|
+
'process.env.API_BASE': '"https://mobile-api.com"',
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return { template: 'index.html' };
|
|
449
|
+
};
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
#### 2. 环境变量同步
|
|
453
|
+
|
|
454
|
+
**构建时**:注入到 Vite 配置
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
// 环境变量会被 Vite 编译时替换
|
|
458
|
+
config.define = { 'process.env.API_BASE': '"https://api.com"' };
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
**开发时**:动态注入到 HTML
|
|
462
|
+
|
|
463
|
+
```html
|
|
464
|
+
<!-- 开发服务器自动注入到页面 -->
|
|
465
|
+
<script>
|
|
466
|
+
// 页面级环境变量
|
|
467
|
+
window['process.env.API_BASE'] = 'https://api.com';
|
|
468
|
+
</script>
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
#### 3. 模板选择一致性
|
|
472
|
+
|
|
473
|
+
```typescript
|
|
474
|
+
// 开发模式
|
|
475
|
+
if (pageConfig?.template) {
|
|
476
|
+
const templatePath = path.resolve(pageConfig.template);
|
|
477
|
+
// 使用指定模板
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// 构建模式
|
|
481
|
+
const templateFile = pageConfig?.template || options.template;
|
|
482
|
+
// 使用相同的模板选择逻辑
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
#### 4. 构建策略应用
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
// 开发模式:应用策略到开发配置
|
|
489
|
+
if (strategy.viteConfig) {
|
|
490
|
+
config.css = { ...config.css, ...strategy.viteConfig.css };
|
|
491
|
+
config.define = { ...config.define, ...strategy.define };
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// 构建模式:应用策略到构建配置
|
|
495
|
+
if (strategy.viteConfig) {
|
|
496
|
+
applyBuildStrategy(config, strategy);
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### 验证一致性
|
|
501
|
+
|
|
502
|
+
运行示例项目验证配置一致性:
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
# 开发模式
|
|
506
|
+
cd example
|
|
507
|
+
npm run dev
|
|
508
|
+
# 访问 http://localhost:5173/mobile.html
|
|
509
|
+
|
|
510
|
+
# 构建模式
|
|
511
|
+
npm run build
|
|
512
|
+
npm run preview
|
|
513
|
+
# 访问 http://localhost:4173/mobile.html
|
|
514
|
+
|
|
515
|
+
# 对比两种模式下的页面表现应该完全一致
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
## 🌟 使用场景
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
"use strict";
|
|
2
3
|
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
@@ -30,12 +31,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
31
|
// src/index.ts
|
|
31
32
|
var src_exports = {};
|
|
32
33
|
__export(src_exports, {
|
|
33
|
-
default: () =>
|
|
34
|
+
default: () => src_default,
|
|
34
35
|
viteMultiPage: () => viteMultiPage
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(src_exports);
|
|
37
38
|
var path4 = __toESM(require("path"));
|
|
38
39
|
var fs3 = __toESM(require("fs"));
|
|
40
|
+
var import_glob3 = require("glob");
|
|
39
41
|
|
|
40
42
|
// src/utils.ts
|
|
41
43
|
function escapeRegExp(string) {
|
|
@@ -112,16 +114,95 @@ function filterEntryFiles(files, entry, exclude, log) {
|
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
// src/dev-server.ts
|
|
117
|
+
function simpleMatch(pattern, text) {
|
|
118
|
+
const regexPattern = pattern.replace(/\*\*/g, "__DOUBLE_STAR__").replace(/\*/g, "[^/]*").replace(/__DOUBLE_STAR__/g, ".*");
|
|
119
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
120
|
+
return regex.test(text);
|
|
121
|
+
}
|
|
122
|
+
function getPageConfig(pageConfigs, context, log) {
|
|
123
|
+
if (!pageConfigs)
|
|
124
|
+
return null;
|
|
125
|
+
if (typeof pageConfigs === "function") {
|
|
126
|
+
const result = pageConfigs(context);
|
|
127
|
+
if (result) {
|
|
128
|
+
log(`\u51FD\u6570\u914D\u7F6E\u5339\u914D\u9875\u9762 ${context.pageName}:`, result);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
for (const [key, config] of Object.entries(pageConfigs)) {
|
|
133
|
+
if (key === context.pageName) {
|
|
134
|
+
log(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${context.pageName}:`, config);
|
|
135
|
+
return config;
|
|
136
|
+
}
|
|
137
|
+
if (config.match) {
|
|
138
|
+
const patterns = Array.isArray(config.match) ? config.match : [config.match];
|
|
139
|
+
const isMatched = patterns.some(
|
|
140
|
+
(pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
|
|
141
|
+
);
|
|
142
|
+
if (isMatched) {
|
|
143
|
+
log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
|
|
144
|
+
return { ...config, match: void 0 };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (simpleMatch(key, context.pageName)) {
|
|
148
|
+
log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
|
|
149
|
+
return config;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
function applyDevStrategy(server, strategy, log) {
|
|
155
|
+
if (!strategy)
|
|
156
|
+
return;
|
|
157
|
+
log("\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u6784\u5EFA\u7B56\u7565:", strategy);
|
|
158
|
+
if (strategy.define) {
|
|
159
|
+
log("\u5F00\u53D1\u73AF\u5883\u53D8\u91CF\u914D\u7F6E:", strategy.define);
|
|
160
|
+
}
|
|
161
|
+
if (strategy.alias) {
|
|
162
|
+
log("\u5F00\u53D1\u522B\u540D\u914D\u7F6E:", strategy.alias);
|
|
163
|
+
}
|
|
164
|
+
if (strategy.server) {
|
|
165
|
+
log("\u670D\u52A1\u5668\u914D\u7F6E:", strategy.server);
|
|
166
|
+
}
|
|
167
|
+
if (strategy.css) {
|
|
168
|
+
log("CSS\u914D\u7F6E:", strategy.css);
|
|
169
|
+
}
|
|
170
|
+
if (strategy.optimizeDeps) {
|
|
171
|
+
log("\u4F9D\u8D56\u4F18\u5316\u914D\u7F6E:", strategy.optimizeDeps);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
115
174
|
function configureDevServer(server, options, log) {
|
|
116
175
|
const allFiles = import_glob.glob.sync(options.entry, { cwd: process.cwd() });
|
|
117
176
|
const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);
|
|
118
177
|
const pageMap = /* @__PURE__ */ new Map();
|
|
119
178
|
entryFiles.forEach(({ name, file }) => {
|
|
120
|
-
|
|
179
|
+
const pageConfig = getPageConfig(
|
|
180
|
+
options.pageConfigs,
|
|
181
|
+
{
|
|
182
|
+
pageName: name,
|
|
183
|
+
filePath: file,
|
|
184
|
+
relativePath: path2.relative(process.cwd(), file),
|
|
185
|
+
strategy: void 0,
|
|
186
|
+
isMatched: false
|
|
187
|
+
},
|
|
188
|
+
log
|
|
189
|
+
);
|
|
190
|
+
const strategy = (pageConfig == null ? void 0 : pageConfig.strategy) || "default";
|
|
191
|
+
pageMap.set(name, {
|
|
192
|
+
file,
|
|
193
|
+
config: pageConfig,
|
|
194
|
+
strategy
|
|
195
|
+
});
|
|
196
|
+
if (options.buildStrategies && (pageConfig == null ? void 0 : pageConfig.strategy)) {
|
|
197
|
+
const buildStrategy = options.buildStrategies[pageConfig.strategy];
|
|
198
|
+
if (buildStrategy) {
|
|
199
|
+
applyDevStrategy(server, buildStrategy, log);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
121
202
|
});
|
|
122
203
|
const pageNames = Array.from(pageMap.keys());
|
|
123
204
|
log("Available pages:", pageNames);
|
|
124
|
-
log("Page mapping:", Object.fromEntries(pageMap));
|
|
205
|
+
log("Page mapping with configs:", Object.fromEntries(pageMap));
|
|
125
206
|
server.middlewares.use((req, res, next) => {
|
|
126
207
|
var _a;
|
|
127
208
|
const originalUrl = req.url;
|
|
@@ -142,12 +223,20 @@ function configureDevServer(server, options, log) {
|
|
|
142
223
|
log(`\u5339\u914D\u5230\u9875\u9762: ${pageName}`);
|
|
143
224
|
log(`\u53EF\u7528\u9875\u9762\u5217\u8868: ${pageNames.join(", ")}`);
|
|
144
225
|
if (pageMap.has(pageName)) {
|
|
145
|
-
const
|
|
226
|
+
const pageInfo = pageMap.get(pageName);
|
|
227
|
+
if (!pageInfo) {
|
|
228
|
+
log(`\u9875\u9762\u4FE1\u606F\u83B7\u53D6\u5931\u8D25: ${pageName}`);
|
|
229
|
+
return next();
|
|
230
|
+
}
|
|
231
|
+
const relativeEntryPath = pageInfo.file;
|
|
232
|
+
const pageConfig = pageInfo.config;
|
|
146
233
|
const entryPath = path2.resolve(process.cwd(), relativeEntryPath);
|
|
147
234
|
log(`\u9875\u9762 ${pageName} \u5BF9\u5E94\u6587\u4EF6: ${relativeEntryPath}`);
|
|
235
|
+
log(`\u9875\u9762\u914D\u7F6E:`, pageConfig);
|
|
148
236
|
if (fs.existsSync(entryPath)) {
|
|
149
237
|
log(`\u627E\u5230\u5165\u53E3\u6587\u4EF6: ${entryPath}`);
|
|
150
|
-
const
|
|
238
|
+
const templateFile = (pageConfig == null ? void 0 : pageConfig.template) || options.template;
|
|
239
|
+
const templatePath = path2.resolve(process.cwd(), templateFile);
|
|
151
240
|
if (fs.existsSync(templatePath)) {
|
|
152
241
|
let html = fs.readFileSync(templatePath, "utf-8");
|
|
153
242
|
log(`\u8BFB\u53D6\u6A21\u677F\u6587\u4EF6: ${templatePath}`);
|
|
@@ -160,8 +249,20 @@ function configureDevServer(server, options, log) {
|
|
|
160
249
|
}
|
|
161
250
|
const entryFile = `/${relativeEntryPath}`;
|
|
162
251
|
html = html.replace(new RegExp(escapeRegExp(options.placeholder), "g"), entryFile);
|
|
252
|
+
if (pageConfig == null ? void 0 : pageConfig.define) {
|
|
253
|
+
const defineScript = Object.entries(pageConfig.define).map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`).join("\n");
|
|
254
|
+
if (defineScript) {
|
|
255
|
+
const scriptTag = `<script>
|
|
256
|
+
// \u9875\u9762\u7EA7\u73AF\u5883\u53D8\u91CF
|
|
257
|
+
${defineScript}
|
|
258
|
+
</script>`;
|
|
259
|
+
html = html.replace("</head>", `${scriptTag}
|
|
260
|
+
</head>`);
|
|
261
|
+
log(`\u6CE8\u5165\u9875\u9762\u73AF\u5883\u53D8\u91CF:`, pageConfig.define);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
163
264
|
log(`\u5360\u4F4D\u7B26 ${options.placeholder} \u66FF\u6362\u4E3A: ${entryFile}`);
|
|
164
|
-
log(`\
|
|
265
|
+
log(`\u4F7F\u7528\u6A21\u677F: ${templateFile}`);
|
|
165
266
|
res.setHeader("Content-Type", "text/html");
|
|
166
267
|
res.end(html);
|
|
167
268
|
return;
|
|
@@ -183,7 +284,7 @@ function configureDevServer(server, options, log) {
|
|
|
183
284
|
var path3 = __toESM(require("path"));
|
|
184
285
|
var fs2 = __toESM(require("fs"));
|
|
185
286
|
var import_glob2 = require("glob");
|
|
186
|
-
function
|
|
287
|
+
function simpleMatch2(pattern, str) {
|
|
187
288
|
const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
|
|
188
289
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
189
290
|
return regex.test(str);
|
|
@@ -213,7 +314,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
|
|
|
213
314
|
const defaultStrategy = "default";
|
|
214
315
|
entryFiles.forEach((entryFile) => {
|
|
215
316
|
const { name, file } = entryFile;
|
|
216
|
-
const pageConfig =
|
|
317
|
+
const pageConfig = getPageConfig2(
|
|
217
318
|
options.pageConfigs,
|
|
218
319
|
{
|
|
219
320
|
pageName: name,
|
|
@@ -266,7 +367,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
|
|
|
266
367
|
};
|
|
267
368
|
}
|
|
268
369
|
}
|
|
269
|
-
function
|
|
370
|
+
function getPageConfig2(pageConfigs, context, log) {
|
|
270
371
|
if (!pageConfigs)
|
|
271
372
|
return null;
|
|
272
373
|
if (typeof pageConfigs === "function") {
|
|
@@ -284,14 +385,14 @@ function getPageConfig(pageConfigs, context, log) {
|
|
|
284
385
|
if (config.match) {
|
|
285
386
|
const patterns = Array.isArray(config.match) ? config.match : [config.match];
|
|
286
387
|
const isMatched = patterns.some(
|
|
287
|
-
(pattern) =>
|
|
388
|
+
(pattern) => simpleMatch2(pattern, context.pageName) || simpleMatch2(pattern, context.relativePath) || simpleMatch2(pattern, context.filePath)
|
|
288
389
|
);
|
|
289
390
|
if (isMatched) {
|
|
290
391
|
log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
|
|
291
392
|
return { ...config, match: void 0 };
|
|
292
393
|
}
|
|
293
394
|
}
|
|
294
|
-
if (
|
|
395
|
+
if (simpleMatch2(key, context.pageName)) {
|
|
295
396
|
log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
|
|
296
397
|
return config;
|
|
297
398
|
}
|
|
@@ -404,10 +505,77 @@ function viteMultiPage(options = {}) {
|
|
|
404
505
|
);
|
|
405
506
|
} else {
|
|
406
507
|
createDevConfig({ entry, exclude }, log);
|
|
508
|
+
if (buildStrategies || pageConfigs) {
|
|
509
|
+
const allFiles = import_glob3.glob.sync(entry, { cwd: process.cwd() });
|
|
510
|
+
const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);
|
|
511
|
+
const strategiesToApply = /* @__PURE__ */ new Set();
|
|
512
|
+
entryFiles.forEach(({ name, file }) => {
|
|
513
|
+
if (typeof pageConfigs === "function") {
|
|
514
|
+
const pageConfig = pageConfigs({
|
|
515
|
+
pageName: name,
|
|
516
|
+
filePath: file,
|
|
517
|
+
relativePath: path4.relative(process.cwd(), file),
|
|
518
|
+
strategy: void 0,
|
|
519
|
+
isMatched: false
|
|
520
|
+
});
|
|
521
|
+
if (pageConfig == null ? void 0 : pageConfig.strategy) {
|
|
522
|
+
strategiesToApply.add(pageConfig.strategy);
|
|
523
|
+
}
|
|
524
|
+
} else if (pageConfigs) {
|
|
525
|
+
const pageConfig = pageConfigs[name];
|
|
526
|
+
if (pageConfig == null ? void 0 : pageConfig.strategy) {
|
|
527
|
+
strategiesToApply.add(pageConfig.strategy);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
strategiesToApply.forEach((strategyName) => {
|
|
532
|
+
const strategy = buildStrategies == null ? void 0 : buildStrategies[strategyName];
|
|
533
|
+
if (strategy) {
|
|
534
|
+
log(`\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u7B56\u7565 ${strategyName}:`, strategy);
|
|
535
|
+
if (strategy.viteConfig) {
|
|
536
|
+
const { build, ...otherViteConfig } = strategy.viteConfig;
|
|
537
|
+
Object.keys(otherViteConfig).forEach((key) => {
|
|
538
|
+
if (key !== "plugins") {
|
|
539
|
+
const configKey = key;
|
|
540
|
+
const viteConfigValue = otherViteConfig[key];
|
|
541
|
+
if (viteConfigValue && typeof viteConfigValue === "object") {
|
|
542
|
+
config[configKey] = {
|
|
543
|
+
...config[configKey] || {},
|
|
544
|
+
...viteConfigValue
|
|
545
|
+
};
|
|
546
|
+
} else {
|
|
547
|
+
config[configKey] = viteConfigValue;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
if (strategy.define) {
|
|
553
|
+
config.define = { ...config.define, ...strategy.define };
|
|
554
|
+
}
|
|
555
|
+
if (strategy.alias) {
|
|
556
|
+
config.resolve = config.resolve || {};
|
|
557
|
+
config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };
|
|
558
|
+
}
|
|
559
|
+
if (strategy.server) {
|
|
560
|
+
config.server = { ...config.server, ...strategy.server };
|
|
561
|
+
}
|
|
562
|
+
if (strategy.css) {
|
|
563
|
+
config.css = { ...config.css, ...strategy.css };
|
|
564
|
+
}
|
|
565
|
+
if (strategy.optimizeDeps) {
|
|
566
|
+
config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
}
|
|
407
571
|
}
|
|
408
572
|
},
|
|
409
573
|
configureServer(server) {
|
|
410
|
-
configureDevServer(
|
|
574
|
+
configureDevServer(
|
|
575
|
+
server,
|
|
576
|
+
{ entry, exclude, template, placeholder, buildStrategies, pageConfigs },
|
|
577
|
+
log
|
|
578
|
+
);
|
|
411
579
|
},
|
|
412
580
|
generateBundle() {
|
|
413
581
|
},
|
|
@@ -434,6 +602,7 @@ function viteMultiPage(options = {}) {
|
|
|
434
602
|
}
|
|
435
603
|
};
|
|
436
604
|
}
|
|
605
|
+
var src_default = viteMultiPage;
|
|
437
606
|
// Annotate the CommonJS export names for ESM import in node:
|
|
438
607
|
0 && (module.exports = {
|
|
439
608
|
viteMultiPage
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\n\nexport type { MultiPageOptions };\n\nexport default function viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n }\n },\n\n configureServer(server) {\n configureDevServer(server, { entry, exclude, template, placeholder }, log);\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, string>();\n entryFiles.forEach(({ name, file }) => {\n pageMap.set(name, file);\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const relativeEntryPath = pageMap.get(pageName)!;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n const templatePath = path.resolve(process.cwd(), options.template);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`替换后包含占位符: ${html.includes(options.placeholder)}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","path","path","fs","import_glob","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\nimport { filterEntryFiles } from './file-filter';\n\nexport type { MultiPageOptions };\n\nfunction viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n\n if (buildStrategies || pageConfigs) {\n const allFiles = glob.sync(entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);\n\n const strategiesToApply = new Set<string>();\n\n entryFiles.forEach(({ name, file }) => {\n if (typeof pageConfigs === 'function') {\n const pageConfig = pageConfigs({\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n });\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n } else if (pageConfigs) {\n const pageConfig = pageConfigs[name];\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n }\n });\n\n strategiesToApply.forEach(strategyName => {\n const strategy = buildStrategies?.[strategyName];\n if (strategy) {\n log(`开发模式应用策略 ${strategyName}:`, strategy);\n\n if (strategy.viteConfig) {\n // 解构时跳过 build 属性,因为开发模式不需要构建配置\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { build, ...otherViteConfig } = strategy.viteConfig;\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n }\n\n if (strategy.define) {\n config.define = { ...config.define, ...strategy.define };\n }\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };\n }\n if (strategy.server) {\n config.server = { ...config.server, ...strategy.server };\n }\n if (strategy.css) {\n config.css = { ...config.css, ...strategy.css };\n }\n if (strategy.optimizeDeps) {\n config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };\n }\n }\n });\n }\n }\n },\n\n configureServer(server) {\n configureDevServer(\n server,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log\n );\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\n// 默认导出\nexport default viteMultiPage;\n\n// 具名导出以支持 CommonJS 和 ESM\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { PageConfig, PageConfigFunction, PageConfigContext, BuildStrategy } from './types';\n\nfunction simpleMatch(pattern: string, text: string): boolean {\n const regexPattern = pattern\n .replace(/\\*\\*/g, '__DOUBLE_STAR__')\n .replace(/\\*/g, '[^/]*')\n .replace(/__DOUBLE_STAR__/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(text);\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined };\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyDevStrategy(\n server: ViteDevServer,\n strategy: BuildStrategy,\n log: (...args: any[]) => void\n) {\n if (!strategy) return;\n\n log('开发模式应用构建策略:', strategy);\n\n // 注意:开发服务器的配置在启动后是只读的\n // 这里主要记录配置信息,实际应用需要在插件的 config 钩子中处理\n\n if (strategy.define) {\n log('开发环境变量配置:', strategy.define);\n }\n\n if (strategy.alias) {\n log('开发别名配置:', strategy.alias);\n }\n\n if (strategy.server) {\n log('服务器配置:', strategy.server);\n }\n\n if (strategy.css) {\n log('CSS配置:', strategy.css);\n }\n\n if (strategy.optimizeDeps) {\n log('依赖优化配置:', strategy.optimizeDeps);\n }\n}\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, { file: string; config: PageConfig | null; strategy?: string }>();\n\n entryFiles.forEach(({ name, file }) => {\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || 'default';\n\n pageMap.set(name, {\n file,\n config: pageConfig,\n strategy,\n });\n\n // 如果指定了构建策略,记录配置信息\n if (options.buildStrategies && pageConfig?.strategy) {\n const buildStrategy = options.buildStrategies[pageConfig.strategy];\n if (buildStrategy) {\n applyDevStrategy(server, buildStrategy, log);\n }\n }\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping with configs:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n const pageInfo = pageMap.get(pageName);\n if (!pageInfo) {\n log(`页面信息获取失败: ${pageName}`);\n return next();\n }\n\n const relativeEntryPath = pageInfo.file;\n const pageConfig = pageInfo.config;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n log(`页面配置:`, pageConfig);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n // 根据页面配置选择模板\n const templateFile = pageConfig?.template || options.template;\n const templatePath = path.resolve(process.cwd(), templateFile);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n // 应用页面级环境变量注入\n if (pageConfig?.define) {\n // 在HTML中注入环境变量\n const defineScript = Object.entries(pageConfig.define)\n .map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`)\n .join('\\n');\n\n if (defineScript) {\n const scriptTag = `<script>\n // 页面级环境变量\n ${defineScript}\n </script>`;\n html = html.replace('</head>', `${scriptTag}\\n</head>`);\n log(`注入页面环境变量:`, pageConfig.define);\n }\n }\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`使用模板: ${templateFile}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","import_glob","path","path","fs","import_glob","simpleMatch","getPageConfig","options"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
1
3
|
// src/index.ts
|
|
2
4
|
import * as path4 from "node:path";
|
|
3
5
|
import * as fs3 from "node:fs";
|
|
6
|
+
import { glob as glob3 } from "glob";
|
|
4
7
|
|
|
5
8
|
// src/utils.ts
|
|
6
9
|
function escapeRegExp(string) {
|
|
@@ -77,16 +80,95 @@ function filterEntryFiles(files, entry, exclude, log) {
|
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
// src/dev-server.ts
|
|
83
|
+
function simpleMatch(pattern, text) {
|
|
84
|
+
const regexPattern = pattern.replace(/\*\*/g, "__DOUBLE_STAR__").replace(/\*/g, "[^/]*").replace(/__DOUBLE_STAR__/g, ".*");
|
|
85
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
86
|
+
return regex.test(text);
|
|
87
|
+
}
|
|
88
|
+
function getPageConfig(pageConfigs, context, log) {
|
|
89
|
+
if (!pageConfigs)
|
|
90
|
+
return null;
|
|
91
|
+
if (typeof pageConfigs === "function") {
|
|
92
|
+
const result = pageConfigs(context);
|
|
93
|
+
if (result) {
|
|
94
|
+
log(`\u51FD\u6570\u914D\u7F6E\u5339\u914D\u9875\u9762 ${context.pageName}:`, result);
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
for (const [key, config] of Object.entries(pageConfigs)) {
|
|
99
|
+
if (key === context.pageName) {
|
|
100
|
+
log(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${context.pageName}:`, config);
|
|
101
|
+
return config;
|
|
102
|
+
}
|
|
103
|
+
if (config.match) {
|
|
104
|
+
const patterns = Array.isArray(config.match) ? config.match : [config.match];
|
|
105
|
+
const isMatched = patterns.some(
|
|
106
|
+
(pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
|
|
107
|
+
);
|
|
108
|
+
if (isMatched) {
|
|
109
|
+
log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
|
|
110
|
+
return { ...config, match: void 0 };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (simpleMatch(key, context.pageName)) {
|
|
114
|
+
log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
|
|
115
|
+
return config;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
function applyDevStrategy(server, strategy, log) {
|
|
121
|
+
if (!strategy)
|
|
122
|
+
return;
|
|
123
|
+
log("\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u6784\u5EFA\u7B56\u7565:", strategy);
|
|
124
|
+
if (strategy.define) {
|
|
125
|
+
log("\u5F00\u53D1\u73AF\u5883\u53D8\u91CF\u914D\u7F6E:", strategy.define);
|
|
126
|
+
}
|
|
127
|
+
if (strategy.alias) {
|
|
128
|
+
log("\u5F00\u53D1\u522B\u540D\u914D\u7F6E:", strategy.alias);
|
|
129
|
+
}
|
|
130
|
+
if (strategy.server) {
|
|
131
|
+
log("\u670D\u52A1\u5668\u914D\u7F6E:", strategy.server);
|
|
132
|
+
}
|
|
133
|
+
if (strategy.css) {
|
|
134
|
+
log("CSS\u914D\u7F6E:", strategy.css);
|
|
135
|
+
}
|
|
136
|
+
if (strategy.optimizeDeps) {
|
|
137
|
+
log("\u4F9D\u8D56\u4F18\u5316\u914D\u7F6E:", strategy.optimizeDeps);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
80
140
|
function configureDevServer(server, options, log) {
|
|
81
141
|
const allFiles = glob.sync(options.entry, { cwd: process.cwd() });
|
|
82
142
|
const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);
|
|
83
143
|
const pageMap = /* @__PURE__ */ new Map();
|
|
84
144
|
entryFiles.forEach(({ name, file }) => {
|
|
85
|
-
|
|
145
|
+
const pageConfig = getPageConfig(
|
|
146
|
+
options.pageConfigs,
|
|
147
|
+
{
|
|
148
|
+
pageName: name,
|
|
149
|
+
filePath: file,
|
|
150
|
+
relativePath: path2.relative(process.cwd(), file),
|
|
151
|
+
strategy: void 0,
|
|
152
|
+
isMatched: false
|
|
153
|
+
},
|
|
154
|
+
log
|
|
155
|
+
);
|
|
156
|
+
const strategy = (pageConfig == null ? void 0 : pageConfig.strategy) || "default";
|
|
157
|
+
pageMap.set(name, {
|
|
158
|
+
file,
|
|
159
|
+
config: pageConfig,
|
|
160
|
+
strategy
|
|
161
|
+
});
|
|
162
|
+
if (options.buildStrategies && (pageConfig == null ? void 0 : pageConfig.strategy)) {
|
|
163
|
+
const buildStrategy = options.buildStrategies[pageConfig.strategy];
|
|
164
|
+
if (buildStrategy) {
|
|
165
|
+
applyDevStrategy(server, buildStrategy, log);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
86
168
|
});
|
|
87
169
|
const pageNames = Array.from(pageMap.keys());
|
|
88
170
|
log("Available pages:", pageNames);
|
|
89
|
-
log("Page mapping:", Object.fromEntries(pageMap));
|
|
171
|
+
log("Page mapping with configs:", Object.fromEntries(pageMap));
|
|
90
172
|
server.middlewares.use((req, res, next) => {
|
|
91
173
|
var _a;
|
|
92
174
|
const originalUrl = req.url;
|
|
@@ -107,12 +189,20 @@ function configureDevServer(server, options, log) {
|
|
|
107
189
|
log(`\u5339\u914D\u5230\u9875\u9762: ${pageName}`);
|
|
108
190
|
log(`\u53EF\u7528\u9875\u9762\u5217\u8868: ${pageNames.join(", ")}`);
|
|
109
191
|
if (pageMap.has(pageName)) {
|
|
110
|
-
const
|
|
192
|
+
const pageInfo = pageMap.get(pageName);
|
|
193
|
+
if (!pageInfo) {
|
|
194
|
+
log(`\u9875\u9762\u4FE1\u606F\u83B7\u53D6\u5931\u8D25: ${pageName}`);
|
|
195
|
+
return next();
|
|
196
|
+
}
|
|
197
|
+
const relativeEntryPath = pageInfo.file;
|
|
198
|
+
const pageConfig = pageInfo.config;
|
|
111
199
|
const entryPath = path2.resolve(process.cwd(), relativeEntryPath);
|
|
112
200
|
log(`\u9875\u9762 ${pageName} \u5BF9\u5E94\u6587\u4EF6: ${relativeEntryPath}`);
|
|
201
|
+
log(`\u9875\u9762\u914D\u7F6E:`, pageConfig);
|
|
113
202
|
if (fs.existsSync(entryPath)) {
|
|
114
203
|
log(`\u627E\u5230\u5165\u53E3\u6587\u4EF6: ${entryPath}`);
|
|
115
|
-
const
|
|
204
|
+
const templateFile = (pageConfig == null ? void 0 : pageConfig.template) || options.template;
|
|
205
|
+
const templatePath = path2.resolve(process.cwd(), templateFile);
|
|
116
206
|
if (fs.existsSync(templatePath)) {
|
|
117
207
|
let html = fs.readFileSync(templatePath, "utf-8");
|
|
118
208
|
log(`\u8BFB\u53D6\u6A21\u677F\u6587\u4EF6: ${templatePath}`);
|
|
@@ -125,8 +215,20 @@ function configureDevServer(server, options, log) {
|
|
|
125
215
|
}
|
|
126
216
|
const entryFile = `/${relativeEntryPath}`;
|
|
127
217
|
html = html.replace(new RegExp(escapeRegExp(options.placeholder), "g"), entryFile);
|
|
218
|
+
if (pageConfig == null ? void 0 : pageConfig.define) {
|
|
219
|
+
const defineScript = Object.entries(pageConfig.define).map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`).join("\n");
|
|
220
|
+
if (defineScript) {
|
|
221
|
+
const scriptTag = `<script>
|
|
222
|
+
// \u9875\u9762\u7EA7\u73AF\u5883\u53D8\u91CF
|
|
223
|
+
${defineScript}
|
|
224
|
+
</script>`;
|
|
225
|
+
html = html.replace("</head>", `${scriptTag}
|
|
226
|
+
</head>`);
|
|
227
|
+
log(`\u6CE8\u5165\u9875\u9762\u73AF\u5883\u53D8\u91CF:`, pageConfig.define);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
128
230
|
log(`\u5360\u4F4D\u7B26 ${options.placeholder} \u66FF\u6362\u4E3A: ${entryFile}`);
|
|
129
|
-
log(`\
|
|
231
|
+
log(`\u4F7F\u7528\u6A21\u677F: ${templateFile}`);
|
|
130
232
|
res.setHeader("Content-Type", "text/html");
|
|
131
233
|
res.end(html);
|
|
132
234
|
return;
|
|
@@ -148,7 +250,7 @@ function configureDevServer(server, options, log) {
|
|
|
148
250
|
import * as path3 from "node:path";
|
|
149
251
|
import * as fs2 from "node:fs";
|
|
150
252
|
import { glob as glob2 } from "glob";
|
|
151
|
-
function
|
|
253
|
+
function simpleMatch2(pattern, str) {
|
|
152
254
|
const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
|
|
153
255
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
154
256
|
return regex.test(str);
|
|
@@ -178,7 +280,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
|
|
|
178
280
|
const defaultStrategy = "default";
|
|
179
281
|
entryFiles.forEach((entryFile) => {
|
|
180
282
|
const { name, file } = entryFile;
|
|
181
|
-
const pageConfig =
|
|
283
|
+
const pageConfig = getPageConfig2(
|
|
182
284
|
options.pageConfigs,
|
|
183
285
|
{
|
|
184
286
|
pageName: name,
|
|
@@ -231,7 +333,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
|
|
|
231
333
|
};
|
|
232
334
|
}
|
|
233
335
|
}
|
|
234
|
-
function
|
|
336
|
+
function getPageConfig2(pageConfigs, context, log) {
|
|
235
337
|
if (!pageConfigs)
|
|
236
338
|
return null;
|
|
237
339
|
if (typeof pageConfigs === "function") {
|
|
@@ -249,14 +351,14 @@ function getPageConfig(pageConfigs, context, log) {
|
|
|
249
351
|
if (config.match) {
|
|
250
352
|
const patterns = Array.isArray(config.match) ? config.match : [config.match];
|
|
251
353
|
const isMatched = patterns.some(
|
|
252
|
-
(pattern) =>
|
|
354
|
+
(pattern) => simpleMatch2(pattern, context.pageName) || simpleMatch2(pattern, context.relativePath) || simpleMatch2(pattern, context.filePath)
|
|
253
355
|
);
|
|
254
356
|
if (isMatched) {
|
|
255
357
|
log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
|
|
256
358
|
return { ...config, match: void 0 };
|
|
257
359
|
}
|
|
258
360
|
}
|
|
259
|
-
if (
|
|
361
|
+
if (simpleMatch2(key, context.pageName)) {
|
|
260
362
|
log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
|
|
261
363
|
return config;
|
|
262
364
|
}
|
|
@@ -369,10 +471,77 @@ function viteMultiPage(options = {}) {
|
|
|
369
471
|
);
|
|
370
472
|
} else {
|
|
371
473
|
createDevConfig({ entry, exclude }, log);
|
|
474
|
+
if (buildStrategies || pageConfigs) {
|
|
475
|
+
const allFiles = glob3.sync(entry, { cwd: process.cwd() });
|
|
476
|
+
const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);
|
|
477
|
+
const strategiesToApply = /* @__PURE__ */ new Set();
|
|
478
|
+
entryFiles.forEach(({ name, file }) => {
|
|
479
|
+
if (typeof pageConfigs === "function") {
|
|
480
|
+
const pageConfig = pageConfigs({
|
|
481
|
+
pageName: name,
|
|
482
|
+
filePath: file,
|
|
483
|
+
relativePath: path4.relative(process.cwd(), file),
|
|
484
|
+
strategy: void 0,
|
|
485
|
+
isMatched: false
|
|
486
|
+
});
|
|
487
|
+
if (pageConfig == null ? void 0 : pageConfig.strategy) {
|
|
488
|
+
strategiesToApply.add(pageConfig.strategy);
|
|
489
|
+
}
|
|
490
|
+
} else if (pageConfigs) {
|
|
491
|
+
const pageConfig = pageConfigs[name];
|
|
492
|
+
if (pageConfig == null ? void 0 : pageConfig.strategy) {
|
|
493
|
+
strategiesToApply.add(pageConfig.strategy);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
strategiesToApply.forEach((strategyName) => {
|
|
498
|
+
const strategy = buildStrategies == null ? void 0 : buildStrategies[strategyName];
|
|
499
|
+
if (strategy) {
|
|
500
|
+
log(`\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u7B56\u7565 ${strategyName}:`, strategy);
|
|
501
|
+
if (strategy.viteConfig) {
|
|
502
|
+
const { build, ...otherViteConfig } = strategy.viteConfig;
|
|
503
|
+
Object.keys(otherViteConfig).forEach((key) => {
|
|
504
|
+
if (key !== "plugins") {
|
|
505
|
+
const configKey = key;
|
|
506
|
+
const viteConfigValue = otherViteConfig[key];
|
|
507
|
+
if (viteConfigValue && typeof viteConfigValue === "object") {
|
|
508
|
+
config[configKey] = {
|
|
509
|
+
...config[configKey] || {},
|
|
510
|
+
...viteConfigValue
|
|
511
|
+
};
|
|
512
|
+
} else {
|
|
513
|
+
config[configKey] = viteConfigValue;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
if (strategy.define) {
|
|
519
|
+
config.define = { ...config.define, ...strategy.define };
|
|
520
|
+
}
|
|
521
|
+
if (strategy.alias) {
|
|
522
|
+
config.resolve = config.resolve || {};
|
|
523
|
+
config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };
|
|
524
|
+
}
|
|
525
|
+
if (strategy.server) {
|
|
526
|
+
config.server = { ...config.server, ...strategy.server };
|
|
527
|
+
}
|
|
528
|
+
if (strategy.css) {
|
|
529
|
+
config.css = { ...config.css, ...strategy.css };
|
|
530
|
+
}
|
|
531
|
+
if (strategy.optimizeDeps) {
|
|
532
|
+
config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
372
537
|
}
|
|
373
538
|
},
|
|
374
539
|
configureServer(server) {
|
|
375
|
-
configureDevServer(
|
|
540
|
+
configureDevServer(
|
|
541
|
+
server,
|
|
542
|
+
{ entry, exclude, template, placeholder, buildStrategies, pageConfigs },
|
|
543
|
+
log
|
|
544
|
+
);
|
|
376
545
|
},
|
|
377
546
|
generateBundle() {
|
|
378
547
|
},
|
|
@@ -399,8 +568,9 @@ function viteMultiPage(options = {}) {
|
|
|
399
568
|
}
|
|
400
569
|
};
|
|
401
570
|
}
|
|
571
|
+
var src_default = viteMultiPage;
|
|
402
572
|
export {
|
|
403
|
-
|
|
573
|
+
src_default as default,
|
|
404
574
|
viteMultiPage
|
|
405
575
|
};
|
|
406
576
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\n\nexport type { MultiPageOptions };\n\nexport default function viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n }\n },\n\n configureServer(server) {\n configureDevServer(server, { entry, exclude, template, placeholder }, log);\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, string>();\n entryFiles.forEach(({ name, file }) => {\n pageMap.set(name, file);\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const relativeEntryPath = pageMap.get(pageName)!;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n const templatePath = path.resolve(process.cwd(), options.template);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`替换后包含占位符: ${html.includes(options.placeholder)}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","path","path","fs","glob","glob","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\nimport { filterEntryFiles } from './file-filter';\n\nexport type { MultiPageOptions };\n\nfunction viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n\n if (buildStrategies || pageConfigs) {\n const allFiles = glob.sync(entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);\n\n const strategiesToApply = new Set<string>();\n\n entryFiles.forEach(({ name, file }) => {\n if (typeof pageConfigs === 'function') {\n const pageConfig = pageConfigs({\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n });\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n } else if (pageConfigs) {\n const pageConfig = pageConfigs[name];\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n }\n });\n\n strategiesToApply.forEach(strategyName => {\n const strategy = buildStrategies?.[strategyName];\n if (strategy) {\n log(`开发模式应用策略 ${strategyName}:`, strategy);\n\n if (strategy.viteConfig) {\n // 解构时跳过 build 属性,因为开发模式不需要构建配置\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { build, ...otherViteConfig } = strategy.viteConfig;\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n }\n\n if (strategy.define) {\n config.define = { ...config.define, ...strategy.define };\n }\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };\n }\n if (strategy.server) {\n config.server = { ...config.server, ...strategy.server };\n }\n if (strategy.css) {\n config.css = { ...config.css, ...strategy.css };\n }\n if (strategy.optimizeDeps) {\n config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };\n }\n }\n });\n }\n }\n },\n\n configureServer(server) {\n configureDevServer(\n server,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log\n );\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\n// 默认导出\nexport default viteMultiPage;\n\n// 具名导出以支持 CommonJS 和 ESM\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { PageConfig, PageConfigFunction, PageConfigContext, BuildStrategy } from './types';\n\nfunction simpleMatch(pattern: string, text: string): boolean {\n const regexPattern = pattern\n .replace(/\\*\\*/g, '__DOUBLE_STAR__')\n .replace(/\\*/g, '[^/]*')\n .replace(/__DOUBLE_STAR__/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(text);\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined };\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyDevStrategy(\n server: ViteDevServer,\n strategy: BuildStrategy,\n log: (...args: any[]) => void\n) {\n if (!strategy) return;\n\n log('开发模式应用构建策略:', strategy);\n\n // 注意:开发服务器的配置在启动后是只读的\n // 这里主要记录配置信息,实际应用需要在插件的 config 钩子中处理\n\n if (strategy.define) {\n log('开发环境变量配置:', strategy.define);\n }\n\n if (strategy.alias) {\n log('开发别名配置:', strategy.alias);\n }\n\n if (strategy.server) {\n log('服务器配置:', strategy.server);\n }\n\n if (strategy.css) {\n log('CSS配置:', strategy.css);\n }\n\n if (strategy.optimizeDeps) {\n log('依赖优化配置:', strategy.optimizeDeps);\n }\n}\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, { file: string; config: PageConfig | null; strategy?: string }>();\n\n entryFiles.forEach(({ name, file }) => {\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || 'default';\n\n pageMap.set(name, {\n file,\n config: pageConfig,\n strategy,\n });\n\n // 如果指定了构建策略,记录配置信息\n if (options.buildStrategies && pageConfig?.strategy) {\n const buildStrategy = options.buildStrategies[pageConfig.strategy];\n if (buildStrategy) {\n applyDevStrategy(server, buildStrategy, log);\n }\n }\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping with configs:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n const pageInfo = pageMap.get(pageName);\n if (!pageInfo) {\n log(`页面信息获取失败: ${pageName}`);\n return next();\n }\n\n const relativeEntryPath = pageInfo.file;\n const pageConfig = pageInfo.config;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n log(`页面配置:`, pageConfig);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n // 根据页面配置选择模板\n const templateFile = pageConfig?.template || options.template;\n const templatePath = path.resolve(process.cwd(), templateFile);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n // 应用页面级环境变量注入\n if (pageConfig?.define) {\n // 在HTML中注入环境变量\n const defineScript = Object.entries(pageConfig.define)\n .map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`)\n .join('\\n');\n\n if (defineScript) {\n const scriptTag = `<script>\n // 页面级环境变量\n ${defineScript}\n </script>`;\n html = html.replace('</head>', `${scriptTag}\\n</head>`);\n log(`注入页面环境变量:`, pageConfig.define);\n }\n }\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`使用模板: ${templateFile}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","glob","path","path","fs","glob","simpleMatch","glob","getPageConfig","glob","options"]}
|
package/package.json
CHANGED